From d4781bd409c53438db70495911682a1d73241d0f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 19 Apr 2020 00:32:37 +0200 Subject: [PATCH 01/43] Fixed a slight mistake in the T1000 code, fixes #590. --- src/machine/m_xt_t1000.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 447354c3c..bf31be9f7 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -1024,7 +1024,7 @@ t1000_configsys_load(void) f = plat_fopen(nvr_path(L"t1000_config.nvr"), L"rb"); if (f != NULL) { size = sizeof(t1000.t1000_nvram); - if (fread(t1000.t1000_nvram, size, 1, f) != size) + if (fread(t1000.t1000_nvram, 1, size, f) != size) fatal("t1000_configsys_load(): Error reading data\n"); fclose(f); } From 5de8564fdc2d7e8ba32ad1584b057ffb6dc34271 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 19 Apr 2020 14:16:21 +0200 Subject: [PATCH 02/43] Changed the way mem_add_bios() determine if the CPU has 16-bit bus or not, fixes #667. --- src/mem.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mem.c b/src/mem.c index 459f7f6e6..25e84f593 100644 --- a/src/mem.c +++ b/src/mem.c @@ -2192,6 +2192,11 @@ mem_set_mem_state_smm(uint32_t base, uint32_t size, int state) void mem_add_bios(void) { + int temp_cpu_type, temp_cpu_16bitbus; + + temp_cpu_type = machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective].cpu_type; + temp_cpu_16bitbus = (temp_cpu_type == CPU_286 || temp_cpu_type == CPU_386SX || temp_cpu_type == CPU_486SLC || temp_cpu_type == CPU_IBM386SLC || temp_cpu_type == CPU_IBM486SLC ); + if (biosmask > 0x1ffff) { /* 256k+ BIOS'es only have low mappings at E0000-FFFFF. */ mem_mapping_add(&bios_mapping, 0xe0000, 0x20000, @@ -2212,12 +2217,12 @@ mem_add_bios(void) } if (AT) { - mem_mapping_add(&bios_high_mapping, biosaddr | (cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1, + mem_mapping_add(&bios_high_mapping, biosaddr | (temp_cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1, mem_read_bios,mem_read_biosw,mem_read_biosl, mem_write_null,mem_write_nullw,mem_write_nulll, rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0); - mem_set_mem_state(biosaddr | (cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1, + mem_set_mem_state(biosaddr | (temp_cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1, MEM_READ_ROMCS | MEM_WRITE_ROMCS); } } From cd0a57b6c3738c2e3ea24c04a11575667dedf8cb Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 19 Apr 2020 18:26:57 +0200 Subject: [PATCH 03/43] Re-added some x87 differences between the old and new recompilers, fixes #692. --- src/cpu_common/x87.c | 30 ++++++++++++++++ src/cpu_common/x87.h | 6 +++- src/cpu_common/x87_ops.h | 30 ++++++++++++++++ src/cpu_common/x87_ops_arith.h | 48 ++++++++++++------------- src/cpu_common/x87_ops_loadstore.h | 5 ++- src/cpu_common/x87_ops_misc.h | 56 +++++++++++++++++++++--------- 6 files changed, 130 insertions(+), 45 deletions(-) diff --git a/src/cpu_common/x87.c b/src/cpu_common/x87.c index 148172aab..8183f2e3e 100644 --- a/src/cpu_common/x87.c +++ b/src/cpu_common/x87.c @@ -42,6 +42,7 @@ fpu_log(const char *fmt, ...) #define X87_TAG_INVALID 2 #define X87_TAG_EMPTY 3 +#ifdef USE_NEW_DYNAREC uint16_t x87_gettag() { uint16_t ret = 0; @@ -78,6 +79,35 @@ void x87_settag(uint16_t new_tag) cpu_state.tag[c] = TAG_VALID; } } +#else +uint16_t x87_gettag() +{ + uint16_t ret = 0; + int c; + + for (c = 0; c < 8; c++) + { + if (cpu_state.tag[c] & TAG_UINT64) + ret |= 2 << (c*2); + else + ret |= (cpu_state.tag[c] << (c*2)); + } + + return ret; +} + +void x87_settag(uint16_t new_tag) +{ + cpu_state.tag[0] = new_tag & 3; + cpu_state.tag[1] = (new_tag >> 2) & 3; + cpu_state.tag[2] = (new_tag >> 4) & 3; + cpu_state.tag[3] = (new_tag >> 6) & 3; + cpu_state.tag[4] = (new_tag >> 8) & 3; + cpu_state.tag[5] = (new_tag >> 10) & 3; + cpu_state.tag[6] = (new_tag >> 12) & 3; + cpu_state.tag[7] = (new_tag >> 14) & 3; +} +#endif #ifdef ENABLE_808X_LOG diff --git a/src/cpu_common/x87.h b/src/cpu_common/x87.h index 3d240960b..106e8c23c 100644 --- a/src/cpu_common/x87.h +++ b/src/cpu_common/x87.h @@ -30,10 +30,14 @@ void x87_settag(uint16_t new_tag); #define TAG_EMPTY 0 #define TAG_VALID (1 << 0) /*Hack for FPU copy. If set then MM[].q contains the 64-bit integer loaded by FILD*/ +#ifdef USE_NEW_DYNAREC #define TAG_UINT64 (1 << 7) +#else +#define TAG_UINT64 (1 << 2) +#endif /*Old dynarec stuff.*/ -#define TAG_NOT_UINT64 0x7f +#define TAG_NOT_UINT64 0xfb #define X87_ROUNDING_NEAREST 0 #define X87_ROUNDING_DOWN 1 diff --git a/src/cpu_common/x87_ops.h b/src/cpu_common/x87_ops.h index 3b8d038cb..80560a8ae 100644 --- a/src/cpu_common/x87_ops.h +++ b/src/cpu_common/x87_ops.h @@ -98,7 +98,11 @@ static __inline void x87_push(double i) cpu_state.TOP=(cpu_state.TOP-1)&7; #endif cpu_state.ST[cpu_state.TOP&7] = i; +#ifdef USE_NEW_DYNAREC cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; +#else + cpu_state.tag[cpu_state.TOP&7] = (i == 0.0) ? TAG_VALID : 0; +#endif } static __inline void x87_push_u64(uint64_t i) @@ -117,7 +121,11 @@ static __inline void x87_push_u64(uint64_t i) cpu_state.TOP=(cpu_state.TOP-1)&7; #endif cpu_state.ST[cpu_state.TOP&7] = td.d; +#ifdef USE_NEW_DYNAREC cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; +#else + cpu_state.tag[cpu_state.TOP&7] = (td.d == 0.0) ? TAG_VALID : 0; +#endif } static __inline double x87_pop() @@ -127,6 +135,7 @@ static __inline double x87_pop() #ifdef USE_NEW_DYNAREC cpu_state.TOP++; #else + cpu_state.tag[cpu_state.TOP&7] |= TAG_UINT64; cpu_state.TOP=(cpu_state.TOP+1)&7; #endif return t; @@ -263,13 +272,22 @@ static __inline void x87_ld_frstor(int reg) cpu_state.MM[reg].q = readmemq(easeg, cpu_state.eaaddr); cpu_state.MM_w4[reg] = readmemw(easeg, cpu_state.eaaddr + 8); +#ifdef USE_NEW_DYNAREC if ((cpu_state.MM_w4[reg] == 0x5555) && (cpu_state.tag[reg] & TAG_UINT64)) +#else + if ((cpu_state.MM_w4[reg] == 0x5555) && (cpu_state.tag[reg] == 2)) +#endif { +#ifndef USE_NEW_DYNAREC + cpu_state.tag[reg] = TAG_UINT64; +#endif cpu_state.ST[reg] = (double)cpu_state.MM[reg].q; } else { +#ifdef USE_NEW_DYNAREC cpu_state.tag[reg] &= ~TAG_UINT64; +#endif cpu_state.ST[reg] = x87_ld80(); } } @@ -426,6 +444,18 @@ typedef union } while (0) #endif +#ifdef USE_NEW_DYNAREC +# define FP_TAG_VALID cpu_state.tag[cpu_state.TOP&7] = TAG_VALID +# define FP_TAG_VALID_F cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID +# define FP_TAG_DEFAULT cpu_state.tag[cpu_state.TOP&7] = TAG_VALID | TAG_UINT64 +# define FP_TAG_VALID_N cpu_state.tag[(cpu_state.TOP + 1) & 7] = TAG_VALID +#else +# define FP_TAG_VALID cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64 +# define FP_TAG_VALID_F cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64 +# define FP_TAG_DEFAULT cpu_state.tag[cpu_state.TOP] |= TAG_UINT64; +# define FP_TAG_VALID_N cpu_state.tag[(cpu_state.TOP + 1) & 7] &= ~TAG_UINT64 +#endif + #include "x87_ops_arith.h" #include "x87_ops_misc.h" #include "x87_ops_loadstore.h" diff --git a/src/cpu_common/x87_ops_arith.h b/src/cpu_common/x87_ops_arith.h index 1e7722a17..853da6678 100644 --- a/src/cpu_common/x87_ops_arith.h +++ b/src/cpu_common/x87_ops_arith.h @@ -11,7 +11,7 @@ static int opFADD ## name ## _a ## a_size(uint32_t fetchdat) \ ST(0) += use_var; \ if ((cpu_state.npxc >> 10) & 3) \ fesetround(FE_TONEAREST); \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(8); \ return 0; \ } \ @@ -48,7 +48,7 @@ static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \ SEG_CHECK_READ(cpu_state.ea_seg); \ load_var = get(); if (cpu_state.abrt) return 1; \ x87_div(ST(0), ST(0), use_var); \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(73); \ return 0; \ } \ @@ -60,7 +60,7 @@ static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \ SEG_CHECK_READ(cpu_state.ea_seg); \ load_var = get(); if (cpu_state.abrt) return 1; \ x87_div(ST(0), use_var, ST(0)); \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(73); \ return 0; \ } \ @@ -72,7 +72,7 @@ static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \ SEG_CHECK_READ(cpu_state.ea_seg); \ load_var = get(); if (cpu_state.abrt) return 1; \ ST(0) *= use_var; \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(11); \ return 0; \ } \ @@ -84,7 +84,7 @@ static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \ SEG_CHECK_READ(cpu_state.ea_seg); \ load_var = get(); if (cpu_state.abrt) return 1; \ ST(0) -= use_var; \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(8); \ return 0; \ } \ @@ -96,7 +96,7 @@ static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \ SEG_CHECK_READ(cpu_state.ea_seg); \ load_var = get(); if (cpu_state.abrt) return 1; \ ST(0) = use_var - ST(0); \ - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; \ + FP_TAG_VALID; \ CLOCK_CYCLES(8); \ return 0; \ } @@ -126,7 +126,7 @@ static int opFADD(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = ST(0) + ST(fetchdat & 7); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(8); return 0; } @@ -135,7 +135,7 @@ static int opFADDr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(8); return 0; } @@ -144,7 +144,7 @@ static int opFADDP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(8); return 0; @@ -233,7 +233,7 @@ static int opFDIV(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(0), ST(0), ST(fetchdat & 7)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(73); return 0; } @@ -242,7 +242,7 @@ static int opFDIVr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0)); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(73); return 0; } @@ -251,7 +251,7 @@ static int opFDIVP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0)); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(73); return 0; @@ -262,7 +262,7 @@ static int opFDIVR(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(0), ST(fetchdat&7), ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(73); return 0; } @@ -271,7 +271,7 @@ static int opFDIVRr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7)); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(73); return 0; } @@ -280,7 +280,7 @@ static int opFDIVRP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7)); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(73); return 0; @@ -291,7 +291,7 @@ static int opFMUL(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = ST(0) * ST(fetchdat & 7); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(16); return 0; } @@ -300,7 +300,7 @@ static int opFMULr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(16); return 0; } @@ -309,7 +309,7 @@ static int opFMULP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(16); return 0; @@ -320,7 +320,7 @@ static int opFSUB(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = ST(0) - ST(fetchdat & 7); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(8); return 0; } @@ -329,7 +329,7 @@ static int opFSUBr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(8); return 0; } @@ -338,7 +338,7 @@ static int opFSUBP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(8); return 0; @@ -349,7 +349,7 @@ static int opFSUBR(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = ST(fetchdat & 7) - ST(0); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(8); return 0; } @@ -358,7 +358,7 @@ static int opFSUBRr(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; CLOCK_CYCLES(8); return 0; } @@ -367,7 +367,7 @@ static int opFSUBRP(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; + FP_TAG_VALID_F; x87_pop(); CLOCK_CYCLES(8); return 0; diff --git a/src/cpu_common/x87_ops_loadstore.h b/src/cpu_common/x87_ops_loadstore.h index fa33171c8..4d4983962 100644 --- a/src/cpu_common/x87_ops_loadstore.h +++ b/src/cpu_common/x87_ops_loadstore.h @@ -15,7 +15,6 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. */ - static int opFILDiw_a16(uint32_t fetchdat) { int16_t temp; @@ -102,7 +101,7 @@ static int opFILDiq_a16(uint32_t fetchdat) temp64 = geteaq(); if (cpu_state.abrt) return 1; x87_push((double)temp64); cpu_state.MM[cpu_state.TOP&7].q = temp64; - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID | TAG_UINT64; + FP_TAG_DEFAULT; CLOCK_CYCLES(10); return 0; @@ -117,7 +116,7 @@ static int opFILDiq_a32(uint32_t fetchdat) temp64 = geteaq(); if (cpu_state.abrt) return 1; x87_push((double)temp64); cpu_state.MM[cpu_state.TOP&7].q = temp64; - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID | TAG_UINT64; + FP_TAG_DEFAULT; CLOCK_CYCLES(10); return 0; diff --git a/src/cpu_common/x87_ops_misc.h b/src/cpu_common/x87_ops_misc.h index a4e437744..1856a00e8 100644 --- a/src/cpu_common/x87_ops_misc.h +++ b/src/cpu_common/x87_ops_misc.h @@ -51,7 +51,11 @@ static int opFINIT(uint32_t fetchdat) codegen_set_rounding_mode(X87_ROUNDING_NEAREST); cpu_state.npxs = 0; p = (uint64_t *)cpu_state.tag; +#ifdef USE_NEW_DYNAREC *p = 0; +#else + *p = 0x0303030303030303ll; +#endif cpu_state.TOP = 0; cpu_state.ismmx = 0; CLOCK_CYCLES(17); @@ -64,7 +68,11 @@ static int opFFREE(uint32_t fetchdat) { FP_ENTER(); cpu_state.pc++; +#ifdef USE_NEW_DYNAREC cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_EMPTY; +#else + cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3; +#endif CLOCK_CYCLES(3); return 0; } @@ -141,10 +149,16 @@ static int FSTOR() /*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times something like this is needed*/ p = (uint64_t *) cpu_state.tag; +#ifdef USE_NEW_DYNAREC if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && !cpu_state.TOP && (*p == 0x0101010101010101ull)) - cpu_state.ismmx = 1; +#else + if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && + cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && + !cpu_state.TOP && !(*p)) + #endif + cpu_state.ismmx = 1; CLOCK_CYCLES((cr0 & 1) ? 34 : 44); return cpu_state.abrt; @@ -308,7 +322,11 @@ static int FSAVE() codegen_set_rounding_mode(X87_ROUNDING_NEAREST); cpu_state.npxs = 0; p = (uint64_t *)cpu_state.tag; +#ifdef USE_NEW_DYNAREC *p = 0; +#else + *p = 0x0303030303030303ll; +#endif cpu_state.TOP = 0; cpu_state.ismmx = 0; @@ -398,7 +416,7 @@ static int opFCHS(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = -ST(0); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(6); return 0; } @@ -408,7 +426,7 @@ static int opFABS(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = fabs(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(3); return 0; } @@ -429,7 +447,11 @@ static int opFXAM(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; cpu_state.npxs &= ~(C0|C1|C2|C3); +#ifdef USE_NEW_DYNAREC if (cpu_state.tag[cpu_state.TOP&7] == TAG_EMPTY) cpu_state.npxs |= (C0|C3); +#else + if (cpu_state.tag[cpu_state.TOP&7] == 3) cpu_state.npxs |= (C0|C3); +#endif else if (ST(0) == 0.0) cpu_state.npxs |= C3; else cpu_state.npxs |= C2; if (ST(0) < 0.0) cpu_state.npxs |= C1; @@ -496,7 +518,7 @@ static int opFLDZ(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; x87_push(0.0); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(4); return 0; } @@ -506,7 +528,7 @@ static int opF2XM1(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = pow(2.0, ST(0)) - 1.0; - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(200); return 0; } @@ -516,7 +538,7 @@ static int opFYL2X(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(1) = ST(1) * (log(ST(0)) / log(2.0)); - cpu_state.tag[(cpu_state.TOP + 1) & 7] = TAG_VALID; + FP_TAG_VALID_N; x87_pop(); CLOCK_CYCLES(250); return 0; @@ -527,7 +549,7 @@ static int opFYL2XP1(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(1) = ST(1) * (log1p(ST(0)) / log(2.0)); - cpu_state.tag[(cpu_state.TOP + 1) & 7] = TAG_VALID; + FP_TAG_VALID_N; x87_pop(); CLOCK_CYCLES(250); return 0; @@ -538,7 +560,7 @@ static int opFPTAN(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = tan(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; x87_push(1.0); cpu_state.npxs &= ~C2; CLOCK_CYCLES(235); @@ -550,7 +572,7 @@ static int opFPATAN(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(1) = atan2(ST(1), ST(0)); - cpu_state.tag[(cpu_state.TOP + 1) & 7] = TAG_VALID; + FP_TAG_VALID_N; x87_pop(); CLOCK_CYCLES(250); return 0; @@ -589,7 +611,7 @@ static int opFPREM(uint32_t fetchdat) cpu_state.pc++; temp64 = (int64_t)(ST(0) / ST(1)); ST(0) = ST(0) - (ST(1) * (double)temp64); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; cpu_state.npxs &= ~(C0|C1|C2|C3); if (temp64 & 4) cpu_state.npxs|=C0; if (temp64 & 2) cpu_state.npxs|=C3; @@ -605,7 +627,7 @@ static int opFPREM1(uint32_t fetchdat) cpu_state.pc++; temp64 = (int64_t)(ST(0) / ST(1)); ST(0) = ST(0) - (ST(1) * (double)temp64); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; cpu_state.npxs &= ~(C0|C1|C2|C3); if (temp64 & 4) cpu_state.npxs|=C0; if (temp64 & 2) cpu_state.npxs|=C3; @@ -620,7 +642,7 @@ static int opFSQRT(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = sqrt(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(83); return 0; } @@ -633,7 +655,7 @@ static int opFSINCOS(uint32_t fetchdat) cpu_state.pc++; td = ST(0); ST(0) = sin(td); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; x87_push(cos(td)); cpu_state.npxs &= ~C2; CLOCK_CYCLES(330); @@ -646,7 +668,7 @@ static int opFRNDINT(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = (double)x87_fround(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(21); return 0; } @@ -658,7 +680,7 @@ static int opFSCALE(uint32_t fetchdat) cpu_state.pc++; temp64 = (int64_t)ST(1); ST(0) = ST(0) * pow(2.0, (double)temp64); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; CLOCK_CYCLES(30); return 0; } @@ -669,7 +691,7 @@ static int opFSIN(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = sin(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; cpu_state.npxs &= ~C2; CLOCK_CYCLES(300); return 0; @@ -680,7 +702,7 @@ static int opFCOS(uint32_t fetchdat) FP_ENTER(); cpu_state.pc++; ST(0) = cos(ST(0)); - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; + FP_TAG_VALID; cpu_state.npxs &= ~C2; CLOCK_CYCLES(300); return 0; From 89332120593d6746aab1297d5abb826ba46e25c1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 20 Apr 2020 02:25:20 +0200 Subject: [PATCH 04/43] Fixed S3 ViRGE 24bpp 8x8 patterns. --- src/video/vid_s3_virge.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 6043f8c16..f64556d4e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -210,6 +210,7 @@ typedef struct virge_t uint32_t pattern_8[8*8]; uint32_t pattern_16[8*8]; + uint32_t pattern_24[8*8]; uint32_t pattern_32[8*8]; uint32_t prdx; @@ -1072,16 +1073,29 @@ static void fifo_thread(void *param) { int x = (fifo->addr_type & FIFO_ADDR) & 4; int y = ((fifo->addr_type & FIFO_ADDR) >> 3) & 7; + int color, xx; + int byte, addr; + virge->s3d.pattern_8[y*8 + x] = val & 0xff; virge->s3d.pattern_8[y*8 + x + 1] = val >> 8; virge->s3d.pattern_8[y*8 + x + 2] = val >> 16; virge->s3d.pattern_8[y*8 + x + 3] = val >> 24; - + x = ((fifo->addr_type & FIFO_ADDR) >> 1) & 6; y = ((fifo->addr_type & FIFO_ADDR) >> 4) & 7; virge->s3d.pattern_16[y*8 + x] = val & 0xffff; virge->s3d.pattern_16[y*8 + x + 1] = val >> 16; + addr = ((fifo->addr_type & FIFO_ADDR) & 0x00ff); + for (xx = 0; xx < 4; xx++) { + x = ((addr + xx) / 3) % 8; + y = ((addr + xx) / 24) % 8; + color = ((addr + xx) % 3) << 3; + byte = (xx << 3); + virge->s3d.pattern_24[y*8 + x] &= ~(0xff << color); + virge->s3d.pattern_24[y*8 + x] |= ((val >> byte) & 0xff) << color; + } + x = ((fifo->addr_type & FIFO_ADDR) >> 2) & 7; y = ((fifo->addr_type & FIFO_ADDR) >> 5) & 7; virge->s3d.pattern_32[y*8 + x] = val & 0xffffff; @@ -1597,6 +1611,8 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p) { int x = addr & 4; int y = (addr >> 3) & 7; + int color, xx; + int byte; virge->s3d.pattern_8[y*8 + x] = val & 0xff; virge->s3d.pattern_8[y*8 + x + 1] = val >> 8; virge->s3d.pattern_8[y*8 + x + 2] = val >> 16; @@ -1607,6 +1623,16 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p) virge->s3d.pattern_16[y*8 + x] = val & 0xffff; virge->s3d.pattern_16[y*8 + x + 1] = val >> 16; + addr &= 0x00ff; + for (xx = 0; xx < 4; xx++) { + x = ((addr + xx) / 3) % 8; + y = ((addr + xx) / 24) % 8; + color = ((addr + xx) % 3) << 3; + byte = (xx << 3); + virge->s3d.pattern_24[y*8 + x] &= ~(0xff << color); + virge->s3d.pattern_24[y*8 + x] |= ((val >> byte) & 0xff) << color; + } + x = (addr >> 2) & 7; y = (addr >> 5) & 7; virge->s3d.pattern_32[y*8 + x] = val & 0xffffff; @@ -1989,7 +2015,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) bpp = 2; x_mul = 3; cpu_dat_shift = 24; - pattern_data = virge->s3d.pattern_32; + pattern_data = virge->s3d.pattern_24; src_fg_clr = virge->s3d.src_fg_clr; src_bg_clr = virge->s3d.src_bg_clr; break; From fd8e59b6f2042190380d1dfd16f71fe5f5af930d Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 20 Apr 2020 14:50:03 +0200 Subject: [PATCH 05/43] Moved the AMI WinBIOS SiS 471 to the Dev branch because literally any such BIOS I try, has problems. Also moved the Matrox cards to the Dev branch. --- src/include/86box/machine.h | 2 ++ src/include/86box/video.h | 2 ++ src/machine/m_at_386dx_486.c | 2 ++ src/machine/machine_table.c | 46 +++++++++++++++++++----------------- src/video/vid_table.c | 2 ++ src/win/Makefile.mingw | 22 ++++++++++++++++- src/win/Makefile_ndr.mingw | 22 ++++++++++++++++- 7 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 8a3febc15..838dc9a0d 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -227,7 +227,9 @@ extern int machine_at_opti495_mr_init(const machine_t *); extern int machine_at_ami471_init(const machine_t *); extern int machine_at_dtk486_init(const machine_t *); extern int machine_at_px471_init(const machine_t *); +#if defined(DEV_BRANCH) && defined(USE_WIN471) extern int machine_at_win471_init(const machine_t *); +#endif extern int machine_at_r418_init(const machine_t *); extern int machine_at_ls486e_init(const machine_t *); diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 2ee72aefe..04f81c628 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -269,9 +269,11 @@ extern const device_t ht216_32_pb410a_device; extern const device_t im1024_device; extern const device_t pgc_device; +#if defined(DEV_BRANCH) && defined(USE_MGA) /* Matrox Mystique */ extern const device_t mystique_device; extern const device_t mystique_220_device; +#endif /* Oak OTI-0x7 */ extern const device_t oti037c_device; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index d17525025..d168aaf14 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -267,6 +267,7 @@ machine_at_px471_init(const machine_t *model) } +#if defined(DEV_BRANCH) && defined(USE_WIN471) int machine_at_win471_init(const machine_t *model) { @@ -283,6 +284,7 @@ machine_at_win471_init(const machine_t *model) return ret; } +#endif static void diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 903f2bbe7..ae8f41b08 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -61,7 +61,7 @@ const machine_t machines[] = { - //8088 Machines + /* 8088 Machines */ { "[8088] AMI XT clone", "amixt", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA, 64, 640, 64, 0, machine_xt_amixt_init, NULL }, { "[8088] Compaq Portable", "portable", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VIDEO, 128, 640, 128, 0, machine_xt_compaq_init, NULL }, { "[8088] DTK XT clone", "dtk", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA, 64, 640, 64, 0, machine_xt_dtk_init, NULL }, @@ -84,7 +84,7 @@ const machine_t machines[] = { { "[8088] Xi8088", "xi8088", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_PS2, 64, 1024, 128, 127, machine_xt_xi8088_init, xi8088_get_device }, { "[8088] Zenith Data SupersPort", "zdsupers", {{"Intel", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA, 128, 640, 128, 0, machine_xt_zenith_init, NULL }, - //8086 Machines + /* 8086 Machines */ { "[8086] Amstrad PC1512", "pc1512", {{"Intel", cpus_pc1512}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VIDEO | MACHINE_VIDEO_FIXED | MACHINE_MOUSE, 512, 640, 128, 63, machine_pc1512_init, pc1512_get_device }, { "[8086] Amstrad PC1640", "pc1640", {{"Intel", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 63, machine_pc1640_init, pc1640_get_device }, { "[8086] Amstrad PC2086", "pc2086", {{"Intel", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VIDEO | MACHINE_VIDEO_FIXED | MACHINE_MOUSE, 640, 640, 0, 63, machine_pc2086_init, pc2086_get_device }, @@ -98,10 +98,10 @@ const machine_t machines[] = { { "[8086] VTech Laser XT3", "lxt3", {{"Intel", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA, 256, 640, 256, 0, machine_xt_lxt3_init, NULL }, #endif - //286 XT machines + /* 286 XT machines */ { "[286 XT] Hedaka HED-919", "hed919", {{"", cpus_286}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA, 64, 640, 64, 0, machine_xt_hed919_init, NULL }, - //286 AT machines + /* 286 AT machines */ { "[286 ISA] AMI 286 clone", "ami286", {{"", cpus_286}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT, 512, 8192, 128, 127, machine_at_neat_ami_init, NULL }, { "[286 ISA] Award 286 clone", "award286", {{"", cpus_286}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT, 512,16384, 128, 127, machine_at_award286_init, NULL }, { "[286 ISA] Phoenix 286 clone", "px286", {{"", cpus_286}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT, 512,16384, 128, 127, machine_at_px286_init, NULL }, @@ -131,10 +131,10 @@ const machine_t machines[] = { { "[286 ISA] Samsung Deskmaster 286", "deskmaster286", {{"", cpus_286}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT, 512,16384, 128, 127, machine_at_deskmaster286_init, NULL }, - //286 machines that utilize the MCA bus + /* 286 machines that utilize the MCA bus */ { "[286 MCA] IBM PS/2 model 50", "ibmps2_m50", {{"Intel", cpus_ps2_m30_286}, {"IBM",cpus_IBM486SLC},{"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_VIDEO, 1, 10, 1, 63, machine_ps2_model_50_init, NULL }, - //386SX machines + /* 386SX machines */ { "[386SX ISA] AMA-932J", "ama932j", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_HDC | MACHINE_VIDEO, 512, 8192, 128, 127, machine_at_ama932j_init, at_ama932j_get_device }, #if defined(DEV_BRANCH) && defined(USE_AMI386SX) { "[386SX ISA] AMI Unknown 386SX", "ami386", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 512,16384, 128, 127, machine_at_headland_init, NULL }, @@ -148,29 +148,29 @@ const machine_t machines[] = { { "[386SX ISA] Goldstar 386", "goldstar386", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 512, 8192, 128, 127, machine_at_goldstar386_init, NULL }, - //386SX machines which utilize the MCA bus + /* 386SX machines which utilize the MCA bus */ { "[386SX MCA] IBM PS/2 model 55SX", "ibmps2_m55sx", {{"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}, {"IBM",cpus_IBM486SLC},{"", NULL}}, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_VIDEO, 1, 8, 1, 63, machine_ps2_model_55sx_init, NULL }, - //386DX machines + /* 386DX machines */ { "[386DX ISA] Compaq Portable III (386)", "portableiii386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_HDC | MACHINE_VIDEO, 1, 14, 1, 127, machine_at_portableiii386_init, at_cpqiii_get_device }, { "[386DX ISA] ECS 386/32", "ecs386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT, 512,16384, 512, 127, machine_at_ecs386_init, NULL }, { "[386DX ISA] Micronics 386 clone", "micronics386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 512, 8192, 128, 127, machine_at_micronics386_init, NULL }, - //386DX machines which utilize the VLB bus + /* 386DX machines which utilize the VLB bus */ { "[386DX VLB] Award 386DX clone", "award386dx", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_opti495_init, NULL }, { "[386DX VLB] Dataexpert SX495 (386DX)", "ami386dx", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_opti495_ami_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_MR495) { "[386DX VLB] MR 386DX clone", "mr386dx", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_opti495_mr_init, NULL }, #endif - //386DX machines which utilize the MCA bus + /* 386DX machines which utilize the MCA bus */ { "[386DX MCA] IBM PS/2 model 70 (type 3)", "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"IBM",cpus_IBM486BL},{"", NULL}}, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL }, { "[386DX MCA] IBM PS/2 model 80", "ibmps2_m80", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"IBM",cpus_IBM486BL},{"", NULL}}, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_VIDEO, 1, 12, 1, 63, machine_ps2_model_80_init, NULL }, - //486 machines with just the ISA slot + /* 486 machines with just the ISA slot */ { "[486 ISA] Packard Bell PB410A", "pb410a", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 4, 36, 1, 127, machine_at_pb410a_init, NULL }, - //486 machines + /* 486 machines */ { "[486 VLB] Award 486 clone", "award486", {{"Intel", cpus_i486S1}, {"AMD", cpus_Am486S1}, {"Cyrix", cpus_Cx486S1},{"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_opti495_init, NULL }, { "[486 VLB] Dataexpert SX495 (486)", "ami486", {{"Intel", cpus_i486S1}, {"AMD", cpus_Am486S1}, {"Cyrix", cpus_Cx486S1},{"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_opti495_ami_init, NULL }, { "[486 VLB] Olystar LIL1429", "ali1429", {{"Intel", cpus_i486S1}, {"AMD", cpus_Am486S1}, {"Cyrix", cpus_Cx486S1},{"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_ali1429_init, NULL }, @@ -179,7 +179,9 @@ const machine_t machines[] = { #endif { "[486 VLB] AMI SiS 471", "ami471", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_ami471_init, NULL }, { "[486 VLB] AMI WinBIOS 486", "win486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 32, 1, 127, machine_at_winbios1429_init, NULL }, +#if defined(DEV_BRANCH) && defined(USE_WIN471) { "[486 VLB] AMI WinBIOS SiS 471", "win471", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_win471_init, NULL }, +#endif { "[486 VLB] DTK PKM-0038S E-2", "dtk486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 64, 1, 127, machine_at_dtk486_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_MR495) @@ -191,14 +193,14 @@ const machine_t machines[] = { { "[486 MCA] IBM PS/2 model 70 (type 4)", "ibmps2_m70_type4", {{"Intel", cpus_i486S1}, {"AMD", cpus_Am486S1}, {"Cyrix", cpus_Cx486S1},{"", NULL}, {"", NULL}}, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_VIDEO, 2, 16, 2, 63, machine_ps2_model_70_type4_init, NULL }, #endif - //486 machines which utilize the PCI bus + /* 486 machines which utilize the PCI bus */ { "[486 PCI] ASUS PCI/I-486SP3G", "486sp3g", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 128, 1, 127, machine_at_486sp3g_init, NULL }, { "[486 PCI] Intel Classic/PCI", "alfredo", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_alfredo_init, NULL }, { "[486 PCI] Lucky Star LS-486E", "ls486e", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 128, 1, 127, machine_at_ls486e_init, NULL }, { "[486 PCI] Rise Computer R418", "r418", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_r418_init, NULL }, { "[486 PCI] Zida Tomato 4DP", "4dps", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_4dps_init, NULL }, - //Socket 4 machines + /* Socket 4 machines */ { "[Socket 4 LX] IBM Ambra DP60 PCI", "ambradp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp60_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VPP60) { "[Socket 4 LX] IBM PS/ValuePoint P60", "valuepointp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_valuepointp60_init, NULL }, @@ -206,7 +208,7 @@ const machine_t machines[] = { { "[Socket 4 LX] Intel Premiere/PCI", "revenge", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_batman_init, NULL }, { "[Socket 4 LX] Micro Star 586MC1", "586mc1", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_586mc1_init, NULL }, - //Socket 5 machines + /* Socket 5 machines */ { "[Socket 5 NX] Intel Premiere/PCI II", "plato", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_plato_init, NULL }, { "[Socket 5 NX] IBM Ambra DP90 PCI", "ambradp90", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp90_init, NULL }, { "[Socket 5 NX] Gigabyte GA-586IP", "430nx", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_430nx_init, NULL }, @@ -220,7 +222,7 @@ const machine_t machines[] = { { "[Socket 5 FX] PC Partner MB500N", "mb500n", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_mb500n_init, NULL }, { "[Socket 5 FX] President Award 430FX PCI","president", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL }, - //Socket 7 machines + /* Socket 7 machines */ { "[Socket 7-3V FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p54tp4xe_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/ATX", "thor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/EV", "endeavor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_endeavor_init, at_endeavor_get_device }, @@ -243,7 +245,7 @@ const machine_t machines[] = { { "[Socket 7 VX] Jetway J656VXD", "j656vxd", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_j656vxd_init, NULL }, { "[Socket 7 VX] PC Partner MB520N", "mb520n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_mb520n_init, NULL }, { "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL }, - // txp4 for compatibility reasons + { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, { "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL }, { "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL }, @@ -255,17 +257,17 @@ const machine_t machines[] = { { "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL }, - //Super Socket 7 machines + /* Super Socket 7 machines */ { "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL }, { "[Super 7 MVP3] FIC VA-503+", "ficva503p", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_mvp3_init, NULL }, - //Socket 8 machines + /* Socket 8 machines */ { "[Socket 8 FX] Gigabyte GA-686NX", "686nx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_686nx_init, NULL }, { "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL }, { "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL }, { "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL }, - - //Slot 1 machines + + /* Slot 1 machines */ { "[Slot 1 FX] ECS P6KFX-A", "p6kfx", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_p6kfx_init, NULL }, { "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL }, @@ -275,7 +277,7 @@ const machine_t machines[] = { { "[Slot 1 ZX] Packard Bell Bora Pro", "borapro", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_borapro_init, NULL }, - //PGA370 machines + /* PGA370 machines */ { "[Socket 370 BX] ASUS CUBX", "cubx", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_cubx_init, NULL }, { "[Socket 370 BX] A-Trend ATC7020BXII", "atc7020bxii", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_atc7020bxii_init, NULL }, { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 57f77b83e..f1f10835b 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -122,8 +122,10 @@ video_cards[] = { { "[PCI] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_pci", &s3_virge_988_pci_device }, { "[PCI] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_pci", &s3_diamond_stealth64_pci_device }, { "[PCI] Diamond Stealth 64 VRAM (S3 Vision964)", "stealth64v_pci", &s3_diamond_stealth64_964_pci_device }, +#if defined(DEV_BRANCH) && defined(USE_MGA) { "[PCI] Matrox Mystique", "mystique", &mystique_device }, { "[PCI] Matrox Mystique 220", "mystique_220", &mystique_220_device }, +#endif { "[PCI] Number Nine 9FX (S3 Trio64)", "n9_9fx_pci", &s3_9fx_pci_device }, { "[PCI] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_pci", &s3_bahamas64_pci_device }, { "[PCI] Phoenix S3 Vision864", "px_vision864_pci", &s3_phoenix_vision864_pci_device }, diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index b1da998a4..f48318b7d 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -47,6 +47,9 @@ ifeq ($(DEV_BUILD), y) ifndef LASERXT LASERXT := y endif + ifndef MGA + MGA := y + endif ifndef MR495 MR495 := y endif @@ -83,6 +86,9 @@ ifeq ($(DEV_BUILD), y) ifndef VNC VNC := y endif + ifndef WIN471 + WIN471 := y + endif ifndef XL24 XL24 := y endif @@ -102,6 +108,9 @@ else ifndef LASERXT LASERXT := n endif + ifndef MGA + MGA := n + endif ifndef MR495 MR495 := n endif @@ -135,6 +144,9 @@ else ifndef VNC VNC := n endif + ifndef WIN471 + WIN471 := n + endif ifndef XL24 XL24 := n endif @@ -414,6 +426,11 @@ OPTS += -DUSE_LASERXT DEVBROBJ += m_xt_laserxt.o endif +ifeq ($(MGA), y) +OPTS += -DUSE_MGA +DEVBROBJ += vid_mga.o +endif + ifeq ($(MR495), y) OPTS += -DUSE_MR495 endif @@ -459,6 +476,10 @@ ifeq ($(VGAWONDER), y) OPTS += -DUSE_VGAWONDER endif +ifeq ($(WIN471), y) +OPTS += -DUSE_WIN471 +endif + ifeq ($(XL24), y) OPTS += -DUSE_XL24 endif @@ -639,7 +660,6 @@ VIDOBJ := video.o \ vid_et4000.o vid_sc1502x_ramdac.o \ vid_et4000w32.o vid_stg_ramdac.o \ vid_ht216.o \ - vid_mga.o \ vid_oak_oti.o \ vid_paradise.o \ vid_ti_cf62011.o \ diff --git a/src/win/Makefile_ndr.mingw b/src/win/Makefile_ndr.mingw index 63aa78608..a5242812d 100644 --- a/src/win/Makefile_ndr.mingw +++ b/src/win/Makefile_ndr.mingw @@ -47,6 +47,9 @@ ifeq ($(DEV_BUILD), y) ifndef LASERXT LASERXT := y endif + ifndef MGA + MGA := y + endif ifndef MR495 MR495 := y endif @@ -83,6 +86,9 @@ ifeq ($(DEV_BUILD), y) ifndef VNC VNC := y endif + ifndef WIN471 + WIN471 := y + endif ifndef XL24 XL24 := y endif @@ -102,6 +108,9 @@ else ifndef LASERXT LASERXT := n endif + ifndef MGA + MGA := n + endif ifndef MR495 MR495 := n endif @@ -138,6 +147,9 @@ else ifndef VNC VNC := n endif + ifndef WIN471 + WIN471 := n + endif ifndef XL24 XL24 := n endif @@ -423,6 +435,11 @@ OPTS += -DUSE_LASERXT DEVBROBJ += m_xt_laserxt.o endif +ifeq ($(MGA), y) +OPTS += -DUSE_MGA +DEVBROBJ += vid_mga.o +endif + ifeq ($(MR495), y) OPTS += -DUSE_MR495 endif @@ -468,6 +485,10 @@ ifeq ($(VGAWONDER), y) OPTS += -DUSE_VGAWONDER endif +ifeq ($(WIN471), y) +OPTS += -DUSE_WIN471 +endif + ifeq ($(XL24), y) OPTS += -DUSE_XL24 endif @@ -643,7 +664,6 @@ VIDOBJ := video.o \ vid_et4000.o vid_sc1502x_ramdac.o \ vid_et4000w32.o vid_stg_ramdac.o \ vid_ht216.o \ - vid_mga.o \ vid_oak_oti.o \ vid_paradise.o \ vid_ti_cf62011.o \ From de15c50a5b32e5c701d15b96446a25200ac14e25 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 20 Apr 2020 14:51:25 +0200 Subject: [PATCH 06/43] Removed some excess files. --- src/x87_bak/x87.h | 58 - src/x87_bak/x87_ops.h | 2147 ------------------------------- src/x87_bak/x87_ops_arith.h | 427 ------ src/x87_bak/x87_ops_loadstore.h | 492 ------- src/x87_bak/x87_ops_misc.h | 877 ------------- 5 files changed, 4001 deletions(-) delete mode 100644 src/x87_bak/x87.h delete mode 100644 src/x87_bak/x87_ops.h delete mode 100644 src/x87_bak/x87_ops_arith.h delete mode 100644 src/x87_bak/x87_ops_loadstore.h delete mode 100644 src/x87_bak/x87_ops_misc.h diff --git a/src/x87_bak/x87.h b/src/x87_bak/x87.h deleted file mode 100644 index be30c280c..000000000 --- a/src/x87_bak/x87.h +++ /dev/null @@ -1,58 +0,0 @@ -#define C0 (1<<8) -#define C1 (1<<9) -#define C2 (1<<10) -#define C3 (1<<14) - -uint32_t x87_pc_off,x87_op_off; -uint16_t x87_pc_seg,x87_op_seg; - -static inline void x87_set_mmx() -{ -#ifdef USE_NEW_DYNAREC - cpu_state.TOP = 0; - *(uint64_t *)cpu_state.tag = 0x0101010101010101ull; - cpu_state.ismmx = 1; -#else - uint64_t *p; - cpu_state.TOP = 0; - p = (uint64_t *)cpu_state.tag; - *p = 0; - cpu_state.ismmx = 1; -#endif -} - -static inline void x87_emms() -{ -#ifdef USE_NEW_DYNAREC - *(uint64_t *)cpu_state.tag = 0; - cpu_state.ismmx = 0; -#else - uint64_t *p; - p = (uint64_t *)cpu_state.tag; - *p = 0; - cpu_state.ismmx = 0; -#endif -} - - -uint16_t x87_gettag(); -void x87_settag(uint16_t new_tag); - -#ifdef USE_NEW_DYNAREC -#define TAG_EMPTY 0 -#define TAG_VALID (1 << 0) -/*Hack for FPU copy. If set then MM[].q contains the 64-bit integer loaded by FILD*/ -#define TAG_UINT64 (1 << 7) - -#define X87_ROUNDING_NEAREST 0 -#define X87_ROUNDING_DOWN 1 -#define X87_ROUNDING_UP 2 -#define X87_ROUNDING_CHOP 3 - -void codegen_set_rounding_mode(int mode); -#else -#define TAG_EMPTY 0 -#define TAG_VALID (1 << 0) -/*Hack for FPU copy. If set then MM[].q contains the 64-bit integer loaded by FILD*/ -#define TAG_UINT64 (1 << 2) -#endif diff --git a/src/x87_bak/x87_ops.h b/src/x87_bak/x87_ops.h deleted file mode 100644 index 5e1530a23..000000000 --- a/src/x87_bak/x87_ops.h +++ /dev/null @@ -1,2147 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * x87 FPU instructions core. - * - * - * - * Authors: Fred N. van Kempen, - * Sarah Walker, - * leilei, - * Miran Grca, - * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 leilei. - * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. - */ -#include -#include -#ifdef _MSC_VER -# include -#endif -// #include "x87_timings.h" - -#ifdef ENABLE_FPU_LOG -extern void fpu_log(const char *fmt, ...); -#else -#ifndef fpu_log -#define fpu_log(fmt, ...) -#endif -#endif - -static int rounding_modes[4] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO}; - -#define ST(x) cpu_state.ST[((cpu_state.TOP+(x))&7)] - -#define STATUS_ZERODIVIDE 4 - -#ifdef FPU_8087 -#define x87_div(dst, src1, src2) do \ - { \ - if (((double)src2) == 0.0) \ - { \ - cpu_state.npxs |= STATUS_ZERODIVIDE; \ - if (cpu_state.npxc & STATUS_ZERODIVIDE) \ - dst = src1 / (double)src2; \ - else \ - { \ - fpu_log("FPU : divide by zero\n"); \ - if (!(cpu_state.npxc & 0x80)) { \ - cpu_state.npxs |= 0x80; \ - nmi = 1; \ - } \ - return 1; \ - } \ - } \ - else \ - dst = src1 / (double)src2; \ - } while (0) -#else -#define x87_div(dst, src1, src2) do \ - { \ - if (((double)src2) == 0.0) \ - { \ - cpu_state.npxs |= STATUS_ZERODIVIDE; \ - if (cpu_state.npxc & STATUS_ZERODIVIDE) \ - dst = src1 / (double)src2; \ - else \ - { \ - fpu_log("FPU : divide by zero\n"); \ - picint(1 << 13); \ - return 1; \ - } \ - } \ - else \ - dst = src1 / (double)src2; \ - } while (0) -#endif - -static __inline void x87_checkexceptions() -{ -} - -static __inline void x87_push(double i) -{ -#ifdef USE_NEW_DYNAREC - cpu_state.TOP--; - cpu_state.ST[cpu_state.TOP&7] = i; - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; -#else - cpu_state.TOP=(cpu_state.TOP-1)&7; - cpu_state.ST[cpu_state.TOP] = i; - cpu_state.tag[cpu_state.TOP&7] = (i == 0.0) ? 1 : 0; -#endif -} - -static __inline void x87_push_u64(uint64_t i) -{ - union - { - double d; - uint64_t ll; - } td; - - td.ll = i; - -#ifdef USE_NEW_DYNAREC - cpu_state.TOP--; - cpu_state.ST[cpu_state.TOP&7] = td.d; - cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; -#else - cpu_state.TOP=(cpu_state.TOP-1)&7; - cpu_state.ST[cpu_state.TOP] = td.d; - cpu_state.tag[cpu_state.TOP&7] = (td.d == 0.0) ? 1 : 0; -#endif -} - -static __inline double x87_pop() -{ -#ifdef USE_NEW_DYNAREC - double t = cpu_state.ST[cpu_state.TOP&7]; - cpu_state.tag[cpu_state.TOP&7] = TAG_EMPTY; - cpu_state.TOP++; - return t; -#else - double t = cpu_state.ST[cpu_state.TOP]; - cpu_state.tag[cpu_state.TOP&7] = 3; - cpu_state.TOP=(cpu_state.TOP+1)&7; - return t; -#endif -} - -static int old_round = FE_TONEAREST; - -static __inline int64_t x87_round_save(void) -{ - old_round = fetgetround(); -} - -static __inline int64_t x87_round_set(void) -{ - old_round = fetgetround(); - - switch ((cpu_state.npxc >> 10) & 3) { - case 0: /*Nearest*/ - fesetround(FE_TONEAREST); - break; - case 1: /*Down*/ - fesetround(FE_DOWNWARD); - break; - case 2: /*Up*/ - fesetround(FE_UPWARD); - break; - case 3: /*Chop*/ - fesetround(FE_TOWARDZERO); - break; - } -} - -static __inline int64_t x87_round_restore(void) -{ - fesetround(old_round); -} - -#ifdef PCEM_CODE -static __inline int64_t x87_fround(double b) -{ -#ifdef PCEM_CODE - int64_t a, c; -#endif - - switch ((cpu_state.npxc >> 10) & 3) - { - case 0: /*Nearest*/ -#ifdef PCEM_CODE - a = (int64_t)floor(b); - c = (int64_t)floor(b + 1.0); - if ((b - a) < (c - b)) - return a; - else if ((b - a) > (c - b)) - return c; - else - return (a & 1) ? c : a; -#else - return (int64_t)round(b); -#endif - case 1: /*Down*/ - return (int64_t)floor(b); - case 2: /*Up*/ - return (int64_t)ceil(b); - case 3: /*Chop*/ -#ifdef PCEM_CODE - return (int64_t)b; -#else - return (int64_t)trunc(b); -#endif - } - - return 0; -} -#else -static __inline int64_t x87_fround(double b) -{ - int64_t ret; - - x87_round_set(); - ret = (int64_t) rint(b); - x87_round_restore(); -} -#endif -#define BIAS80 16383 -#define BIAS64 1023 - -static __inline double x87_ld80() -{ - int64_t exp64; - int64_t blah; - int64_t exp64final; - int64_t mant64; - int64_t sign; - - struct { - int16_t begin; - union - { - double d; - uint64_t ll; - } eind; - } test; - - test.eind.ll = readmeml(easeg,cpu_state.eaaddr); - test.eind.ll |= (uint64_t)readmeml(easeg,cpu_state.eaaddr+4)<<32; - test.begin = readmemw(easeg,cpu_state.eaaddr+8); - - exp64 = (((test.begin&0x7fff) - BIAS80)); - blah = ((exp64 >0)?exp64:-exp64)&0x3ff; - exp64final = ((exp64 >0)?blah:-blah) +BIAS64; - - mant64 = (test.eind.ll >> 11) & (0xfffffffffffffll); - sign = (test.begin&0x8000)?1:0; - - if ((test.begin & 0x7fff) == 0x7fff) - exp64final = 0x7ff; - if ((test.begin & 0x7fff) == 0) - exp64final = 0; - if (test.eind.ll & 0x400) - mant64++; - - test.eind.ll = (sign <<63)|(exp64final << 52)| mant64; - - return test.eind.d; -} - -static __inline void x87_st80(double d) -{ - int64_t sign80; - int64_t exp80; - int64_t exp80final; - int64_t mant80; - int64_t mant80final; - - struct { - int16_t begin; - union - { - double d; - uint64_t ll; - } eind; - } test; - - test.eind.d=d; - - sign80 = (test.eind.ll&(0x8000000000000000ll))?1:0; - exp80 = test.eind.ll&(0x7ff0000000000000ll); - exp80final = (exp80>>52); - mant80 = test.eind.ll&(0x000fffffffffffffll); - mant80final = (mant80 << 11); - - if (exp80final == 0x7ff) /*Infinity / Nan*/ - { - exp80final = 0x7fff; - mant80final |= (0x8000000000000000ll); - } - else if (d != 0){ /* Zero is a special case */ - /* Elvira wants the 8 and tcalc doesn't */ - mant80final |= (0x8000000000000000ll); - /* Ca-cyber doesn't like this when result is zero. */ - exp80final += (BIAS80 - BIAS64); - } - test.begin = (((int16_t)sign80)<<15)| (int16_t)exp80final; - test.eind.ll = mant80final; - - writememl(easeg,cpu_state.eaaddr,test.eind.ll & 0xffffffff); - writememl(easeg,cpu_state.eaaddr+4,test.eind.ll>>32); - writememw(easeg,cpu_state.eaaddr+8,test.begin); -} - -static __inline void x87_st_fsave(int reg) -{ - reg = (cpu_state.TOP + reg) & 7; - - if (cpu_state.tag[reg] & TAG_UINT64) - { - writememl(easeg, cpu_state.eaaddr, cpu_state.MM[reg].q & 0xffffffff); - writememl(easeg, cpu_state.eaaddr + 4, cpu_state.MM[reg].q >> 32); - writememw(easeg, cpu_state.eaaddr + 8, 0x5555); - } - else - x87_st80(cpu_state.ST[reg]); -} - -static __inline void x87_ld_frstor(int reg) -{ - reg = (cpu_state.TOP + reg) & 7; - - cpu_state.MM[reg].q = readmemq(easeg, cpu_state.eaaddr); - cpu_state.MM_w4[reg] = readmemw(easeg, cpu_state.eaaddr + 8); - -#ifdef USE_NEW_DYNAREC - if ((cpu_state.MM_w4[reg] == 0x5555) && (cpu_state.tag[reg] & TAG_UINT64)) - { - cpu_state.ST[reg] = (double)cpu_state.MM[reg].q; - } - else - { - cpu_state.tag[reg] &= ~TAG_UINT64; - cpu_state.ST[reg] = x87_ld80(); - } -#else - if (cpu_state.MM_w4[reg] == 0x5555 && cpu_state.tag[reg] == 2) - { - cpu_state.tag[reg] = TAG_UINT64; - cpu_state.ST[reg] = (double)cpu_state.MM[reg].q; - } - else - cpu_state.ST[reg] = x87_ld80(); -#endif -} - -static __inline void x87_ldmmx(MMX_REG *r, uint16_t *w4) -{ - r->l[0] = readmeml(easeg, cpu_state.eaaddr); - r->l[1] = readmeml(easeg, cpu_state.eaaddr + 4); - *w4 = readmemw(easeg, cpu_state.eaaddr + 8); -} - -static __inline void x87_stmmx(MMX_REG r) -{ - writememl(easeg, cpu_state.eaaddr, r.l[0]); - writememl(easeg, cpu_state.eaaddr + 4, r.l[1]); - writememw(easeg, cpu_state.eaaddr + 8, 0xffff); -} - -#include - -static __inline uint16_t x87_compare(double a, double b) -{ -#if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86 || defined _M_X64 - uint32_t result; - double ea = a, eb = b; - const uint64_t ia = 0x3fec1a6ff866a936ull; - const uint64_t ib = 0x3fec1a6ff866a938ull; - - /* Hack to make CHKCOP happy. */ - if (!memcmp(&ea, &ia, 8) && !memcmp(&eb, &ib, 8)) - return C3; - - if (!is386 && !(cpu_state.npxc & 0x1000) && - ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))) - eb = ea; - -#ifndef _MSC_VER - /* Memory barrier, to force GCC to write to the input parameters - * before the compare rather than after */ - __asm volatile ("" : : : "memory"); - - __asm( - "fldl %2\n" - "fldl %1\n" - "fclex\n" - "fcompp\n" - "fnstsw %0\n" - : "=m" (result) - : "m" (ea), "m" (eb) - ); -#else - _ReadWriteBarrier(); - _asm - { - fld eb - fld ea - fclex - fcompp - fnstsw result - } -#endif - - return result & (C0|C2|C3); -#else - /* Generic C version is known to give incorrect results in some - * situations, eg comparison of infinity (Unreal) */ - uint32_t result = 0; - double ea = a, eb = b; - - if (!is386 && !(cpu_state.npxc & 0x1000) && - ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))) - eb = ea; - - if (ea == eb) - result |= C3; - else if (ea < eb) - result |= C0; - - return result; -#endif -} - -static __inline uint16_t x87_ucompare(double a, double b) -{ -#if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86 || defined _M_X64 || defined __amd64__ - uint32_t result; - -#ifndef _MSC_VER - /* Memory barrier, to force GCC to write to the input parameters - * before the compare rather than after */ - asm volatile ("" : : : "memory"); - - asm( - "fldl %2\n" - "fldl %1\n" - "fclex\n" - "fucompp\n" - "fnstsw %0\n" - : "=m" (result) - : "m" (a), "m" (b) - ); -#else - _ReadWriteBarrier(); - _asm - { - fld b - fld a - fclex - fcompp - fnstsw result - } -#endif - - return result & (C0|C2|C3); -#else - /* Generic C version is known to give incorrect results in some - * situations, eg comparison of infinity (Unreal) */ - uint32_t result = 0; - - if (a == b) - result |= C3; - else if (a < b) - result |= C0; - - return result; -#endif -} - -typedef union -{ - float s; - uint32_t i; -} x87_ts; - -typedef union -{ - double d; - uint64_t i; -} x87_td; - -#ifdef FPU_8087 -#define FP_ENTER() { \ - fpucount++; \ - } -#else -#define FP_ENTER() do \ - { \ - if (cr0 & 0xc) \ - { \ - x86_int(7); \ - return 1; \ - } \ - fpucount++; \ - } while (0) -#endif - -// #ifdef USE_NEW_DYNAREC -#if 1 -#define FP_TAG() cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; -#define FP_FTAG() cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = TAG_VALID; -#define FP_LSTAG() cpu_state.tag[cpu_state.TOP&7] = TAG_VALID | TAG_UINT64; -#define FP_LSQ() cpu_state.MM[cpu_state.TOP&7].q = temp64; -#define FP_LSRETQ() temp64 = cpu_state.MM[cpu_state.TOP&7].q; -#define FP_NTAG() cpu_state.tag[(cpu_state.TOP + 1) & 7] = TAG_VALID; -#ifdef USE_NEW_DYNAREC -#define FP_NNPXC() codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#else -#define FP_NNPXC() cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00) | (cpu_state.npxc & 0xc00); -#endif -#define FP_TOP(x) (x & 7) -#define FP_DTAG 0ULL -#define FP_CTAG 0x0101010101010101ull -#define FP_EMPTY TAG_EMPTY -#ifdef USE_NEW_DYNAREC -#define FP_RNPXC() codegen_set_rounding_mode(X87_ROUNDING_NEAREST); -#else -#define FP_RNPXC() cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00); -#endif -#define FP_ZTAG() cpu_state.tag[cpu_state.TOP&7] = TAG_VALID; -#define FP_DECTOP() cpu_state.TOP--; -#define FP_INCTOP() cpu_state.TOP++; -#if defined(USE_NEW_DYNAREC) || (defined(DEV_BRANCH) && (defined(USE_CYRIX_6X86) || defined(USE_I686))) -#define FP_686 -#endif -#else -#define FP_TAG() cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; -#define FP_FTAG() cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64; -#define FP_LSTAG() cpu_state.tag[cpu_state.TOP] |= TAG_UINT64; -#define FP_LSQ() cpu_state.MM[cpu_state.TOP].q = temp64; -#define FP_LSRETQ() temp64 = cpu_state.MM[cpu_state.TOP].q; -#define FP_NTAG() cpu_state.tag[(cpu_state.TOP + 1) & 7] &= ~TAG_UINT64; -#define FP_NNPXC() cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00) | (cpu_state.npxc & 0xc00); -#define FP_TOP(x) (x) -#define FP_DTAG 0x0303030303030303ll -#define FP_CTAG 0ULL -#define FP_EMPTY 3 -#define FP_RNPXC() cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00); -#define FP_ZTAG() cpu_state.tag[cpu_state.TOP&7] = 1; -#define FP_DECTOP() cpu_state.TOP = (cpu_state.TOP - 1) & 7 -#define FP_INCTOP() cpu_state.TOP = (cpu_state.TOP + 1) & 7 -#if defined(DEV_BRANCH) && (defined(USE_CYRIX_6X86) || defined(USE_I686)) -#define FP_686 -#endif -#endif - -#include "x87_ops_arith.h" -#include "x87_ops_misc.h" -#include "x87_ops_loadstore.h" - -#ifndef FPU_8087 -static int op_nofpu_a16(uint32_t fetchdat) -{ - if (cr0 & 0xc) - { - x86_int(7); - return 1; - } - else - { - fetch_ea_16(fetchdat); - return 0; - } -} -static int op_nofpu_a32(uint32_t fetchdat) -{ - if (cr0 & 0xc) - { - x86_int(7); - return 1; - } - else - { - fetch_ea_32(fetchdat); - return 0; - } -} -#endif - -#ifdef FPU_8087 -static int FPU_ILLEGAL_a16(uint32_t fetchdat) -{ - geteaw(); - wait(timing_rr, 0); - return 0; -} -#else -static int FPU_ILLEGAL_a16(uint32_t fetchdat) -{ - fetch_ea_16(fetchdat); - CLOCK_CYCLES(timing_rr); - PREFETCH_RUN(timing_rr, 2, rmdat, 0,0,0,0, 0); - return 0; -} - -static int FPU_ILLEGAL_a32(uint32_t fetchdat) -{ - fetch_ea_32(fetchdat); - CLOCK_CYCLES(timing_rr); - PREFETCH_RUN(timing_rr, 2, rmdat, 0,0,0,0, 0); - return 0; -} -#endif - -#define ILLEGAL_a16 FPU_ILLEGAL_a16 - -#ifdef FPU_8087 -const OpFn OP_TABLE(fpu_8087_d8)[32] = -{ - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADD, opFMUL, opFCOM, opFCOMP, opFSUB, opFSUBR, opFDIV, opFDIVR -}; - -const OpFn OP_TABLE(fpu_8087_d9)[256] = -{ - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFNOP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, /*Invalid*/ - opFCHS, opFABS, ILLEGAL_a16, ILLEGAL_a16, opFTST, opFXAM, ILLEGAL_a16, ILLEGAL_a16, - opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL_a16, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL_a16, ILLEGAL_a16, opFDECSTP, opFINCSTP, - opFPREM, opFYL2XP1, opFSQRT, ILLEGAL_a16, opFRNDINT, opFSCALE, ILLEGAL_a16, ILLEGAL_a16 -}; - -const OpFn OP_TABLE(fpu_8087_da)[256] = -{ - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; - -const OpFn OP_TABLE(fpu_8087_db)[256] = -{ - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFI, opFI, opFCLEX, opFINIT, ILLEGAL_a16, opFNOP, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; - -const OpFn OP_TABLE(fpu_8087_dc)[32] = -{ - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDr, opFMULr, ILLEGAL_a16, ILLEGAL_a16, opFSUBRr, opFSUBr, opFDIVRr, opFDIVr -}; - -const OpFn OP_TABLE(fpu_8087_dd)[256] = -{ - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFST, opFST, opFST, opFST, opFST, opFST, opFST, opFST, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; - -const OpFn OP_TABLE(fpu_8087_de)[256] = -{ - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, - opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, opFCOMPP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, - opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, - opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, - opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, -}; - -const OpFn OP_TABLE(fpu_8087_df)[256] = -{ - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -#else -#define ILLEGAL_a32 FPU_ILLEGAL_a32 - -const OpFn OP_TABLE(fpu_d8_a16)[32] = -{ - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16, - opFADD, opFMUL, opFCOM, opFCOMP, opFSUB, opFSUBR, opFDIV, opFDIVR -}; -const OpFn OP_TABLE(fpu_d8_a32)[32] = -{ - opFADDs_a32, opFMULs_a32, opFCOMs_a32, opFCOMPs_a32, opFSUBs_a32, opFSUBRs_a32, opFDIVs_a32, opFDIVRs_a32, - opFADDs_a32, opFMULs_a32, opFCOMs_a32, opFCOMPs_a32, opFSUBs_a32, opFSUBRs_a32, opFDIVs_a32, opFDIVRs_a32, - opFADDs_a32, opFMULs_a32, opFCOMs_a32, opFCOMPs_a32, opFSUBs_a32, opFSUBRs_a32, opFDIVs_a32, opFDIVRs_a32, - opFADD, opFMUL, opFCOM, opFCOMP, opFSUB, opFSUBR, opFDIV, opFDIVR -}; - -const OpFn OP_TABLE(fpu_287_d9_a16)[256] = -{ - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFNOP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, /*Invalid*/ - opFCHS, opFABS, ILLEGAL_a16, ILLEGAL_a16, opFTST, opFXAM, ILLEGAL_a16, ILLEGAL_a16, - opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL_a16, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL_a16, opFPREM1, opFDECSTP, opFINCSTP, - opFPREM, opFYL2XP1, opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS -}; - -const OpFn OP_TABLE(fpu_287_d9_a32)[256] = -{ - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFNOP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, /*Invalid*/ - opFCHS, opFABS, ILLEGAL_a32, ILLEGAL_a32, opFTST, opFXAM, ILLEGAL_a32, ILLEGAL_a32, - opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL_a32, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL_a32, opFPREM1, opFDECSTP, opFINCSTP, - opFPREM, opFYL2XP1, opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS -}; - -const OpFn OP_TABLE(fpu_d9_a16)[256] = -{ - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, opFSTs_a16, - opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, opFSTPs_a16, - opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, opFLDENV_a16, - opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, opFLDCW_a16, - opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, opFSTENV_a16, - opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, opFSTCW_a16, - - opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFNOP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, /*Invalid*/ - opFCHS, opFABS, ILLEGAL_a16, ILLEGAL_a16, opFTST, opFXAM, ILLEGAL_a16, ILLEGAL_a16, - opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL_a16, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL_a16, opFPREM1, opFDECSTP, opFINCSTP, - opFPREM, opFYL2XP1, opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS -}; - -const OpFn OP_TABLE(fpu_d9_a32)[256] = -{ - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, opFLDs_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, opFSTs_a32, - opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, opFSTPs_a32, - opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, opFLDENV_a32, - opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, opFLDCW_a32, - opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, opFSTENV_a32, - opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, opFSTCW_a32, - - opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, opFLD, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFNOP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, /*Invalid*/ - opFCHS, opFABS, ILLEGAL_a32, ILLEGAL_a32, opFTST, opFXAM, ILLEGAL_a32, ILLEGAL_a32, - opFLD1, opFLDL2T, opFLDL2E, opFLDPI, opFLDEG2, opFLDLN2, opFLDZ, ILLEGAL_a32, - opF2XM1, opFYL2X, opFPTAN, opFPATAN, ILLEGAL_a32, opFPREM1, opFDECSTP, opFINCSTP, - opFPREM, opFYL2XP1, opFSQRT, opFSINCOS, opFRNDINT, opFSCALE, opFSIN, opFCOS -}; - -const OpFn OP_TABLE(fpu_287_da_a16)[256] = -{ - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_287_da_a32)[256] = -{ - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -const OpFn OP_TABLE(fpu_da_a16)[256] = -{ - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, opFUCOMPP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_da_a32)[256] = -{ - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, opFUCOMPP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -#if defined(USE_NEW_DYNAREC) || (defined(DEV_BRANCH) && (defined(USE_CYRIX_6X86) || defined(USE_I686))) -const OpFn OP_TABLE(fpu_686_da_a16)[256] = -{ - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, - opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, - opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, opFCOMil_a16, - opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, opFCOMPil_a16, - opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, opFSUBil_a16, - opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, opFSUBRil_a16, - opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, opFDIVil_a16, - opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, opFDIVRil_a16, - - opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, - opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, - opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, - opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, opFUCOMPP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_686_da_a32)[256] = -{ - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, opFADDil_a32, - opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, opFMULil_a32, - opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, opFCOMil_a32, - opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, opFCOMPil_a32, - opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, opFSUBil_a32, - opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, opFSUBRil_a32, - opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, opFDIVil_a32, - opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, opFDIVRil_a32, - - opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, opFCMOVB, - opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, opFCMOVE, - opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, opFCMOVBE, - opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, opFCMOVU, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, opFUCOMPP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; -#endif - -const OpFn OP_TABLE(fpu_287_db_a16)[256] = -{ - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_287_db_a32)[256] = -{ - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -const OpFn OP_TABLE(fpu_db_a16)[256] = -{ - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_db_a32)[256] = -{ - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -#if defined(USE_NEW_DYNAREC) || (defined(DEV_BRANCH) && (defined(USE_CYRIX_6X86) || defined(USE_I686))) -const OpFn OP_TABLE(fpu_686_db_a16)[256] = -{ - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, opFISTil_a16, - opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, opFISTPil_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, opFLDe_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, opFSTPe_a16, - - opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, - opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, - opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, - opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a16, ILLEGAL_a16, - opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, - opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_686_db_a32)[256] = -{ - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, opFILDil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, opFISTil_a32, - opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, opFISTPil_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, opFLDe_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, opFSTPe_a32, - - opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, opFCMOVNB, - opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, opFCMOVNE, - opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, opFCMOVNBE, - opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, opFCMOVNU, - opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL_a32, ILLEGAL_a32, - opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, opFUCOMI, - opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, opFCOMI, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; -#endif - -const OpFn OP_TABLE(fpu_287_dc_a16)[32] = -{ - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDr, opFMULr, ILLEGAL_a16, ILLEGAL_a16, opFSUBRr, opFSUBr, opFDIVRr, opFDIVr -}; -const OpFn OP_TABLE(fpu_287_dc_a32)[32] = -{ - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDr, opFMULr, ILLEGAL_a32, ILLEGAL_a32, opFSUBRr, opFSUBr, opFDIVRr, opFDIVr -}; - -const OpFn OP_TABLE(fpu_dc_a16)[32] = -{ - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16, - opFADDr, opFMULr, opFCOM, opFCOMP, opFSUBRr, opFSUBr, opFDIVRr, opFDIVr -}; -const OpFn OP_TABLE(fpu_dc_a32)[32] = -{ - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDd_a32, opFMULd_a32, opFCOMd_a32, opFCOMPd_a32, opFSUBd_a32, opFSUBRd_a32, opFDIVd_a32, opFDIVRd_a32, - opFADDr, opFMULr, opFCOM, opFCOMP, opFSUBRr, opFSUBr, opFDIVRr, opFDIVr -}; - -const OpFn OP_TABLE(fpu_287_dd_a16)[256] = -{ - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFST, opFST, opFST, opFST, opFST, opFST, opFST, opFST, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_287_dd_a32)[256] = -{ - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFST, opFST, opFST, opFST, opFST, opFST, opFST, opFST, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -const OpFn OP_TABLE(fpu_dd_a16)[256] = -{ - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, opFSTd_a16, - opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, opFSTPd_a16, - opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, opFSTOR_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, opFSAVE_a16, - opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, opFSTSW_a16, - - opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFST, opFST, opFST, opFST, opFST, opFST, opFST, opFST, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, - opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_dd_a32)[256] = -{ - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, opFLDd_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, opFSTd_a32, - opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, opFSTPd_a32, - opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, opFSTOR_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, opFSAVE_a32, - opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, opFSTSW_a32, - - opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, opFFREE, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFST, opFST, opFST, opFST, opFST, opFST, opFST, opFST, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, opFUCOM, - opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, opFUCOMP, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -const OpFn OP_TABLE(fpu_287_de_a16)[256] = -{ - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, - opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, opFCOMPP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, - opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, - opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, - opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, -}; - -const OpFn OP_TABLE(fpu_287_de_a32)[256] = -{ - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, - opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, opFCOMPP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, - opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, - opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, - opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, -}; - -const OpFn OP_TABLE(fpu_de_a16)[256] = -{ - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, - opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, - opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, opFCOMiw_a16, - opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, opFCOMPiw_a16, - opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, opFSUBiw_a16, - opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, opFSUBRiw_a16, - opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, opFDIViw_a16, - opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, opFDIVRiw_a16, - - opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, - opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, - opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, - ILLEGAL_a16, opFCOMPP, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, - opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, - opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, - opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, -}; - -const OpFn OP_TABLE(fpu_de_a32)[256] = -{ - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, opFADDiw_a32, - opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, opFMULiw_a32, - opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, opFCOMiw_a32, - opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, opFCOMPiw_a32, - opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, opFSUBiw_a32, - opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, opFSUBRiw_a32, - opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, opFDIViw_a32, - opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, opFDIVRiw_a32, - - opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, opFADDP, - opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, opFMULP, - opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, opFCOMP, - ILLEGAL_a32, opFCOMPP, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, opFSUBRP, - opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, opFSUBP, - opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, opFDIVRP, - opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, opFDIVP, -}; - -const OpFn OP_TABLE(fpu_287_df_a16)[256] = -{ - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFSTSW_AX, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_287_df_a32)[256] = -{ - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFSTSW_AX, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -const OpFn OP_TABLE(fpu_df_a16)[256] = -{ - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTSW_AX, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_df_a32)[256] = -{ - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTSW_AX, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; - -#if defined(USE_NEW_DYNAREC) || (defined(DEV_BRANCH) && (defined(USE_CYRIX_6X86) || defined(USE_I686))) -const OpFn OP_TABLE(fpu_686_df_a16)[256] = -{ - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, opFISTiw_a16, - opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, opFISTPiw_a16, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, opFILDiq_a16, - FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, FBSTP_a16, - FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, FISTPiq_a16, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTSW_AX, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, - opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, - opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, - ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, -}; -const OpFn OP_TABLE(fpu_686_df_a32)[256] = -{ - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, opFILDiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, opFISTiw_a32, - opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, opFISTPiw_a32, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, opFILDiq_a32, - FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, FBSTP_a32, - FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, FISTPiq_a32, - - opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, opFFREEP, - opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, opFXCH, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, opFSTP, - opFSTSW_AX, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, - opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, opFUCOMIP, - opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, opFCOMIP, - ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, ILLEGAL_a32, -}; -#endif - -const OpFn OP_TABLE(nofpu_a16)[256] = -{ - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, - op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, op_nofpu_a16, -}; -const OpFn OP_TABLE(nofpu_a32)[256] = -{ - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, - op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, op_nofpu_a32, -}; -#endif - -#undef ILLEGAL diff --git a/src/x87_bak/x87_ops_arith.h b/src/x87_bak/x87_ops_arith.h deleted file mode 100644 index 133ecb689..000000000 --- a/src/x87_bak/x87_ops_arith.h +++ /dev/null @@ -1,427 +0,0 @@ -#define opFPU(name, optype, a_size, load_var, get, use_var) \ -static int opFADD ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - if ((cpu_state.npxc >> 10) & 3) \ - fesetround(rounding_modes[(cpu_state.npxc >> 10) & 3]); \ - ST(0) += use_var; \ - if ((cpu_state.npxc >> 10) & 3) \ - fesetround(FE_TONEAREST); \ - FP_TAG(); \ - CLOCK_CYCLES(8); \ - return 0; \ -} \ -static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - cpu_state.npxs &= ~(C0|C2|C3); \ - cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \ - CLOCK_CYCLES(4); \ - return 0; \ -} \ -static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - cpu_state.npxs &= ~(C0|C2|C3); \ - cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \ - x87_pop(); \ - CLOCK_CYCLES(4); \ - return 0; \ -} \ -static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - x87_div(ST(0), ST(0), use_var); \ - FP_TAG(); \ - CLOCK_CYCLES(73); \ - return 0; \ -} \ -static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - x87_div(ST(0), use_var, ST(0)); \ - FP_TAG(); \ - CLOCK_CYCLES(73); \ - return 0; \ -} \ -static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - ST(0) *= use_var; \ - FP_TAG(); \ - CLOCK_CYCLES(11); \ - return 0; \ -} \ -static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - ST(0) -= use_var; \ - FP_TAG(); \ - CLOCK_CYCLES(8); \ - return 0; \ -} \ -static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \ -{ \ - optype t; \ - FP_ENTER(); \ - fetch_ea_ ## a_size(fetchdat); \ - SEG_CHECK_READ(cpu_state.ea_seg); \ - load_var = get(); if (cpu_state.abrt) return 1; \ - ST(0) = use_var - ST(0); \ - FP_TAG(); \ - CLOCK_CYCLES(8); \ - return 0; \ -} - - -opFPU(s, x87_ts, 16, t.i, geteal, t.s) -#ifndef FPU_8087 -opFPU(s, x87_ts, 32, t.i, geteal, t.s) -#endif -opFPU(d, x87_td, 16, t.i, geteaq, t.d) -#ifndef FPU_8087 -opFPU(d, x87_td, 32, t.i, geteaq, t.d) -#endif - -opFPU(iw, uint16_t, 16, t, geteaw, (double)(int16_t)t) -#ifndef FPU_8087 -opFPU(iw, uint16_t, 32, t, geteaw, (double)(int16_t)t) -#endif -opFPU(il, uint32_t, 16, t, geteal, (double)(int32_t)t) -#ifndef FPU_8087 -opFPU(il, uint32_t, 32, t, geteal, (double)(int32_t)t) -#endif - - - - -static int opFADD(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = ST(0) + ST(fetchdat & 7); - FP_TAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFADDr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0); - FP_FTAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFADDP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(8); - return 0; -} - -static int opFCOM(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - if (ST(0) == ST(fetchdat & 7)) cpu_state.npxs |= C3; - else if (ST(0) < ST(fetchdat & 7)) cpu_state.npxs |= C0; - CLOCK_CYCLES(4); - return 0; -} - -static int opFCOMP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - cpu_state.npxs |= x87_compare(ST(0), ST(fetchdat & 7)); - x87_pop(); - CLOCK_CYCLES(4); - return 0; -} - -static int opFCOMPP(uint32_t fetchdat) -{ - uint64_t *p, *q; - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - p = (uint64_t *)&ST(0); - q = (uint64_t *)&ST(1); - if ((*p == ((uint64_t)1 << 63) && *q == 0) && is386) - cpu_state.npxs |= C0; /*Nasty hack to fix 80387 detection*/ - else - cpu_state.npxs |= x87_compare(ST(0), ST(1)); - - x87_pop(); - x87_pop(); - CLOCK_CYCLES(4); - return 0; -} -#ifndef FPU_8087 -static int opFUCOMPP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - cpu_state.npxs |= x87_ucompare(ST(0), ST(1)); - x87_pop(); - x87_pop(); - CLOCK_CYCLES(5); - return 0; -} - -#ifdef FP_686 -static int opFCOMI(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - flags_rebuild(); - cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG); - if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG; - else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG; - CLOCK_CYCLES(4); - return 0; -} -static int opFCOMIP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - flags_rebuild(); - cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG); - if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG; - else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG; - x87_pop(); - CLOCK_CYCLES(4); - return 0; -} -#endif -#endif - -static int opFDIV(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(0), ST(0), ST(fetchdat & 7)); - FP_TAG(); - CLOCK_CYCLES(73); - return 0; -} -static int opFDIVr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0)); - FP_FTAG(); - CLOCK_CYCLES(73); - return 0; -} -static int opFDIVP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0)); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(73); - return 0; -} - -static int opFDIVR(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(0), ST(fetchdat&7), ST(0)); - FP_TAG(); - CLOCK_CYCLES(73); - return 0; -} -static int opFDIVRr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7)); - FP_FTAG(); - CLOCK_CYCLES(73); - return 0; -} -static int opFDIVRP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7)); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(73); - return 0; -} - -static int opFMUL(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = ST(0) * ST(fetchdat & 7); - FP_TAG(); - CLOCK_CYCLES(16); - return 0; -} -static int opFMULr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7); - FP_FTAG(); - CLOCK_CYCLES(16); - return 0; -} -static int opFMULP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(16); - return 0; -} - -static int opFSUB(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = ST(0) - ST(fetchdat & 7); - FP_TAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFSUBr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0); - FP_FTAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFSUBP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(8); - return 0; -} - -static int opFSUBR(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = ST(fetchdat & 7) - ST(0); - FP_TAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFSUBRr(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7); - FP_FTAG(); - CLOCK_CYCLES(8); - return 0; -} -static int opFSUBRP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7); - FP_FTAG(); - x87_pop(); - CLOCK_CYCLES(8); - return 0; -} - -#ifndef FPU_8087 -static int opFUCOM(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7)); - CLOCK_CYCLES(4); - return 0; -} - -static int opFUCOMP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7)); - x87_pop(); - CLOCK_CYCLES(4); - return 0; -} - -#ifdef FP_686 -static int opFUCOMI(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - flags_rebuild(); - cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG); - if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG; - else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG; - CLOCK_CYCLES(4); - return 0; -} -static int opFUCOMIP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - flags_rebuild(); - cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG); - if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG; - else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG; - x87_pop(); - CLOCK_CYCLES(4); - return 0; -} -#endif -#endif diff --git a/src/x87_bak/x87_ops_loadstore.h b/src/x87_bak/x87_ops_loadstore.h deleted file mode 100644 index 925fe87bd..000000000 --- a/src/x87_bak/x87_ops_loadstore.h +++ /dev/null @@ -1,492 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * x87 FPU instructions core. - * - * - * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - */ - -static int opFILDiw_a16(uint32_t fetchdat) -{ - int16_t temp; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - temp = geteaw(); if (cpu_state.abrt) return 1; - x87_push((double)temp); - CLOCK_CYCLES(13); - return 0; -} -#ifndef FPU_8087 -static int opFILDiw_a32(uint32_t fetchdat) -{ - int16_t temp; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - temp = geteaw(); if (cpu_state.abrt) return 1; - x87_push((double)temp); - CLOCK_CYCLES(13); - return 0; -} -#endif - -static int opFISTiw_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteaw((int16_t)temp64); - CLOCK_CYCLES(29); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFISTiw_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteaw((int16_t)temp64); - CLOCK_CYCLES(29); - return cpu_state.abrt; -} -#endif - -static int opFISTPiw_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteaw((int16_t)temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(29); - return 0; -} -#ifndef FPU_8087 -static int opFISTPiw_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteaw((int16_t)temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(29); - return 0; -} -#endif - -static int opFILDiq_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - temp64 = geteaq(); if (cpu_state.abrt) return 1; - x87_push((double)temp64); - FP_LSQ(); - FP_LSTAG(); - - CLOCK_CYCLES(10); - return 0; -} -#ifndef FPU_8087 -static int opFILDiq_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - temp64 = geteaq(); if (cpu_state.abrt) return 1; - x87_push((double)temp64); - FP_LSQ(); - FP_LSTAG(); - - CLOCK_CYCLES(10); - return 0; -} -#endif - -static int FBSTP_a16(uint32_t fetchdat) -{ - double tempd; - int c; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - tempd = ST(0); - if (tempd < 0.0) - tempd = -tempd; - for (c = 0; c < 9; c++) - { - uint8_t tempc = (uint8_t)floor(fmod(tempd, 10.0)); - tempd -= floor(fmod(tempd, 10.0)); - tempd /= 10.0; - tempc |= ((uint8_t)floor(fmod(tempd, 10.0))) << 4; - tempd -= floor(fmod(tempd, 10.0)); - tempd /= 10.0; - writememb(easeg, cpu_state.eaaddr + c, tempc); - } - tempc = (uint8_t)floor(fmod(tempd, 10.0)); - if (ST(0) < 0.0) tempc |= 0x80; - writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1; - x87_pop(); - return 0; -} -#ifndef FPU_8087 -static int FBSTP_a32(uint32_t fetchdat) -{ - double tempd; - int c; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - tempd = ST(0); - if (tempd < 0.0) - tempd = -tempd; - for (c = 0; c < 9; c++) - { - uint8_t tempc = (uint8_t)floor(fmod(tempd, 10.0)); - tempd -= floor(fmod(tempd, 10.0)); - tempd /= 10.0; - tempc |= ((uint8_t)floor(fmod(tempd, 10.0))) << 4; - tempd -= floor(fmod(tempd, 10.0)); - tempd /= 10.0; - writememb(easeg, cpu_state.eaaddr + c, tempc); - } - tempc = (uint8_t)floor(fmod(tempd, 10.0)); - if (ST(0) < 0.0) tempc |= 0x80; - writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1; - x87_pop(); - return 0; -} -#endif - -static int FISTPiq_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - if (cpu_state.tag[cpu_state.TOP] & TAG_UINT64) - FP_LSRETQ() - else - temp64 = x87_fround(ST(0)); - seteaq(temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(29); - return 0; -} -#ifndef FPU_8087 -static int FISTPiq_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - if (cpu_state.tag[cpu_state.TOP] & TAG_UINT64) - FP_LSRETQ() - else - temp64 = x87_fround(ST(0)); - seteaq(temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(29); - return 0; -} -#endif - -static int opFILDil_a16(uint32_t fetchdat) -{ - int32_t templ; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - templ = geteal(); if (cpu_state.abrt) return 1; - x87_push((double)templ); - CLOCK_CYCLES(9); - return 0; -} -#ifndef FPU_8087 -static int opFILDil_a32(uint32_t fetchdat) -{ - int32_t templ; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - templ = geteal(); if (cpu_state.abrt) return 1; - x87_push((double)templ); - CLOCK_CYCLES(9); - return 0; -} -#endif - -static int opFISTil_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteal((int32_t)temp64); - CLOCK_CYCLES(28); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFISTil_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteal((int32_t)temp64); - CLOCK_CYCLES(28); - return cpu_state.abrt; -} -#endif - -static int opFISTPil_a16(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteal((int32_t)temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(28); - return 0; -} -#ifndef FPU_8087 -static int opFISTPil_a32(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - temp64 = x87_fround(ST(0)); - seteal((int32_t)temp64); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(28); - return 0; -} -#endif - -static int opFLDe_a16(uint32_t fetchdat) -{ - double t; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - t=x87_ld80(); if (cpu_state.abrt) return 1; - x87_push(t); - CLOCK_CYCLES(6); - return 0; -} -#ifndef FPU_8087 -static int opFLDe_a32(uint32_t fetchdat) -{ - double t; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - t=x87_ld80(); if (cpu_state.abrt) return 1; - x87_push(t); - CLOCK_CYCLES(6); - return 0; -} -#endif - -static int opFSTPe_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - x87_st80(ST(0)); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(6); - return 0; -} -#ifndef FPU_8087 -static int opFSTPe_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - x87_st80(ST(0)); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(6); - return 0; -} -#endif - -static int opFLDd_a16(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - t.i = geteaq(); if (cpu_state.abrt) return 1; - x87_push(t.d); - CLOCK_CYCLES(3); - return 0; -} -#ifndef FPU_8087 -static int opFLDd_a32(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - t.i = geteaq(); if (cpu_state.abrt) return 1; - x87_push(t.d); - CLOCK_CYCLES(3); - return 0; -} -#endif - -static int opFSTd_a16(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - t.d = ST(0); - seteaq(t.i); - CLOCK_CYCLES(8); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTd_a32(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - t.d = ST(0); - seteaq(t.i); - CLOCK_CYCLES(8); - return cpu_state.abrt; -} -#endif - -static int opFSTPd_a16(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - t.d = ST(0); - seteaq(t.i); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(8); - return 0; -} -#ifndef FPU_8087 -static int opFSTPd_a32(uint32_t fetchdat) -{ - x87_td t; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - t.d = ST(0); - seteaq(t.i); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(8); - return 0; -} -#endif - -static int opFLDs_a16(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - ts.i = geteal(); if (cpu_state.abrt) return 1; - x87_push((double)ts.s); - CLOCK_CYCLES(3); - return 0; -} -#ifndef FPU_8087 -static int opFLDs_a32(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - ts.i = geteal(); if (cpu_state.abrt) return 1; - x87_push((double)ts.s); - CLOCK_CYCLES(3); - return 0; -} -#endif - -static int opFSTs_a16(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - ts.s = (float)ST(0); - seteal(ts.i); - CLOCK_CYCLES(7); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTs_a32(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - ts.s = (float)ST(0); - seteal(ts.i); - CLOCK_CYCLES(7); - return cpu_state.abrt; -} -#endif - -static int opFSTPs_a16(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - ts.s = (float)ST(0); - seteal(ts.i); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(7); - return 0; -} -#ifndef FPU_8087 -static int opFSTPs_a32(uint32_t fetchdat) -{ - x87_ts ts; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - ts.s = (float)ST(0); - seteal(ts.i); if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(7); - return 0; -} -#endif diff --git a/src/x87_bak/x87_ops_misc.h b/src/x87_bak/x87_ops_misc.h deleted file mode 100644 index 406c6c86d..000000000 --- a/src/x87_bak/x87_ops_misc.h +++ /dev/null @@ -1,877 +0,0 @@ -#ifdef FPU_8087 -static int opFI(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxc &= ~0x80; - if (rmdat == 0xe1) - cpu_state.npxc |= 0x80; - wait(3, 0); - return 0; -} -#else -static int opFSTSW_AX(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - AX = cpu_state.npxs; - CLOCK_CYCLES(3); - return 0; -} -#endif - - -static int opFNOP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - CLOCK_CYCLES(4); - return 0; -} - -static int opFCLEX(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= 0xff00; - CLOCK_CYCLES(4); - return 0; -} - -static int opFINIT(uint32_t fetchdat) -{ - uint64_t *p; - FP_ENTER(); - cpu_state.pc++; -#ifdef FPU_8087 - cpu_state.npxc = 0x3FF; -#else - cpu_state.npxc = 0x37F; -#endif - FP_RNPXC(); - cpu_state.npxs = 0; - p = (uint64_t *)cpu_state.tag; - *p = FP_DTAG; - cpu_state.TOP = 0; - cpu_state.ismmx = 0; - CLOCK_CYCLES(17); - CPU_BLOCK_END(); - return 0; -} - - -static int opFFREE(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = FP_EMPTY; - CLOCK_CYCLES(3); - return 0; -} - -static int opFFREEP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = FP_EMPTY; if (cpu_state.abrt) return 1; - x87_pop(); - CLOCK_CYCLES(3); - return 0; -} - -static int opFST(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7]; - CLOCK_CYCLES(3); - return 0; -} - -static int opFSTP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(fetchdat & 7) = ST(0); - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7]; - x87_pop(); - CLOCK_CYCLES(3); - return 0; -} - - - - -static int FSTOR() -{ - uint64_t *p; - FP_ENTER(); - switch ((cr0 & 1) | (cpu_state.op32 & 0x100)) - { - case 0x000: /*16-bit real mode*/ - case 0x001: /*16-bit protected mode*/ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); - FP_NNPXC(); - cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+2); - x87_settag(readmemw(easeg, cpu_state.eaaddr+4)); - cpu_state.TOP = (cpu_state.npxs >> 11) & 7; - cpu_state.eaaddr += 14; - break; - case 0x100: /*32-bit real mode*/ - case 0x101: /*32-bit protected mode*/ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); - FP_NNPXC(); - cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+4); - x87_settag(readmemw(easeg, cpu_state.eaaddr+8)); - cpu_state.TOP = (cpu_state.npxs >> 11) & 7; - cpu_state.eaaddr += 28; - break; - } - x87_ld_frstor(0); cpu_state.eaaddr += 10; - x87_ld_frstor(1); cpu_state.eaaddr += 10; - x87_ld_frstor(2); cpu_state.eaaddr += 10; - x87_ld_frstor(3); cpu_state.eaaddr += 10; - x87_ld_frstor(4); cpu_state.eaaddr += 10; - x87_ld_frstor(5); cpu_state.eaaddr += 10; - x87_ld_frstor(6); cpu_state.eaaddr += 10; - x87_ld_frstor(7); - - cpu_state.ismmx = 0; - /*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times - something like this is needed*/ - p = (uint64_t *)cpu_state.tag; - if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && - cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && - !cpu_state.TOP && (*p == FP_CTAG)) - cpu_state.ismmx = 1; - - CLOCK_CYCLES((cr0 & 1) ? 34 : 44); - return cpu_state.abrt; -} -static int opFSTOR_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - FSTOR(); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTOR_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - FSTOR(); - return cpu_state.abrt; -} -#endif - -static int FSAVE() -{ - uint64_t *p; - - FP_ENTER(); - cpu_state.npxs = (cpu_state.npxs & ~(7 << 11)) | (FP_TOP(cpu_state.TOP) << 11); - - switch ((cr0 & 1) | (cpu_state.op32 & 0x100)) - { - case 0x000: /*16-bit real mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+4,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+6,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+10,x87_op_off); - cpu_state.eaaddr+=14; - if (cpu_state.ismmx) - { - x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[7]); - } - else - { - x87_st_fsave(0); cpu_state.eaaddr+=10; - x87_st_fsave(1); cpu_state.eaaddr+=10; - x87_st_fsave(2); cpu_state.eaaddr+=10; - x87_st_fsave(3); cpu_state.eaaddr+=10; - x87_st_fsave(4); cpu_state.eaaddr+=10; - x87_st_fsave(5); cpu_state.eaaddr+=10; - x87_st_fsave(6); cpu_state.eaaddr+=10; - x87_st_fsave(7); - } - break; - case 0x001: /*16-bit protected mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+4,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+6,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+8,x87_pc_seg); - writememw(easeg,cpu_state.eaaddr+10,x87_op_off); - writememw(easeg,cpu_state.eaaddr+12,x87_op_seg); - cpu_state.eaaddr+=14; - if (cpu_state.ismmx) - { - x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[7]); - } - else - { - x87_st_fsave(0); cpu_state.eaaddr+=10; - x87_st_fsave(1); cpu_state.eaaddr+=10; - x87_st_fsave(2); cpu_state.eaaddr+=10; - x87_st_fsave(3); cpu_state.eaaddr+=10; - x87_st_fsave(4); cpu_state.eaaddr+=10; - x87_st_fsave(5); cpu_state.eaaddr+=10; - x87_st_fsave(6); cpu_state.eaaddr+=10; - x87_st_fsave(7); - } - break; - case 0x100: /*32-bit real mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+8,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+12,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+20,x87_op_off); - writememl(easeg,cpu_state.eaaddr+24,(x87_op_off>>16)<<12); - cpu_state.eaaddr+=28; - if (cpu_state.ismmx) - { - x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[7]); - } - else - { - x87_st_fsave(0); cpu_state.eaaddr+=10; - x87_st_fsave(1); cpu_state.eaaddr+=10; - x87_st_fsave(2); cpu_state.eaaddr+=10; - x87_st_fsave(3); cpu_state.eaaddr+=10; - x87_st_fsave(4); cpu_state.eaaddr+=10; - x87_st_fsave(5); cpu_state.eaaddr+=10; - x87_st_fsave(6); cpu_state.eaaddr+=10; - x87_st_fsave(7); - } - break; - case 0x101: /*32-bit protected mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+8,x87_gettag()); - writememl(easeg,cpu_state.eaaddr+12,x87_pc_off); - writememl(easeg,cpu_state.eaaddr+16,x87_pc_seg); - writememl(easeg,cpu_state.eaaddr+20,x87_op_off); - writememl(easeg,cpu_state.eaaddr+24,x87_op_seg); - cpu_state.eaaddr+=28; - if (cpu_state.ismmx) - { - x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10; - x87_stmmx(cpu_state.MM[7]); - } - else - { - x87_st_fsave(0); cpu_state.eaaddr+=10; - x87_st_fsave(1); cpu_state.eaaddr+=10; - x87_st_fsave(2); cpu_state.eaaddr+=10; - x87_st_fsave(3); cpu_state.eaaddr+=10; - x87_st_fsave(4); cpu_state.eaaddr+=10; - x87_st_fsave(5); cpu_state.eaaddr+=10; - x87_st_fsave(6); cpu_state.eaaddr+=10; - x87_st_fsave(7); - } - break; - } - - cpu_state.npxc = 0x37F; - FP_RNPXC(); - cpu_state.npxs = 0; - p = (uint64_t *)cpu_state.tag; - *p = FP_DTAG; - cpu_state.TOP = 0; - cpu_state.ismmx = 0; - - CLOCK_CYCLES((cr0 & 1) ? 56 : 67); - return cpu_state.abrt; -} -static int opFSAVE_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - FSAVE(); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSAVE_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - FSAVE(); - return cpu_state.abrt; -} -#endif - -static int opFSTSW_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - seteaw((cpu_state.npxs & 0xC7FF) | (FP_TOP(cpu_state.TOP) << 11)); - CLOCK_CYCLES(3); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTSW_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - seteaw((cpu_state.npxs & 0xC7FF) | (FP_TOP(cpu_state.TOP) << 11)); - CLOCK_CYCLES(3); - return cpu_state.abrt; -} -#endif - - -static int opFLD(uint32_t fetchdat) -{ - int old_tag; - uint64_t old_i64; - - FP_ENTER(); - cpu_state.pc++; - old_tag = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7]; - old_i64 = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; - x87_push(ST(fetchdat&7)); - cpu_state.tag[FP_TOP(cpu_state.TOP)] = old_tag; - cpu_state.MM[FP_TOP(cpu_state.TOP)].q = old_i64; - CLOCK_CYCLES(4); - return 0; -} - -static int opFXCH(uint32_t fetchdat) -{ - double td; - uint8_t old_tag; - uint64_t old_i64; - FP_ENTER(); - cpu_state.pc++; - td = ST(0); - ST(0) = ST(fetchdat&7); - ST(fetchdat&7) = td; - old_tag = cpu_state.tag[FP_TOP(cpu_state.TOP)]; - cpu_state.tag[FP_TOP(cpu_state.TOP)] = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7]; - cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = old_tag; - old_i64 = cpu_state.MM[FP_TOP(cpu_state.TOP)].q; - cpu_state.MM[FP_TOP(cpu_state.TOP)].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; - cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q = old_i64; - - CLOCK_CYCLES(4); - return 0; -} - -static int opFCHS(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = -ST(0); - FP_TAG(); - CLOCK_CYCLES(6); - return 0; -} - -static int opFABS(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = fabs(ST(0)); - FP_TAG(); - CLOCK_CYCLES(3); - return 0; -} - -static int opFTST(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C2|C3); - if (ST(0) == 0.0) cpu_state.npxs |= C3; - else if (ST(0) < 0.0) cpu_state.npxs |= C0; - CLOCK_CYCLES(4); - return 0; -} - -static int opFXAM(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - cpu_state.npxs &= ~(C0|C1|C2|C3); - if (cpu_state.tag[cpu_state.TOP&7] == FP_EMPTY) cpu_state.npxs |= (C0|C3); - else if (ST(0) == 0.0) cpu_state.npxs |= C3; - else cpu_state.npxs |= C2; - if (ST(0) < 0.0) cpu_state.npxs |= C1; - CLOCK_CYCLES(8); - return 0; -} - -static int opFLD1(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(1.0); - CLOCK_CYCLES(4); - return 0; -} - -static int opFLDL2T(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(3.3219280948873623); - CLOCK_CYCLES(8); - return 0; -} - -static int opFLDL2E(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(1.4426950408889634); - CLOCK_CYCLES(8); - return 0; -} - -static int opFLDPI(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(3.141592653589793); - CLOCK_CYCLES(8); - return 0; -} - -static int opFLDEG2(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(0.3010299956639812); - CLOCK_CYCLES(8); - return 0; -} - -static int opFLDLN2(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push_u64(0x3fe62e42fefa39f0ull); - CLOCK_CYCLES(8); - return 0; -} - -static int opFLDZ(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - x87_push(0.0); - FP_ZTAG(); - CLOCK_CYCLES(4); - return 0; -} - -static int opF2XM1(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = pow(2.0, ST(0)) - 1.0; - FP_TAG(); - CLOCK_CYCLES(200); - return 0; -} - -static int opFYL2X(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(1) = ST(1) * (log(ST(0)) / log(2.0)); - FP_NTAG(); - x87_pop(); - CLOCK_CYCLES(250); - return 0; -} - -static int opFYL2XP1(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(1) = ST(1) * (log(ST(0)+1.0) / log(2.0)); - FP_NTAG(); - x87_pop(); - CLOCK_CYCLES(250); - return 0; -} - -static int opFPTAN(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = tan(ST(0)); - FP_TAG(); - x87_push(1.0); - cpu_state.npxs &= ~C2; - CLOCK_CYCLES(235); - return 0; -} - -static int opFPATAN(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(1) = atan2(ST(1), ST(0)); - FP_NTAG(); - x87_pop(); - CLOCK_CYCLES(250); - return 0; -} - -static int opFDECSTP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - FP_DECTOP(); - CLOCK_CYCLES(4); - return 0; -} - -static int opFINCSTP(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - FP_INCTOP(); - CLOCK_CYCLES(4); - return 0; -} - -static int opFPREM(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - cpu_state.pc++; - temp64 = (int64_t)(ST(0) / ST(1)); - ST(0) = ST(0) - (ST(1) * (double)temp64); - FP_TAG(); - cpu_state.npxs &= ~(C0|C1|C2|C3); - if (temp64 & 4) cpu_state.npxs|=C0; - if (temp64 & 2) cpu_state.npxs|=C3; - if (temp64 & 1) cpu_state.npxs|=C1; - CLOCK_CYCLES(100); - return 0; -} -#ifndef FPU_8087 -static int opFPREM1(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - cpu_state.pc++; - temp64 = (int64_t)(ST(0) / ST(1)); - ST(0) = ST(0) - (ST(1) * (double)temp64); - FP_TAG(); - cpu_state.npxs &= ~(C0|C1|C2|C3); - if (temp64 & 4) cpu_state.npxs|=C0; - if (temp64 & 2) cpu_state.npxs|=C3; - if (temp64 & 1) cpu_state.npxs|=C1; - CLOCK_CYCLES(100); - return 0; -} -#endif - -static int opFSQRT(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = sqrt(ST(0)); - FP_TAG(); - CLOCK_CYCLES(83); - return 0; -} - -#ifndef FPU_8087 -static int opFSINCOS(uint32_t fetchdat) -{ - double td; - FP_ENTER(); - cpu_state.pc++; - td = ST(0); - ST(0) = sin(td); - FP_TAG(); - x87_push(cos(td)); - cpu_state.npxs &= ~C2; - CLOCK_CYCLES(330); - return 0; -} -#endif - -static int opFRNDINT(uint32_t fetchdat) -{ - double rounded; - FP_ENTER(); - cpu_state.pc++; - rounded = (double) x87_fround(ST(0)); -#ifndef PCEM_CODE - if (rounded > ST(0)) - cpu_state.npxs |= C1; - else - cpu_state.npxs &= ~C1; -#endif - ST(0) = rounded; - FP_TAG(); - CLOCK_CYCLES(21); - return 0; -} - -static int opFSCALE(uint32_t fetchdat) -{ - int64_t temp64; - FP_ENTER(); - cpu_state.pc++; - temp64 = (int64_t)ST(1); - ST(0) = ST(0) * pow(2.0, (double)temp64); - FP_TAG(); - CLOCK_CYCLES(30); - return 0; -} - -#ifndef FPU_8087 -static int opFSIN(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = sin(ST(0)); - FP_TAG(); - cpu_state.npxs &= ~C2; - CLOCK_CYCLES(300); - return 0; -} - -static int opFCOS(uint32_t fetchdat) -{ - FP_ENTER(); - cpu_state.pc++; - ST(0) = cos(ST(0)); - FP_TAG(); - cpu_state.npxs &= ~C2; - CLOCK_CYCLES(300); - return 0; -} -#endif - - -static int FLDENV() -{ - FP_ENTER(); - switch ((cr0 & 1) | (cpu_state.op32 & 0x100)) - { - case 0x000: /*16-bit real mode*/ - case 0x001: /*16-bit protected mode*/ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); - FP_NNPXC(); - cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+2); - x87_settag(readmemw(easeg, cpu_state.eaaddr+4)); - cpu_state.TOP = (cpu_state.npxs >> 11) & 7; - break; - case 0x100: /*32-bit real mode*/ - case 0x101: /*32-bit protected mode*/ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); - FP_NNPXC(); - cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+4); - x87_settag(readmemw(easeg, cpu_state.eaaddr+8)); - cpu_state.TOP = (cpu_state.npxs >> 11) & 7; - break; - } - CLOCK_CYCLES((cr0 & 1) ? 34 : 44); - return cpu_state.abrt; -} - -static int opFLDENV_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - FLDENV(); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFLDENV_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - FLDENV(); - return cpu_state.abrt; -} -#endif - -static int opFLDCW_a16(uint32_t fetchdat) -{ - uint16_t tempw; - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - tempw = geteaw(); - if (cpu_state.abrt) return 1; - cpu_state.npxc = tempw; - FP_NNPXC(); - CLOCK_CYCLES(4); - return 0; -} -#ifndef FPU_8087 -static int opFLDCW_a32(uint32_t fetchdat) -{ - uint16_t tempw; - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_READ(cpu_state.ea_seg); - tempw = geteaw(); - if (cpu_state.abrt) return 1; - cpu_state.npxc = tempw; - FP_NNPXC(); - CLOCK_CYCLES(4); - return 0; -} -#endif - -static int FSTENV() -{ - FP_ENTER(); - switch ((cr0 & 1) | (cpu_state.op32 & 0x100)) - { - case 0x000: /*16-bit real mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+4,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+6,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+10,x87_op_off); - break; - case 0x001: /*16-bit protected mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+4,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+6,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+8,x87_pc_seg); - writememw(easeg,cpu_state.eaaddr+10,x87_op_off); - writememw(easeg,cpu_state.eaaddr+12,x87_op_seg); - break; - case 0x100: /*32-bit real mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+8,x87_gettag()); - writememw(easeg,cpu_state.eaaddr+12,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+20,x87_op_off); - writememl(easeg,cpu_state.eaaddr+24,(x87_op_off>>16)<<12); - break; - case 0x101: /*32-bit protected mode*/ - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs); - writememw(easeg,cpu_state.eaaddr+8,x87_gettag()); - writememl(easeg,cpu_state.eaaddr+12,x87_pc_off); - writememl(easeg,cpu_state.eaaddr+16,x87_pc_seg); - writememl(easeg,cpu_state.eaaddr+20,x87_op_off); - writememl(easeg,cpu_state.eaaddr+24,x87_op_seg); - break; - } - CLOCK_CYCLES((cr0 & 1) ? 56 : 67); - return cpu_state.abrt; -} - -static int opFSTENV_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - FSTENV(); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTENV_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - FSTENV(); - return cpu_state.abrt; -} -#endif - -static int opFSTCW_a16(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_16(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - seteaw(cpu_state.npxc); - CLOCK_CYCLES(3); - return cpu_state.abrt; -} -#ifndef FPU_8087 -static int opFSTCW_a32(uint32_t fetchdat) -{ - FP_ENTER(); - fetch_ea_32(fetchdat); - SEG_CHECK_WRITE(cpu_state.ea_seg); - seteaw(cpu_state.npxc); - CLOCK_CYCLES(3); - return cpu_state.abrt; -} -#endif - -#ifndef FPU_8087 -#ifdef FP_686 -#define opFCMOV(condition) \ - static int opFCMOV ## condition(uint32_t fetchdat) \ - { \ - FP_ENTER(); \ - cpu_state.pc++; \ - if (cond_ ## condition) \ - { \ - cpu_state.tag[FP_TOP(cpu_state.TOP)] = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7]; \ - cpu_state.MM[FP_TOP(cpu_state.TOP)].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; \ - ST(0) = ST(fetchdat & 7); \ - } \ - CLOCK_CYCLES(4); \ - return 0; \ - } - -#define cond_U ( PF_SET()) -#define cond_NU (!PF_SET()) - -opFCMOV(B) -opFCMOV(E) -opFCMOV(BE) -opFCMOV(U) -opFCMOV(NB) -opFCMOV(NE) -opFCMOV(NBE) -opFCMOV(NU) -#endif -#endif From 9a287c31e5a6e99b615e8828044daf8bdce8f284 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 20 Apr 2020 14:52:07 +0200 Subject: [PATCH 07/43] Removed network.rar. --- src/network.rar | Bin 204438 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/network.rar diff --git a/src/network.rar b/src/network.rar deleted file mode 100644 index 363c66769d7f4811f61e70b7541bb22fe308816f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204438 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%0Aua)vJz@N@2l=)_ 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 O?LzORr-^d|2>2hUPd!fn From 2de9a3f37aa9f8f2e18a36c653e43a340da0fb5c Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 20 Apr 2020 19:02:13 +0200 Subject: [PATCH 08/43] Set Link State from VBox to 86Box implemented on the PCnet card (any other nics don't have it and will simply return NULL). The PCnet-based Racal nic now has its own OID to make its drivers happy (according to VBox). --- src/include/86box/network.h | 4 +- src/network/net_3c503.c | 2 +- src/network/net_ne2000.c | 2 +- src/network/net_pcap.c | 2 +- src/network/net_pcnet.c | 258 +++++++++++++++++++++++++++--------- src/network/net_slirp.c | 2 +- src/network/net_wd8003.c | 2 +- src/network/network.c | 3 +- 8 files changed, 203 insertions(+), 72 deletions(-) diff --git a/src/include/86box/network.h b/src/include/86box/network.h index 39dbe49bc..9a0916382 100644 --- a/src/include/86box/network.h +++ b/src/include/86box/network.h @@ -66,6 +66,7 @@ enum { typedef void (*NETRXCB)(void *, uint8_t *, int); typedef int (*NETWAITCB)(void *); +typedef int (*NETSETLINKSTATE)(void *); typedef struct { @@ -76,6 +77,7 @@ typedef struct { int (*poll)(void *); NETRXCB rx; NETWAITCB wait; + NETSETLINKSTATE set_link_state; } netcard_t; typedef struct { @@ -101,7 +103,7 @@ extern void network_busy(uint8_t set); extern void network_end(void); extern void network_init(void); -extern void network_attach(void *, uint8_t *, NETRXCB, NETWAITCB); +extern void network_attach(void *, uint8_t *, NETRXCB, NETWAITCB, NETSETLINKSTATE); extern void network_close(void); extern void network_reset(void); extern int network_available(void); diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index b983ca3a3..c75c07353 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -617,7 +617,7 @@ threec503_nic_init(const device_t *info) dev->regs.gacfr = 0x09; /* Start with RAM mapping enabled. */ /* Attach ourselves to the network module. */ - network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL); + network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL, NULL); return(dev); } diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 6649db62c..5158673c1 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -1469,7 +1469,7 @@ nic_init(const device_t *info) nic_reset(dev); /* Attach ourselves to the network module. */ - network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL); + network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL, NULL); nelog(1, "%s: %s attached IO=0x%X IRQ=%d\n", dev->name, dev->is_pci?"PCI":"ISA", dev->base_address, dev->base_irq); diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c index 21a43190b..beba36ca9 100644 --- a/src/network/net_pcap.c +++ b/src/network/net_pcap.c @@ -184,7 +184,7 @@ poll_thread(void *arg) if (pcap == NULL) break; /* Wait for the next packet to arrive. */ - if (network_get_wait() || (poll_card->wait && poll_card->wait(poll_card->priv))) + if (network_get_wait() || (poll_card->set_link_state && poll_card->set_link_state(poll_card->priv)) || (poll_card->wait && poll_card->wait(poll_card->priv))) data = NULL; else data = (uint8_t *)f_pcap_next((void *)pcap, &h); diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index f7cf2a5dc..777858624 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -64,10 +64,12 @@ typedef struct RTNETETHERHDR #define MII_MAX_REG 32 #define CSR_MAX_REG 128 +/** Maximum number of times we report a link down to the guest (failure to send frame) */ +#define PCNET_MAX_LINKDOWN_REPORTED 3 + /** Maximum frame size we handle */ #define MAX_FRAME 1536 - /** @name Bus configuration registers * @{ */ #define BCR_MSRDA 0 @@ -230,9 +232,16 @@ typedef struct { /** Error counter for bad receive descriptors. */ uint32_t uCntBadRMD; uint16_t u16CSR0LastSeenByGuest; - uint64_t last_poll; + /** If set the link is currently up. */ + int fLinkUp; + /** If set the link is temporarily down because of a saved state load. */ + int fLinkTempDown; + /** Number of times we've reported the link down. */ + uint32_t cLinkDownReported; + /** MS to wait before we enable the link. */ + uint32_t cMsLinkUpDelay; uint8_t maclocal[6]; /* configured MAC (local) address */ - pc_timer_t poll_timer, timer_soft_int; + pc_timer_t timer_soft_int, timer_restore; } nic_t; /** @todo All structs: big endian? */ @@ -403,6 +412,17 @@ pcnet_do_irq(nic_t *dev, int issue) } } +/** + * Checks if the link is up. + * @returns true if the link is up. + * @returns false if the link is down. + */ +static __inline int +pcnetIsLinkUp(nic_t *dev) +{ + return !dev->fLinkTempDown && dev->fLinkUp; +} + /** * Load transmit message descriptor * Make sure we read the own flag first. @@ -1214,6 +1234,12 @@ pcnetReceiveNoSync(void *priv, uint8_t *buf, int size) buf = buf1; size = 60; } + + /* + * Drop packets if the cable is not connected + */ + if (!pcnetIsLinkUp(dev)) + return; pcnetlog(1, "%s: pcnetReceiveNoSync: RX %x:%x:%x:%x:%x:%x > %x:%x:%x:%x:%x:%x len %d\n", dev->name, buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], @@ -1408,6 +1434,28 @@ pcnetReceiveNoSync(void *priv, uint8_t *buf, int size) pcnetUpdateIrq(dev); } +/** + * Fails a TMD with a link down error. + */ +static void +pcnetXmitFailTMDLinkDown(nic_t *dev, TMD *pTmd) +{ + /* make carrier error - hope this is correct. */ + dev->cLinkDownReported++; + pTmd->tmd2.lcar = pTmd->tmd1.err = 1; + dev->aCSR[0] |= 0x8000 | 0x2000; /* ERR | CERR */ +} + +/** + * Fails a TMD with a generic error. + */ +static void +pcnetXmitFailTMDGeneric(nic_t *dev, TMD *pTmd) +{ + /* make carrier error - hope this is correct. */ + pTmd->tmd2.lcar = pTmd->tmd1.err = 1; + dev->aCSR[0] |= 0x8000 | 0x2000; /* ERR | CERR */ +} /** * Actually try transmit frames. @@ -1435,6 +1483,12 @@ pcnetAsyncTransmit(nic_t *dev) if (!pcnetTdtePoll(dev, &tmd)) break; + /* Don't continue sending packets when the link is down. */ + if ((!pcnetIsLinkUp(dev) + && dev->cLinkDownReported > PCNET_MAX_LINKDOWN_REPORTED) + ) + break; + pcnetlog(3, "%s: TMDLOAD %#010x\n", dev->name, PHYSADDR(dev, CSR_CXDA(dev))); int fLoopback = CSR_LOOP(dev); @@ -1446,52 +1500,59 @@ pcnetAsyncTransmit(nic_t *dev) const int cb = 4096 - tmd.tmd1.bcnt; pcnetlog("%s: pcnetAsyncTransmit: stp&enp: cb=%d xmtrc=%#x\n", dev->name, cb, CSR_XMTRC(dev)); - /* From the manual: ``A zero length buffer is acceptable as - * long as it is not the last buffer in a chain (STP = 0 and - * ENP = 1).'' That means that the first buffer might have a - * zero length if it is not the last one in the chain. */ - if (cb <= MAX_FRAME) { - dev->xmit_pos = cb; - DMAPageRead(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb); + if ((pcnetIsLinkUp(dev) || fLoopback)) { + + /* From the manual: ``A zero length buffer is acceptable as + * long as it is not the last buffer in a chain (STP = 0 and + * ENP = 1).'' That means that the first buffer might have a + * zero length if it is not the last one in the chain. */ + if (cb <= MAX_FRAME) { + dev->xmit_pos = cb; + DMAPageRead(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb); - if (fLoopback) { - if (HOST_IS_OWNER(CSR_CRST(dev))) - pcnetRdtePoll(dev); + if (fLoopback) { + if (HOST_IS_OWNER(CSR_CRST(dev))) + pcnetRdtePoll(dev); - pcnetReceiveNoSync(dev, dev->abLoopBuf, dev->xmit_pos); + pcnetReceiveNoSync(dev, dev->abLoopBuf, dev->xmit_pos); + } else { + pcnetlog(3, "%s: pcnetAsyncTransmit: transmit loopbuf stp and enp, xmit pos = %d\n", dev->name, dev->xmit_pos); + network_tx(dev->abLoopBuf, dev->xmit_pos); + } + } else if (cb == 4096) { + /* The Windows NT4 pcnet driver sometimes marks the first + * unused descriptor as owned by us. Ignore that (by + * passing it back). Do not update the ring counter in this + * case (otherwise that driver becomes even more confused, + * which causes transmit to stall for about 10 seconds). + * This is just a workaround, not a final solution. + */ + /* r=frank: IMHO this is the correct implementation. The + * manual says: ``If the OWN bit is set and the buffer + * length is 0, the OWN bit will be cleared. In the C-LANCE + * the buffer length of 0 is interpreted as a 4096-byte + * buffer.'' + */ + /* r=michaln: Perhaps not quite right. The C-LANCE (Am79C90) + * datasheet explains that the old LANCE (Am7990) ignored + * the top four bits next to BCNT and a count of 0 was + * interpreted as 4096. In the C-LANCE, that is still the + * case if the top bits are all ones. If all 16 bits are + * zero, the C-LANCE interprets it as zero-length transmit + * buffer. It's not entirely clear if the later models + * (PCnet-ISA, PCnet-PCI) behave like the C-LANCE or not. + * It is possible that the actual behavior of the C-LANCE + * and later hardware is that the buffer lengths are *16-bit* + * two's complement numbers between 0 and 4096. AMD's drivers + * in fact generally treat the length as a 16-bit quantity. */ + pcnetlog(1, "%s: pcnetAsyncTransmit: illegal 4kb frame -> ignoring\n", dev->name); + pcnetTmdStorePassHost(dev, &tmd, PHYSADDR(dev, CSR_CXDA(dev))); + break; } else { - pcnetlog(3, "%s: pcnetAsyncTransmit: transmit loopbuf stp and enp, xmit pos = %d\n", dev->name, dev->xmit_pos); - network_tx(dev->abLoopBuf, dev->xmit_pos); + pcnetXmitFailTMDGeneric(dev, &tmd); } - } else if (cb == 4096) { - /* The Windows NT4 pcnet driver sometimes marks the first - * unused descriptor as owned by us. Ignore that (by - * passing it back). Do not update the ring counter in this - * case (otherwise that driver becomes even more confused, - * which causes transmit to stall for about 10 seconds). - * This is just a workaround, not a final solution. - */ - /* r=frank: IMHO this is the correct implementation. The - * manual says: ``If the OWN bit is set and the buffer - * length is 0, the OWN bit will be cleared. In the C-LANCE - * the buffer length of 0 is interpreted as a 4096-byte - * buffer.'' - */ - /* r=michaln: Perhaps not quite right. The C-LANCE (Am79C90) - * datasheet explains that the old LANCE (Am7990) ignored - * the top four bits next to BCNT and a count of 0 was - * interpreted as 4096. In the C-LANCE, that is still the - * case if the top bits are all ones. If all 16 bits are - * zero, the C-LANCE interprets it as zero-length transmit - * buffer. It's not entirely clear if the later models - * (PCnet-ISA, PCnet-PCI) behave like the C-LANCE or not. - * It is possible that the actual behavior of the C-LANCE - * and later hardware is that the buffer lengths are *16-bit* - * two's complement numbers between 0 and 4096. AMD's drivers - * in fact generally treat the length as a 16-bit quantity. */ - pcnetlog(1, "%s: pcnetAsyncTransmit: illegal 4kb frame -> ignoring\n", dev->name); - pcnetTmdStorePassHost(dev, &tmd, PHYSADDR(dev, CSR_CXDA(dev))); - break; + } else { + pcnetXmitFailTMDLinkDown(dev, &tmd); } /* Write back the TMD and pass it to the host (clear own bit). */ @@ -2021,8 +2082,9 @@ pcnet_mii_readw(nic_t *dev, uint16_t miiaddr) | 0x0008 /* Able to do auto-negotiation. */ | 0x0004 /* Link up. */ | 0x0001; /* Extended Capability, i.e. registers 4+ valid. */ - if (isolate) { + if (!dev->fLinkUp || dev->fLinkTempDown || isolate) { val &= ~(0x0020 | 0x0004); + dev->cLinkDownReported++; } if (!autoneg) { /* Auto-negotiation disabled. */ @@ -2056,7 +2118,7 @@ pcnet_mii_readw(nic_t *dev, uint16_t miiaddr) case 5: /* Link partner ability register. */ - if (!isolate) { + if (dev->fLinkUp && !dev->fLinkTempDown && !isolate) { val = 0x8000 /* Next page bit. */ | 0x4000 /* Link partner acked us. */ | 0x0400 /* Can do flow control. */ @@ -2064,23 +2126,25 @@ pcnet_mii_readw(nic_t *dev, uint16_t miiaddr) | 0x0001; /* Use CSMA selector. */ } else { val = 0; + dev->cLinkDownReported++; } break; case 6: /* Auto negotiation expansion register. */ - if (!isolate) { + if (dev->fLinkUp && !dev->fLinkTempDown && !isolate) { val = 0x0008 /* Link partner supports npage. */ | 0x0004 /* Enable npage words. */ | 0x0001; /* Can do N-way auto-negotiation. */ } else { val = 0; + dev->cLinkDownReported++; } break; case 18: /* Diagnostic Register (FreeBSD pcn/ac101 driver reads this). */ - if (!isolate) { + if (dev->fLinkUp && !dev->fLinkTempDown && !isolate) { val = 0x1000 /* Receive PLL locked. */ | 0x0200; /* Signal detected. */ @@ -2095,6 +2159,7 @@ pcnet_mii_readw(nic_t *dev, uint16_t miiaddr) } } else { val = 0; + dev->cLinkDownReported++; } break; @@ -2117,6 +2182,11 @@ pcnet_bcr_readw(nic_t *dev, uint16_t rap) case BCR_LED2: case BCR_LED3: val = dev->aBCR[rap] & ~0x8000; + if (dev->fLinkTempDown || !dev->fLinkUp) { + if (rap == 4) + dev->cLinkDownReported++; + val &= ~0x40; + } val |= (val & 0x017f & dev->u32Lnkst) ? 0x8000 : 0; break; @@ -2623,6 +2693,27 @@ pcnet_pci_read(int func, int addr, void *p) return(0); } +/** + * Takes down the link temporarily if it's current status is up. + * + * This is used during restore and when replumbing the network link. + * + * The temporary link outage is supposed to indicate to the OS that all network + * connections have been lost and that it for instance is appropriate to + * renegotiate any DHCP lease. + * + * @param pThis The PCnet shared instance data. + */ +static void +pcnetTempLinkDown(nic_t *dev) +{ + if (dev->fLinkUp) { + dev->fLinkTempDown = 1; + dev->cLinkDownReported = 0; + dev->aCSR[0] |= 0x8000 | 0x2000; /* ERR | CERR (this is probably wrong) */ + timer_set_delay_u64(&dev->timer_restore, (dev->cMsLinkUpDelay * 1000) * TIMER_USEC); + } +} /** * Check if the device/driver can receive data now. @@ -2664,6 +2755,34 @@ pcnetWaitReceiveAvail(void *priv) return dev->fMaybeOutOfSpace; } +static int +pcnetSetLinkState(void *priv) +{ + nic_t *dev = (nic_t *) priv; + int fLinkUp; + + if (dev->fLinkTempDown) { + pcnetTempLinkDown(dev); + return 1; + } + + fLinkUp = (dev->fLinkUp && !dev->fLinkTempDown); + if (dev->fLinkUp != fLinkUp) { + dev->fLinkUp = fLinkUp; + if (fLinkUp) { + dev->fLinkTempDown = 1; + dev->cLinkDownReported = 0; + dev->aCSR[0] |= 0x8000 | 0x2000; /* ERR | CERR (this is probably wrong) */ + timer_set_delay_u64(&dev->timer_restore, (dev->cMsLinkUpDelay * 1000) * TIMER_USEC); + } else { + dev->cLinkDownReported = 0; + dev->aCSR[0] |= 0x8000 | 0x2000; /* ERR | CERR (this is probably wrong) */ + } + } + + return 0; +} + static void pcnetTimerSoftInt(void *priv) { @@ -2675,16 +2794,18 @@ pcnetTimerSoftInt(void *priv) } static void -pcnetTimerCallback(void *priv) +pcnetTimerRestore(void *priv) { nic_t *dev = (nic_t *) priv; -#ifdef ENABLE_PCNET_LOG - pcnetlog(3, "Timer Callback to RX\n"); -#endif - pcnetPollRxTx(dev); - - timer_disable(&dev->poll_timer); + if (dev->cLinkDownReported <= PCNET_MAX_LINKDOWN_REPORTED) { + timer_advance_u64(&dev->timer_restore, 1500000 * TIMER_USEC); + } else { + dev->fLinkTempDown = 0; + if (dev->fLinkUp) { + dev->aCSR[0] &= ~(0x8000 | 0x2000); /* ERR | CERR - probably not 100% correct either... */ + } + } } static void * @@ -2717,10 +2838,19 @@ pcnet_init(const device_t *info) pcnet_mem_init(dev, 0x0fffff00); pcnet_mem_disable(dev); } - - dev->maclocal[0] = 0x00; /* 00:0C:87 (AMD OID) */ - dev->maclocal[1] = 0x0C; - dev->maclocal[2] = 0x87; + + dev->fLinkUp = 1; + dev->cMsLinkUpDelay = 5000; + + if (dev->board == DEV_AM79C960_EB) { + dev->maclocal[0] = 0x02; /* 02:07:01 (Racal OID) */ + dev->maclocal[1] = 0x07; + dev->maclocal[2] = 0x01; + } else { + dev->maclocal[0] = 0x00; /* 00:0C:87 (AMD OID) */ + dev->maclocal[1] = 0x0C; + dev->maclocal[2] = 0x87; + } /* See if we have a local MAC address configured. */ mac = device_get_config_mac("mac", -1); @@ -2816,12 +2946,12 @@ pcnet_init(const device_t *info) pcnetHardReset(dev); /* Attach ourselves to the network module. */ - network_attach(dev, dev->aPROM, pcnetReceiveNoSync, pcnetWaitReceiveAvail); + network_attach(dev, dev->aPROM, pcnetReceiveNoSync, pcnetWaitReceiveAvail, pcnetSetLinkState); if (dev->board == DEV_AM79C973) timer_add(&dev->timer_soft_int, pcnetTimerSoftInt, dev, 0); - - timer_add(&dev->poll_timer, pcnetTimerCallback, dev, 0); + + timer_add(&dev->timer_restore, pcnetTimerRestore, dev, 0); return(dev); } @@ -2838,8 +2968,6 @@ pcnet_close(void *priv) network_close(); if (dev) { - timer_disable(&dev->poll_timer); - free(dev); dev = NULL; diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 3adc8d6f7..c1af9fc65 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -147,7 +147,7 @@ poll_thread(void *arg) /* Wait for the next packet to arrive. */ data_valid = 0; - if ((!network_get_wait() && !(poll_card->wait && poll_card->wait(poll_card->priv))) && (QueuePeek(slirpq) != 0)) { + if ((!network_get_wait() && !(poll_card->set_link_state && poll_card->set_link_state(poll_card->priv)) && !(poll_card->wait && poll_card->wait(poll_card->priv))) && (QueuePeek(slirpq) != 0)) { /* Grab a packet from the queue. */ // ui_sb_update_icon(SB_NETWORK, 1); diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 7f0b5aeeb..953212a0b 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -771,7 +771,7 @@ wd_init(const device_t *info) mem_mapping_disable(&dev->ram_mapping); /* Attach ourselves to the network module. */ - network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL); + network_attach(dev->dp8390, dev->dp8390->physaddr, dp8390_rx, NULL, NULL); if (!(dev->board_chip & WE_ID_BUS_MCA)) { wdlog("%s: attached IO=0x%X IRQ=%d, RAM addr=0x%06x\n", dev->name, diff --git a/src/network/network.c b/src/network/network.c index db69227f3..4273cf6fb 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -223,7 +223,7 @@ network_init(void) * modules. */ void -network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait) +network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETLINKSTATE set_link_state) { if (network_card == 0) return; @@ -231,6 +231,7 @@ network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait) net_cards[network_card].priv = dev; net_cards[network_card].rx = rx; net_cards[network_card].wait = wait; + net_cards[network_card].set_link_state = set_link_state; network_mac = mac; network_set_wait(0); From 64b56db0d75ca3c86ac8c0129a3c452ae18b7b66 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 21 Apr 2020 00:27:22 +0200 Subject: [PATCH 09/43] Fixed the implementation of XADD - fixes Windows 2000 Service Pack 4, and hopefully also Linux. --- src/cpu_common/x86_ops_atomic.h | 85 +++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/src/cpu_common/x86_ops_atomic.h b/src/cpu_common/x86_ops_atomic.h index 54725d316..13b672e31 100644 --- a/src/cpu_common/x86_ops_atomic.h +++ b/src/cpu_common/x86_ops_atomic.h @@ -132,83 +132,96 @@ static int opCMPXCHG8B_a32(uint32_t fetchdat) return 0; } +/* dest = eab, src = r8 */ static int opXADD_b_a16(uint32_t fetchdat) { - uint8_t temp, temp2; + uint8_t temp; + uint8_t src, dest; fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteab(); if (cpu_state.abrt) return 1; - temp2 = getr8(cpu_reg); - setr8(cpu_reg, temp); - seteab(temp + temp2); if (cpu_state.abrt) return 1; - setadd8(temp, temp2); + src = getr8(cpu_reg); + dest = geteab(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteab(temp); if (cpu_state.abrt) return 1; + setadd8(src, dest); + setr8(cpu_reg, dest); CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } static int opXADD_b_a32(uint32_t fetchdat) { - uint8_t temp, temp2; + uint8_t temp; + uint8_t src, dest; fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteab(); if (cpu_state.abrt) return 1; - temp2 = getr8(cpu_reg); - setr8(cpu_reg, temp); - seteab(temp + temp2); if (cpu_state.abrt) return 1; - setadd8(temp, temp2); + src = getr8(cpu_reg); + dest = geteab(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteab(temp); if (cpu_state.abrt) return 1; + setadd8(src, dest); + setr8(cpu_reg, dest); CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } static int opXADD_w_a16(uint32_t fetchdat) { - uint16_t temp, temp2; + uint16_t temp; + uint16_t src, dest; fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteaw(); if (cpu_state.abrt) return 1; - temp2 = cpu_state.regs[cpu_reg].w; - cpu_state.regs[cpu_reg].w = temp; - seteaw(temp + temp2); if (cpu_state.abrt) return 1; - setadd16(temp, temp2); + src = cpu_state.regs[cpu_reg].w; + dest = geteaw(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteaw(temp); if (cpu_state.abrt) return 1; + setadd16(src, dest); + cpu_state.regs[cpu_reg].w = dest; CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } static int opXADD_w_a32(uint32_t fetchdat) { - uint16_t temp, temp2; + uint16_t temp; + uint16_t src, dest; fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteaw(); if (cpu_state.abrt) return 1; - temp2 = cpu_state.regs[cpu_reg].w; - cpu_state.regs[cpu_reg].w = temp; - seteaw(temp + temp2); if (cpu_state.abrt) return 1; - setadd16(temp, temp2); + src = cpu_state.regs[cpu_reg].w; + dest = geteaw(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteaw(temp); if (cpu_state.abrt) return 1; + setadd16(src, dest); + cpu_state.regs[cpu_reg].w = dest; CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } static int opXADD_l_a16(uint32_t fetchdat) { - uint32_t temp, temp2; + uint32_t temp; + uint32_t src, dest; fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteal(); if (cpu_state.abrt) return 1; - temp2 = cpu_state.regs[cpu_reg].l; - cpu_state.regs[cpu_reg].l = temp; - seteal(temp + temp2); if (cpu_state.abrt) return 1; - setadd32(temp, temp2); + src = cpu_state.regs[cpu_reg].l; + dest = geteal(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteal(temp); if (cpu_state.abrt) return 1; + setadd32(src, dest); + cpu_state.regs[cpu_reg].l = dest; CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } static int opXADD_l_a32(uint32_t fetchdat) { - uint32_t temp, temp2; + uint32_t temp; + uint32_t src, dest; fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); - temp = geteal(); if (cpu_state.abrt) return 1; - temp2 = cpu_state.regs[cpu_reg].l; - cpu_state.regs[cpu_reg].l = temp; - seteal(temp + temp2); if (cpu_state.abrt) return 1; - setadd32(temp, temp2); + src = cpu_state.regs[cpu_reg].l; + dest = geteal(); if (cpu_state.abrt) return 1; + temp = src + dest; + seteal(temp); if (cpu_state.abrt) return 1; + setadd32(src, dest); + cpu_state.regs[cpu_reg].l = dest; CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4); return 0; } From 022d1f818e4035034968c80199c8ece8c6ed5110 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 21 Apr 2020 04:34:22 +0200 Subject: [PATCH 10/43] Fixed PAE enough to get Lubuntu 17.10 to Kernel Panic (apparent lack of IDE driver) instead of triple fault reset. --- src/mem.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/mem.c b/src/mem.c index 25e84f593..be1589b3d 100644 --- a/src/mem.c +++ b/src/mem.c @@ -355,14 +355,14 @@ mmutranslatereal_normal(uint32_t addr, int rw) static uint64_t mmutranslatereal_pae(uint32_t addr, int rw) { - uint64_t temp,temp2,temp3; + uint64_t temp,temp2,temp3,temp4; uint64_t addr2,addr3,addr4; if (cpu_state.abrt) return 0xffffffffffffffffULL; addr2 = (cr3 & ~0x1f) + ((addr >> 27) & 0x18); - temp = temp2 = rammap64(addr2); + temp = temp2 = rammap64(addr2) & 0x000000ffffffffffULL; if (!(temp & 1)) { cr2 = addr; temp &= 1; @@ -373,8 +373,8 @@ mmutranslatereal_pae(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - addr3 = (temp & ~0xfff) + ((addr >> 18) & 0xff8); - temp = rammap64(addr3); + addr3 = (temp & ~0xfffULL) + ((addr >> 18) & 0xff8); + temp = temp4 = rammap64(addr3) & 0x000000ffffffffffULL; temp3 = temp & temp2; if (!(temp & 1)) { cr2 = addr; @@ -387,8 +387,8 @@ mmutranslatereal_pae(uint32_t addr, int rw) } if (temp & 0x80) { - /*4MB page*/ - if (((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { + /*2MB page*/ + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -403,12 +403,12 @@ mmutranslatereal_pae(uint32_t addr, int rw) mmu_perm = temp & 4; rammap64(addr3) |= 0x20; - return ((temp & ~0x1fffff) + (addr & 0x1fffff)) & 0x0000000fffffffffULL; + return ((temp & ~0x1fffffULL) + (addr & 0x1fffffULL)) & 0x000000ffffffffffULL; } - addr4 = (temp & ~0xfff) + ((addr >> 9) & 0xff8); - temp = rammap64(addr4); - temp3 = temp & temp3; + addr4 = (temp & ~0xfffULL) + ((addr >> 9) & 0xff8); + temp = rammap64(addr4) & 0x000000ffffffffffULL; + temp3 = temp & temp4; if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { cr2 = addr; temp &= 1; @@ -423,7 +423,7 @@ mmutranslatereal_pae(uint32_t addr, int rw) rammap64(addr3) |= 0x20; rammap64(addr4) |= (rw? 0x60 : 0x20); - return ((temp & ~0xfff) + ((uint64_t) (addr & 0xfff))) & 0x0000000fffffffffULL; + return ((temp & ~0xfffULL) + ((uint64_t) (addr & 0xfff))) & 0x000000ffffffffffULL; } @@ -481,20 +481,20 @@ mmutranslate_noabrt_normal(uint32_t addr, int rw) static uint64_t mmutranslate_noabrt_pae(uint32_t addr, int rw) { - uint32_t temp,temp2,temp3; - uint32_t addr2,addr3,addr4; + uint64_t temp,temp2,temp3,temp4; + uint64_t addr2,addr3,addr4; if (cpu_state.abrt) return 0xffffffffffffffffULL; addr2 = (cr3 & ~0x1f) + ((addr >> 27) & 0x18); - temp = temp2 = rammap64(addr2); + temp = temp2 = rammap64(addr2) & 0x000000ffffffffffULL; if (! (temp & 1)) return 0xffffffffffffffffULL; - addr3 = (temp & ~0xfff) + ((addr >> 18) & 0xff8); - temp = rammap64(addr3); + addr3 = (temp & ~0xfffULL) + ((addr >> 18) & 0xff8); + temp = temp4 = rammap64(addr3) & 0x000000ffffffffffULL; temp3 = temp & temp2; if (! (temp & 1)) @@ -502,20 +502,20 @@ mmutranslate_noabrt_pae(uint32_t addr, int rw) if (temp & 0x80) { /*2MB page*/ - if (((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; - return ((temp & ~0x1fffff) + (addr & 0x1fffff)) & 0x0000000fffffffffULL; + return ((temp & ~0x1fffffULL) + (addr & 0x1fffff)) & 0x000000ffffffffffULL; } - addr4 = (temp & ~0xfff) + ((addr >> 9) & 0xff8); - temp = rammap64(addr4); - temp3 = temp & temp3; + addr4 = (temp & ~0xfffULL) + ((addr >> 9) & 0xff8); + temp = rammap64(addr4) & 0x000000ffffffffffULL;; + temp3 = temp & temp4; if (!(temp&1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; - return ((temp & ~0xfff) + ((uint64_t) (addr & 0xfff))) & 0x0000000fffffffffULL; + return ((temp & ~0xfffULL) + ((uint64_t) (addr & 0xfff))) & 0x000000ffffffffffULL; } From 70862a3c25279f9e4183154e0ad99bde406c944d Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 21 Apr 2020 19:24:00 +0200 Subject: [PATCH 11/43] Added dmmy support for MSR 0x179 for Debian 10. --- src/cpu_common/cpu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/cpu_common/cpu.c b/src/cpu_common/cpu.c index bff70e6b1..c77e02ca4 100644 --- a/src/cpu_common/cpu.c +++ b/src/cpu_common/cpu.c @@ -2779,14 +2779,20 @@ void cpu_RDMSR() if (machines[machine].cpu[cpu_manufacturer].cpus[cpu].cpu_type == CPU_PENTIUMPRO) goto i686_invalid_rdmsr; EAX &= 0xFFFF0000; EAX |= cs_msr; + EDX = 0x00000000; break; case 0x175: if (machines[machine].cpu[cpu_manufacturer].cpus[cpu].cpu_type == CPU_PENTIUMPRO) goto i686_invalid_rdmsr; EAX = esp_msr; + EDX = 0x00000000; break; case 0x176: if (machines[machine].cpu[cpu_manufacturer].cpus[cpu].cpu_type == CPU_PENTIUMPRO) goto i686_invalid_rdmsr; EAX = eip_msr; + EDX = 0x00000000; + break; + case 0x179: + EAX = EDX = 0x00000000; break; case 0x186: EAX = ecx186_msr & 0xffffffff; @@ -3212,6 +3218,8 @@ void cpu_WRMSR() if (machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective].cpu_type == CPU_PENTIUMPRO) goto i686_invalid_wrmsr; eip_msr = EAX; break; + case 0x179: + break; case 0x186: ecx186_msr = EAX | ((uint64_t)EDX << 32); break; From d499d63fd1d317665507748cbd58432823dcf2ea Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 21 Apr 2020 23:52:10 +0200 Subject: [PATCH 12/43] Implemented the Pentium Pro+ HINT_NOP instructions and slightly reworked the Deschutes+ FXSAVE/FXRSTOR instructions. --- src/cpu_common/386_ops.h | 24 +- src/cpu_common/x86_ops_i686.h | 573 ++++++++++++---------------------- 2 files changed, 218 insertions(+), 379 deletions(-) diff --git a/src/cpu_common/386_ops.h b/src/cpu_common/386_ops.h index f6467dea1..674186337 100644 --- a/src/cpu_common/386_ops.h +++ b/src/cpu_common/386_ops.h @@ -1177,7 +1177,7 @@ const OpFn OP_TABLE(pentiumpro_0f)[1024] = /*16-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1199,7 +1199,7 @@ const OpFn OP_TABLE(pentiumpro_0f)[1024] = /*32-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1221,7 +1221,7 @@ const OpFn OP_TABLE(pentiumpro_0f)[1024] = /*16-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1243,7 +1243,7 @@ const OpFn OP_TABLE(pentiumpro_0f)[1024] = /*32-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1268,7 +1268,7 @@ const OpFn OP_TABLE(pentium2_0f)[1024] = /*16-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1290,7 +1290,7 @@ const OpFn OP_TABLE(pentium2_0f)[1024] = /*32-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1312,7 +1312,7 @@ const OpFn OP_TABLE(pentium2_0f)[1024] = /*16-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1334,7 +1334,7 @@ const OpFn OP_TABLE(pentium2_0f)[1024] = /*32-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1359,7 +1359,7 @@ const OpFn OP_TABLE(pentium2d_0f)[1024] = /*16-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1381,7 +1381,7 @@ const OpFn OP_TABLE(pentium2d_0f)[1024] = /*32-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, opHINT_NOP_a16, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1403,7 +1403,7 @@ const OpFn OP_TABLE(pentium2d_0f)[1024] = /*16-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -1425,7 +1425,7 @@ const OpFn OP_TABLE(pentium2d_0f)[1024] = /*32-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ /*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, ILLEGAL, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, opNOP, ILLEGAL, ILLEGAL, -/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, opHINT_NOP_a32, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ opWRMSR, opRDTSC, opRDMSR, opRDPMC, opSYSENTER, opSYSEXIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, diff --git a/src/cpu_common/x86_ops_i686.h b/src/cpu_common/x86_ops_i686.h index 469076c8b..dad86b410 100644 --- a/src/cpu_common/x86_ops_i686.h +++ b/src/cpu_common/x86_ops_i686.h @@ -45,377 +45,216 @@ opSYSEXIT(uint32_t fetchdat) } +static int +fx_save_stor_common(uint32_t fetchdat, int bits) +{ + uint8_t fxinst = 0; + uint16_t twd = x87_gettag(); + uint32_t old_eaaddr = 0; + uint8_t ftwb = 0; + uint16_t rec_ftw = 0; + uint16_t fpus = 0; + uint64_t *p; + + if (CPUID < 0x650) + return ILLEGAL(fetchdat); + + FP_ENTER(); + + if (bits == 32) { + fetch_ea_32(fetchdat); + } else { + fetch_ea_16(fetchdat); + } + + if (cpu_state.eaaddr & 0xf) { + x386_dynarec_log("Effective address %08X not on 16-byte boundary\n", cpu_state.eaaddr); + x86gpf(NULL, 0); + return cpu_state.abrt; + } + + fxinst = (rmdat >> 3) & 7; + + if ((fxinst > 1) || (cpu_mod == 3)) { + x86illegal(); + return cpu_state.abrt; + } + + FP_ENTER(); + + old_eaaddr = cpu_state.eaaddr; + + if (fxinst == 1) { + /* FXRSTOR */ + cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); + fpus = readmemw(easeg, cpu_state.eaaddr + 2); + cpu_state.npxc = (cpu_state.npxc & ~FPU_CW_Reserved_Bits) | 0x0040; + codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); + cpu_state.TOP = (fpus >> 11) & 7; + cpu_state.npxs &= fpus & ~0x3800; + + x87_pc_off = readmeml(easeg, cpu_state.eaaddr+8); + x87_pc_seg = readmemw(easeg, cpu_state.eaaddr+12); + + ftwb = readmemb(easeg, cpu_state.eaaddr + 4); + + if (ftwb & 0x01) rec_ftw |= 0x0003; + if (ftwb & 0x02) rec_ftw |= 0x000C; + if (ftwb & 0x04) rec_ftw |= 0x0030; + if (ftwb & 0x08) rec_ftw |= 0x00C0; + if (ftwb & 0x10) rec_ftw |= 0x0300; + if (ftwb & 0x20) rec_ftw |= 0x0C00; + if (ftwb & 0x40) rec_ftw |= 0x3000; + if (ftwb & 0x80) rec_ftw |= 0xC000; + + x87_op_off = readmeml(easeg, cpu_state.eaaddr+16); + x87_op_off |= (readmemw(easeg, cpu_state.eaaddr + 6) >> 12) << 16; + x87_op_seg = readmemw(easeg, cpu_state.eaaddr+20); + + cpu_state.eaaddr = old_eaaddr + 32; + x87_ldmmx(&(cpu_state.MM[0]), &(cpu_state.MM_w4[0])); x87_ld_frstor(0); + + cpu_state.eaaddr = old_eaaddr + 48; + x87_ldmmx(&(cpu_state.MM[1]), &(cpu_state.MM_w4[1])); x87_ld_frstor(1); + + cpu_state.eaaddr = old_eaaddr + 64; + x87_ldmmx(&(cpu_state.MM[2]), &(cpu_state.MM_w4[2])); x87_ld_frstor(2); + + cpu_state.eaaddr = old_eaaddr + 80; + x87_ldmmx(&(cpu_state.MM[3]), &(cpu_state.MM_w4[3])); x87_ld_frstor(3); + + cpu_state.eaaddr = old_eaaddr + 96; + x87_ldmmx(&(cpu_state.MM[4]), &(cpu_state.MM_w4[4])); x87_ld_frstor(4); + + cpu_state.eaaddr = old_eaaddr + 112; + x87_ldmmx(&(cpu_state.MM[5]), &(cpu_state.MM_w4[5])); x87_ld_frstor(5); + + cpu_state.eaaddr = old_eaaddr + 128; + x87_ldmmx(&(cpu_state.MM[6]), &(cpu_state.MM_w4[6])); x87_ld_frstor(6); + + cpu_state.eaaddr = old_eaaddr + 144; + x87_ldmmx(&(cpu_state.MM[7]), &(cpu_state.MM_w4[7])); x87_ld_frstor(7); + + cpu_state.ismmx = 0; + /*Horrible hack, but as 86Box doesn't keep the FPU stack in 80-bit precision at all times + something like this is needed*/ + p = (uint64_t *) cpu_state.tag; +#ifdef USE_NEW_DYNAREC + if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && + cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && + !cpu_state.TOP && (*p == 0x0101010101010101ull)) +#else + if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && + cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && + !cpu_state.TOP && !(*p)) +#endif + cpu_state.ismmx = 1; + + x87_settag(rec_ftw); + + CLOCK_CYCLES((cr0 & 1) ? 34 : 44); + + if (cpu_state.abrt) + x386_dynarec_log("FXRSTOR: abrt != 0\n"); + } else { + /* FXSAVE */ + if ((twd & 0x0003) == 0x0003) ftwb |= 0x01; + if ((twd & 0x000C) == 0x000C) ftwb |= 0x02; + if ((twd & 0x0030) == 0x0030) ftwb |= 0x04; + if ((twd & 0x00C0) == 0x00C0) ftwb |= 0x08; + if ((twd & 0x0300) == 0x0300) ftwb |= 0x10; + if ((twd & 0x0C00) == 0x0C00) ftwb |= 0x20; + if ((twd & 0x3000) == 0x3000) ftwb |= 0x40; + if ((twd & 0xC000) == 0xC000) ftwb |= 0x80; + + writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); + writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); + writememb(easeg,cpu_state.eaaddr+4,ftwb); + + writememw(easeg,cpu_state.eaaddr+6,(x87_op_off>>16)<<12); + writememl(easeg,cpu_state.eaaddr+8,x87_pc_off); + writememw(easeg,cpu_state.eaaddr+12,x87_pc_seg); + + writememl(easeg,cpu_state.eaaddr+16,x87_op_off); + writememw(easeg,cpu_state.eaaddr+20,x87_op_seg); + + cpu_state.eaaddr = old_eaaddr + 32; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[0]) : x87_st_fsave(0); + + cpu_state.eaaddr = old_eaaddr + 48; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[1]) : x87_st_fsave(1); + + cpu_state.eaaddr = old_eaaddr + 64; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[2]) : x87_st_fsave(2); + + cpu_state.eaaddr = old_eaaddr + 80; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[3]) : x87_st_fsave(3); + + cpu_state.eaaddr = old_eaaddr + 96; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[4]) : x87_st_fsave(4); + + cpu_state.eaaddr = old_eaaddr + 112; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[5]) : x87_st_fsave(5); + + cpu_state.eaaddr = old_eaaddr + 128; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[6]) : x87_st_fsave(6); + + cpu_state.eaaddr = old_eaaddr + 144; + cpu_state.ismmx ? x87_stmmx(cpu_state.MM[7]) : x87_st_fsave(7); + + cpu_state.eaaddr = old_eaaddr; + + cpu_state.npxc = 0x37F; + codegen_set_rounding_mode(X87_ROUNDING_NEAREST); + cpu_state.npxs = 0; + p = (uint64_t *)cpu_state.tag; +#ifdef USE_NEW_DYNAREC + *p = 0; +#else + *p = 0x0303030303030303ll; +#endif + cpu_state.TOP = 0; + cpu_state.ismmx = 0; + + CLOCK_CYCLES((cr0 & 1) ? 56 : 67); + + if (cpu_state.abrt) + x386_dynarec_log("FXSAVE: abrt != 0\n"); + } + + return cpu_state.abrt; +} + + static int opFXSAVESTOR_a16(uint32_t fetchdat) { - uint8_t fxinst = 0; - uint16_t twd = x87_gettag(); - uint16_t old_eaaddr = 0; - uint8_t ftwb = 0; - uint16_t rec_ftw = 0; - uint16_t fpus = 0; - uint64_t *p; - - if (CPUID < 0x650) return ILLEGAL(fetchdat); - - FP_ENTER(); - - fetch_ea_16(fetchdat); - - if (cpu_state.eaaddr & 0xf) - { - x386_dynarec_log("Effective address %04X not on 16-byte boundary\n", cpu_state.eaaddr); - x86gpf(NULL, 0); - return cpu_state.abrt; - } - - fxinst = (rmdat >> 3) & 7; - - if ((fxinst > 1) || (cpu_mod == 3)) - { - x86illegal(); - return cpu_state.abrt; - } - - FP_ENTER(); - - old_eaaddr = cpu_state.eaaddr; - - if (fxinst == 1) - { - /* FXRSTOR */ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - fpus = readmemw(easeg, cpu_state.eaaddr + 2); - cpu_state.npxc = (cpu_state.npxc & ~FPU_CW_Reserved_Bits) | 0x0040; -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - cpu_state.TOP = (fpus >> 11) & 7; - cpu_state.npxs &= fpus & ~0x3800; - - /* foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF; */ - - x87_pc_off = readmeml(easeg, cpu_state.eaaddr+8); - x87_pc_seg = readmemw(easeg, cpu_state.eaaddr+12); - /* if (cr0 & 1) - { - x87_pc_seg &= 0xFFFC; - x87_pc_seg |= ((cpu_state.seg_cs.access >> 5) & 3); - } */ - - ftwb = readmemb(easeg, cpu_state.eaaddr + 4); - - if (ftwb & 0x01) rec_ftw |= 0x0003; - if (ftwb & 0x02) rec_ftw |= 0x000C; - if (ftwb & 0x04) rec_ftw |= 0x0030; - if (ftwb & 0x08) rec_ftw |= 0x00C0; - if (ftwb & 0x10) rec_ftw |= 0x0300; - if (ftwb & 0x20) rec_ftw |= 0x0C00; - if (ftwb & 0x40) rec_ftw |= 0x3000; - if (ftwb & 0x80) rec_ftw |= 0xC000; - - x87_op_off = readmeml(easeg, cpu_state.eaaddr+16); - x87_op_off |= (readmemw(easeg, cpu_state.eaaddr + 6) >> 12) << 16; - x87_op_seg = readmemw(easeg, cpu_state.eaaddr+20); - /* if (cr0 & 1) - { - x87_op_seg &= 0xFFFC; - x87_op_seg |= ((_ds.access >> 5) & 3); - } */ - - cpu_state.eaaddr = old_eaaddr + 32; - x87_ldmmx(&(cpu_state.MM[0]), &(cpu_state.MM_w4[0])); x87_ld_frstor(0); - - cpu_state.eaaddr = old_eaaddr + 48; - x87_ldmmx(&(cpu_state.MM[1]), &(cpu_state.MM_w4[1])); x87_ld_frstor(1); - - cpu_state.eaaddr = old_eaaddr + 64; - x87_ldmmx(&(cpu_state.MM[2]), &(cpu_state.MM_w4[2])); x87_ld_frstor(2); - - cpu_state.eaaddr = old_eaaddr + 80; - x87_ldmmx(&(cpu_state.MM[3]), &(cpu_state.MM_w4[3])); x87_ld_frstor(3); - - cpu_state.eaaddr = old_eaaddr + 96; - x87_ldmmx(&(cpu_state.MM[4]), &(cpu_state.MM_w4[4])); x87_ld_frstor(4); - - cpu_state.eaaddr = old_eaaddr + 112; - x87_ldmmx(&(cpu_state.MM[5]), &(cpu_state.MM_w4[5])); x87_ld_frstor(5); - - cpu_state.eaaddr = old_eaaddr + 128; - x87_ldmmx(&(cpu_state.MM[6]), &(cpu_state.MM_w4[6])); x87_ld_frstor(6); - - cpu_state.eaaddr = old_eaaddr + 144; - x87_ldmmx(&(cpu_state.MM[7]), &(cpu_state.MM_w4[7])); x87_ld_frstor(7); - - cpu_state.ismmx = 0; - /*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times - something like this is needed*/ - p = (uint64_t *)cpu_state.tag; - if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && - cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && - !cpu_state.TOP && !(*p)) - cpu_state.ismmx = 1; - - x87_settag(rec_ftw); - - CLOCK_CYCLES((cr0 & 1) ? 34 : 44); - - if(cpu_state.abrt) x386_dynarec_log("FXRSTOR: abrt != 0\n"); - } - else - { - /* FXSAVE */ - if ((twd & 0x0003) == 0x0003) ftwb |= 0x01; - if ((twd & 0x000C) == 0x000C) ftwb |= 0x02; - if ((twd & 0x0030) == 0x0030) ftwb |= 0x04; - if ((twd & 0x00C0) == 0x00C0) ftwb |= 0x08; - if ((twd & 0x0300) == 0x0300) ftwb |= 0x10; - if ((twd & 0x0C00) == 0x0C00) ftwb |= 0x20; - if ((twd & 0x3000) == 0x3000) ftwb |= 0x40; - if ((twd & 0xC000) == 0xC000) ftwb |= 0x80; - - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememb(easeg,cpu_state.eaaddr+4,ftwb); - - writememw(easeg,cpu_state.eaaddr+6,(x87_op_off>>16)<<12); - writememl(easeg,cpu_state.eaaddr+8,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+12,x87_pc_seg); - - writememl(easeg,cpu_state.eaaddr+16,x87_op_off); - writememw(easeg,cpu_state.eaaddr+20,x87_op_seg); - - cpu_state.eaaddr = old_eaaddr + 32; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[0]) : x87_st_fsave(0); - - cpu_state.eaaddr = old_eaaddr + 48; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[1]) : x87_st_fsave(1); - - cpu_state.eaaddr = old_eaaddr + 64; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[2]) : x87_st_fsave(2); - - cpu_state.eaaddr = old_eaaddr + 80; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[3]) : x87_st_fsave(3); - - cpu_state.eaaddr = old_eaaddr + 96; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[4]) : x87_st_fsave(4); - - cpu_state.eaaddr = old_eaaddr + 112; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[5]) : x87_st_fsave(5); - - cpu_state.eaaddr = old_eaaddr + 128; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[6]) : x87_st_fsave(6); - - cpu_state.eaaddr = old_eaaddr + 144; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[7]) : x87_st_fsave(7); - - cpu_state.eaaddr = old_eaaddr; - - cpu_state.npxc = 0x37F; -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00); - cpu_state.npxs = 0; - p = (uint64_t *)cpu_state.tag; - *p = 0x0303030303030303ll; - cpu_state.TOP = 0; - cpu_state.ismmx = 0; - - CLOCK_CYCLES((cr0 & 1) ? 56 : 67); - - if(cpu_state.abrt) x386_dynarec_log("FXSAVE: abrt != 0\n"); - } - - return cpu_state.abrt; + return fx_save_stor_common(fetchdat, 16); } -static int opFXSAVESTOR_a32(uint32_t fetchdat) + +static int +opFXSAVESTOR_a32(uint32_t fetchdat) { - uint8_t fxinst = 0; - uint16_t twd = x87_gettag(); - uint32_t old_eaaddr = 0; - uint8_t ftwb = 0; - uint16_t rec_ftw = 0; - uint16_t fpus = 0; - uint64_t *p; - - if (CPUID < 0x650) return ILLEGAL(fetchdat); - - FP_ENTER(); - - fetch_ea_32(fetchdat); - - if (cpu_state.eaaddr & 0xf) - { - x386_dynarec_log("Effective address %08X not on 16-byte boundary\n", cpu_state.eaaddr); - x86gpf(NULL, 0); - return cpu_state.abrt; - } - - fxinst = (rmdat >> 3) & 7; - - if ((fxinst > 1) || (cpu_mod == 3)) - { - x86illegal(); - return cpu_state.abrt; - } - - FP_ENTER(); - - old_eaaddr = cpu_state.eaaddr; - - if (fxinst == 1) - { - /* FXRSTOR */ - cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr); -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - fpus = readmemw(easeg, cpu_state.eaaddr + 2); - cpu_state.npxc = (cpu_state.npxc & ~FPU_CW_Reserved_Bits) | 0x0040; -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - cpu_state.TOP = (fpus >> 11) & 7; - cpu_state.npxs &= fpus & ~0x3800; - - /* foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF; */ - - x87_pc_off = readmeml(easeg, cpu_state.eaaddr+8); - x87_pc_seg = readmemw(easeg, cpu_state.eaaddr+12); - /* if (cr0 & 1) - { - x87_pc_seg &= 0xFFFC; - x87_pc_seg |= ((cpu_state.seg_cs.access >> 5) & 3); - } */ - - ftwb = readmemb(easeg, cpu_state.eaaddr + 4); - - if (ftwb & 0x01) rec_ftw |= 0x0003; - if (ftwb & 0x02) rec_ftw |= 0x000C; - if (ftwb & 0x04) rec_ftw |= 0x0030; - if (ftwb & 0x08) rec_ftw |= 0x00C0; - if (ftwb & 0x10) rec_ftw |= 0x0300; - if (ftwb & 0x20) rec_ftw |= 0x0C00; - if (ftwb & 0x40) rec_ftw |= 0x3000; - if (ftwb & 0x80) rec_ftw |= 0xC000; - - x87_op_off = readmeml(easeg, cpu_state.eaaddr+16); - x87_op_off |= (readmemw(easeg, cpu_state.eaaddr + 6) >> 12) << 16; - x87_op_seg = readmemw(easeg, cpu_state.eaaddr+20); - /* if (cr0 & 1) - { - x87_op_seg &= 0xFFFC; - x87_op_seg |= ((_ds.access >> 5) & 3); - } */ - - cpu_state.eaaddr = old_eaaddr + 32; - x87_ldmmx(&(cpu_state.MM[0]), &(cpu_state.MM_w4[0])); x87_ld_frstor(0); - - cpu_state.eaaddr = old_eaaddr + 48; - x87_ldmmx(&(cpu_state.MM[1]), &(cpu_state.MM_w4[1])); x87_ld_frstor(1); - - cpu_state.eaaddr = old_eaaddr + 64; - x87_ldmmx(&(cpu_state.MM[2]), &(cpu_state.MM_w4[2])); x87_ld_frstor(2); - - cpu_state.eaaddr = old_eaaddr + 80; - x87_ldmmx(&(cpu_state.MM[3]), &(cpu_state.MM_w4[3])); x87_ld_frstor(3); - - cpu_state.eaaddr = old_eaaddr + 96; - x87_ldmmx(&(cpu_state.MM[4]), &(cpu_state.MM_w4[4])); x87_ld_frstor(4); - - cpu_state.eaaddr = old_eaaddr + 112; - x87_ldmmx(&(cpu_state.MM[5]), &(cpu_state.MM_w4[5])); x87_ld_frstor(5); - - cpu_state.eaaddr = old_eaaddr + 128; - x87_ldmmx(&(cpu_state.MM[6]), &(cpu_state.MM_w4[6])); x87_ld_frstor(6); - - cpu_state.eaaddr = old_eaaddr + 144; - x87_ldmmx(&(cpu_state.MM[7]), &(cpu_state.MM_w4[7])); x87_ld_frstor(7); - - cpu_state.ismmx = 0; - /*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times - something like this is needed*/ - p = (uint64_t *)cpu_state.tag; - if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff && - cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff && - !cpu_state.TOP && !(*p)) - cpu_state.ismmx = 1; - - x87_settag(rec_ftw); - - CLOCK_CYCLES((cr0 & 1) ? 34 : 44); - - if(cpu_state.abrt) x386_dynarec_log("FXRSTOR: abrt != 0\n"); - } - else - { - /* FXSAVE */ - if ((twd & 0x0003) == 0x0003) ftwb |= 0x01; - if ((twd & 0x000C) == 0x000C) ftwb |= 0x02; - if ((twd & 0x0030) == 0x0030) ftwb |= 0x04; - if ((twd & 0x00C0) == 0x00C0) ftwb |= 0x08; - if ((twd & 0x0300) == 0x0300) ftwb |= 0x10; - if ((twd & 0x0C00) == 0x0C00) ftwb |= 0x20; - if ((twd & 0x3000) == 0x3000) ftwb |= 0x40; - if ((twd & 0xC000) == 0xC000) ftwb |= 0x80; - - writememw(easeg,cpu_state.eaaddr,cpu_state.npxc); - writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs); - writememb(easeg,cpu_state.eaaddr+4,ftwb); - - writememw(easeg,cpu_state.eaaddr+6,(x87_op_off>>16)<<12); - writememl(easeg,cpu_state.eaaddr+8,x87_pc_off); - writememw(easeg,cpu_state.eaaddr+12,x87_pc_seg); - - writememl(easeg,cpu_state.eaaddr+16,x87_op_off); - writememw(easeg,cpu_state.eaaddr+20,x87_op_seg); - - cpu_state.eaaddr = old_eaaddr + 32; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[0]) : x87_st_fsave(0); - - cpu_state.eaaddr = old_eaaddr + 48; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[1]) : x87_st_fsave(1); - - cpu_state.eaaddr = old_eaaddr + 64; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[2]) : x87_st_fsave(2); - - cpu_state.eaaddr = old_eaaddr + 80; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[3]) : x87_st_fsave(3); - - cpu_state.eaaddr = old_eaaddr + 96; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[4]) : x87_st_fsave(4); - - cpu_state.eaaddr = old_eaaddr + 112; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[5]) : x87_st_fsave(5); - - cpu_state.eaaddr = old_eaaddr + 128; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[6]) : x87_st_fsave(6); - - cpu_state.eaaddr = old_eaaddr + 144; - cpu_state.ismmx ? x87_stmmx(cpu_state.MM[7]) : x87_st_fsave(7); - - cpu_state.eaaddr = old_eaaddr; - - cpu_state.npxc = 0x37F; -#ifdef USE_NEW_DYNAREC - codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3); -#endif - cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00); - cpu_state.npxs = 0; - p = (uint64_t *)cpu_state.tag; - *p = 0x0303030303030303ll; - cpu_state.TOP = 0; - cpu_state.ismmx = 0; - - CLOCK_CYCLES((cr0 & 1) ? 56 : 67); - - if(cpu_state.abrt) x386_dynarec_log("FXSAVE: abrt != 0\n"); - } - - return cpu_state.abrt; + return fx_save_stor_common(fetchdat, 32); +} + + +static int +opHINT_NOP_a16(uint32_t fetchdat) +{ + fetch_ea_16(fetchdat); + CLOCK_CYCLES((is486) ? 1 : 3); + PREFETCH_RUN(3, 1, -1, 0,0,0,0, 0); + return 0; +} + + +static int +opHINT_NOP_a32(uint32_t fetchdat) +{ + fetch_ea_32(fetchdat); + CLOCK_CYCLES((is486) ? 1 : 3); + PREFETCH_RUN(3, 1, -1, 0,0,0,0, 0); + return 0; } From 21f979a748d3f6dd0ccec34465abd5e64674a4d9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 22 Apr 2020 01:29:14 +0200 Subject: [PATCH 13/43] A fix in mem_add_bios() to make non-AT+ machines not segmentation fault the emulator on startup. --- src/mem.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mem.c b/src/mem.c index be1589b3d..5bfd37fcf 100644 --- a/src/mem.c +++ b/src/mem.c @@ -2192,10 +2192,12 @@ mem_set_mem_state_smm(uint32_t base, uint32_t size, int state) void mem_add_bios(void) { - int temp_cpu_type, temp_cpu_16bitbus; + int temp_cpu_type, temp_cpu_16bitbus = 1; - temp_cpu_type = machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective].cpu_type; - temp_cpu_16bitbus = (temp_cpu_type == CPU_286 || temp_cpu_type == CPU_386SX || temp_cpu_type == CPU_486SLC || temp_cpu_type == CPU_IBM386SLC || temp_cpu_type == CPU_IBM486SLC ); + if (AT) { + temp_cpu_type = machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective].cpu_type; + temp_cpu_16bitbus = (temp_cpu_type == CPU_286 || temp_cpu_type == CPU_386SX || temp_cpu_type == CPU_486SLC || temp_cpu_type == CPU_IBM386SLC || temp_cpu_type == CPU_IBM486SLC ); + } if (biosmask > 0x1ffff) { /* 256k+ BIOS'es only have low mappings at E0000-FFFFF. */ From 15dcd63e728c40bfd01ac013a99bdd9b38c27134 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 22 Apr 2020 13:19:28 +0200 Subject: [PATCH 14/43] Console is now only initialized when the emulator is started with the -D / --debug parameter. --- src/win/win.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/win/win.c b/src/win/win.c index e79844528..e8d2af475 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -233,7 +233,8 @@ CreateConsole(int init) int i; if (! init) { - FreeConsole(); + if (force_debug) + FreeConsole(); return; } @@ -271,6 +272,13 @@ CreateConsole(int init) } +static void +CloseConsole(void) +{ + CreateConsole(0); +} + + /* Process the commandline, and create standard argc/argv array. */ static int ProcessCommandLine(wchar_t ***argw) @@ -362,7 +370,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) set_language(0x0409); /* Create console window. */ - CreateConsole(1); + if (force_debug) + CreateConsole(1); /* Process the command line for options. */ argc = ProcessCommandLine(&argw); @@ -370,7 +379,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) /* Pre-initialize the system, this loads the config file. */ if (! pc_init(argc, argw)) { /* Detach from console. */ - CreateConsole(0); + if (force_debug) + CreateConsole(0); if (source_hwnd) PostMessage((HWND) (uintptr_t) source_hwnd, WM_HAS_SHUTDOWN, (WPARAM) 0, (LPARAM) hwndMain); @@ -380,9 +390,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) return(1); } - /* Cleanup: we may no longer need the console. */ - if (! force_debug) - CreateConsole(0); + if (force_debug) + atexit(CloseConsole); /* Handle our GUI. */ i = ui_init(nCmdShow); From cf7ecacb9d07b980e279a5eed3ad012f628f309d Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 22 Apr 2020 22:11:01 +0200 Subject: [PATCH 15/43] Fixed a typo in the Sound Blaster IRQ update code, reported by TheCollector1995. --- src/sound/snd_sb_dsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index d9d1c3f5a..30b5ae23a 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -184,7 +184,7 @@ sb_update_irq(sb_dsp_t *dsp) irq_pending = (dsp->sb_irq8 && !dsp->sb_irqm8) || (dsp->sb_irq16 && !dsp->sb_irqm16) || - (dsp->sb_irq401 && !dsp->sb_irq401); + (dsp->sb_irq401 && !dsp->sb_irqm401); if (irq_pending) picint(1 << dsp->sb_irqnum); From 5073a2c37e9eecea1ad65a3084b453d3a92eff00 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 22 Apr 2020 22:29:25 +0200 Subject: [PATCH 16/43] The AZT MPU is not SB's UART MPU. --- src/sound/snd_azt2316a.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sound/snd_azt2316a.c b/src/sound/snd_azt2316a.c index 9e534a1d9..b88ee9abb 100644 --- a/src/sound/snd_azt2316a.c +++ b/src/sound/snd_azt2316a.c @@ -1179,7 +1179,6 @@ azt_init(const device_t *info) mpu401_init(azt2316a->mpu, azt2316a->cur_mpu401_addr, azt2316a->cur_mpu401_irq, M_UART, device_get_config_int("receive_input401")); } else azt2316a->mpu = NULL; - sb_dsp_set_mpu(&azt2316a->sb->dsp, azt2316a->mpu); if (device_get_config_int("receive_input")) midi_in_handler(1, sb_dsp_input_msg, sb_dsp_input_sysex, &azt2316a->sb->dsp); From d20c5d525c094428da5ae104b5ae1b10d6da1869 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 01:07:11 +0200 Subject: [PATCH 17/43] Fixed the old dynarec's MOD R/M tables to include the 3DNow! instructions, and both dynarec's MOD R/M tables to include the i686 hintable NOP's. --- src/cpu/codegen_x86-64.c | 4 ++-- src/cpu/codegen_x86.c | 6 +++--- src/cpu_new/codegen.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cpu/codegen_x86-64.c b/src/cpu/codegen_x86-64.c index a396e0008..051a3b414 100644 --- a/src/cpu/codegen_x86-64.c +++ b/src/cpu/codegen_x86-64.c @@ -548,8 +548,8 @@ static int opcode_modrm[256] = }; int opcode_0f_modrm[256] = { - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*10*/ + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*30*/ diff --git a/src/cpu/codegen_x86.c b/src/cpu/codegen_x86.c index 037c377a6..8755f2cd2 100644 --- a/src/cpu/codegen_x86.c +++ b/src/cpu/codegen_x86.c @@ -1660,8 +1660,8 @@ static int opcode_modrm[256] = }; int opcode_0f_modrm[256] = { - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*10*/ + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*30*/ @@ -1680,7 +1680,7 @@ int opcode_0f_modrm[256] = 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ }; - + void codegen_debug() { } diff --git a/src/cpu_new/codegen.c b/src/cpu_new/codegen.c index 96c64e2c5..e38dfb7a2 100644 --- a/src/cpu_new/codegen.c +++ b/src/cpu_new/codegen.c @@ -370,7 +370,7 @@ static uint8_t opcode_modrm[256] = static uint8_t opcode_0f_modrm[256] = { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*10*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*30*/ From 7dcb8f6f1f696db1ac48f57ad3b09e956c51ab87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 01:24:01 +0200 Subject: [PATCH 18/43] win: Add the "Media" menu to the menubar This is an alternative way to mount images to the virtual drives, as many people found the current behavior confusing. --- src/include/86box/language.h | 3 +- src/include/86box/win.h | 1 + src/win/86Box.rc | 1 + src/win/win_stbar.c | 463 +++++++++++++++++++++-------------- src/win/win_ui.c | 3 + 5 files changed, 281 insertions(+), 190 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index f112ec19f..7aa2e17ee 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -99,6 +99,7 @@ #define IDS_2123 2123 // "Unable to initialize Ghostscript..." #define IDS_2124 2124 // "MO %i (%03i): %ls" #define IDS_2125 2125 // "MO images (*.IM?)\0*.IM..." +#define IDS_2126 2126 // "Media" #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" @@ -177,7 +178,7 @@ #define IDS_LANG_ENUS IDS_7168 -#define STR_NUM_2048 78 +#define STR_NUM_2048 79 #define STR_NUM_3072 11 #define STR_NUM_4096 18 #define STR_NUM_4352 7 diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 597ebaa59..5498d3f07 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -168,6 +168,7 @@ extern void win_settings_open_ex(HWND hwnd, int category); /* Functions in win_stbar.c: */ extern HWND hwndSBAR; extern void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst); +extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /* Functions in win_dialog.c: */ diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 432a0b8c1..214dd945a 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -915,6 +915,7 @@ BEGIN IDS_2123 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)." IDS_2124 "MO %i (%03i): %ls" IDS_2125 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0" + IDS_2126 "&Media" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index ecb9c8a62..0dfd7af1d 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -72,6 +72,9 @@ static int sb_parts = 0; static int sb_ready = 0; static uint8_t sb_map[256]; +static HMENU hmenuMedia; +static HMENU *media_menu_handles; + /* Also used by win_settings.c */ intptr_t @@ -483,10 +486,33 @@ ui_sb_update_tip(int meaning) } SendMessage(hwndSBAR, SB_SETTIPTEXT, part, (LPARAM)sbTips[part]); + ModifyMenu(hmenuMedia, part, MF_BYPOSITION, (UINT_PTR)media_menu_handles[part], sbTips[part]); } } +static void +MediaMenuDestroyMenus(void) +{ + int i; + + if (sb_parts == 0) return; + + if (! media_menu_handles) return; + + for (i=0; iexit) + cdrom[id].ops->exit(&(cdrom[id])); + cdrom[id].ops = NULL; + memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); + cdrom_image_open(&(cdrom[id]), temp_path); + /* Signal media change to the emulated machine. */ + if (cdrom[id].insert) + cdrom[id].insert(cdrom[id].priv); + cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200; + if (cdrom[id].host_drive == 200) { + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_UNCHECKED); + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_CHECKED); + ui_sb_update_icon_state(SB_CDROM | id, 0); + } else { + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_UNCHECKED); + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_CHECKED); + ui_sb_update_icon_state(SB_CDROM | id, 1); + } + ui_sb_enable_menu_item(SB_CDROM | id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED); + ui_sb_update_tip(SB_CDROM | id); + config_save(); + } + break; + + case IDM_ZIP_IMAGE_NEW: + id = item_params & 0x0003; + part = sb_map[SB_ZIP | id]; + NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ + break; + + case IDM_ZIP_IMAGE_EXISTING: + case IDM_ZIP_IMAGE_EXISTING_WP: + id = item_params & 0x0003; + part = sb_map[SB_ZIP | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + + ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0); + if (! ret) + ui_sb_mount_zip_img(id, part, (item_id == IDM_ZIP_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); + break; + + case IDM_ZIP_EJECT: + id = item_params & 0x0003; + zip_eject(id); + break; + + case IDM_ZIP_RELOAD: + id = item_params & 0x0003; + zip_reload(id); + break; + + case IDM_MO_IMAGE_NEW: + id = item_params & 0x0003; + part = sb_map[SB_MO | id]; + NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ + break; + + case IDM_MO_IMAGE_EXISTING: + case IDM_MO_IMAGE_EXISTING_WP: + id = item_params & 0x0003; + part = sb_map[SB_MO | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + + ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0); + if (! ret) + ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); + break; + + case IDM_MO_EJECT: + id = item_params & 0x0003; + mo_eject(id); + break; + + case IDM_MO_RELOAD: + id = item_params & 0x0003; + mo_reload(id); + break; + + default: + return(0); + } + + return(1); +} + /* Handle messages for the Status Bar window. */ #if defined(__amd64__) || defined(__aarch64__) @@ -921,195 +1177,13 @@ static BOOL CALLBACK #endif StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - WCHAR temp_path[1024]; RECT rc; POINT pt; - int ret = 0; int item_id = 0; - int item_params = 0; - int id = 0; - uint8_t part = 0; switch (message) { case WM_COMMAND: - item_id = LOWORD(wParam) & 0xff00; /* low 8 bits */ - item_params = LOWORD(wParam) & 0x00ff; /* high 8 bits */ - - switch (item_id) { - case IDM_FLOPPY_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - NewFloppyDialogCreate(hwnd, id, part); - break; - - case IDM_FLOPPY_IMAGE_EXISTING: - case IDM_FLOPPY_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2118, floppyfns[id], 0); - if (! ret) - ui_sb_mount_floppy_img(id, part, (item_id == IDM_FLOPPY_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_FLOPPY_EJECT: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - fdd_close(id); - ui_sb_update_icon_state(SB_FLOPPY | id, 1); - EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED); - EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | MF_GRAYED); - ui_sb_update_tip(SB_FLOPPY | id); - config_save(); - break; - - case IDM_FLOPPY_EXPORT_TO_86F: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2076, floppyfns[id], 1); - if (! ret) { - plat_pause(1); - ret = d86f_export(id, wopenfilestring); - if (!ret) - ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108); - plat_pause(0); - } - break; - - case IDM_CDROM_MUTE: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom[id].sound_on ^= 1; - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_MUTE | id, cdrom[id].sound_on ? MF_UNCHECKED : MF_CHECKED); - config_save(); - sound_cd_thread_reset(); - break; - - case IDM_CDROM_EMPTY: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom_eject(id); - break; - - case IDM_CDROM_RELOAD: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom_reload(id); - break; - - case IDM_CDROM_IMAGE: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) { - cdrom[id].prev_host_drive = cdrom[id].host_drive; - wcscpy(temp_path, wopenfilestring); - wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path); - if (cdrom[id].ops && cdrom[id].ops->exit) - cdrom[id].ops->exit(&(cdrom[id])); - cdrom[id].ops = NULL; - memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); - cdrom_image_open(&(cdrom[id]), temp_path); - /* Signal media change to the emulated machine. */ - if (cdrom[id].insert) - cdrom[id].insert(cdrom[id].priv); - cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200; - if (cdrom[id].host_drive == 200) { - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED); - ui_sb_update_icon_state(SB_CDROM | id, 0); - } else { - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_CHECKED); - ui_sb_update_icon_state(SB_CDROM | id, 1); - } - EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED); - ui_sb_update_tip(SB_CDROM | id); - config_save(); - } - break; - - case IDM_ZIP_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_ZIP | id]; - NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ - break; - - case IDM_ZIP_IMAGE_EXISTING: - case IDM_ZIP_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_ZIP | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0); - if (! ret) - ui_sb_mount_zip_img(id, part, (item_id == IDM_ZIP_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_ZIP_EJECT: - id = item_params & 0x0003; - zip_eject(id); - break; - - case IDM_ZIP_RELOAD: - id = item_params & 0x0003; - zip_reload(id); - break; - - case IDM_MO_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_MO | id]; - NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ - break; - - case IDM_MO_IMAGE_EXISTING: - case IDM_MO_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_MO | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0); - if (! ret) - ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_MO_EJECT: - id = item_params & 0x0003; - mo_eject(id); - break; - - case IDM_MO_RELOAD: - id = item_params & 0x0003; - mo_reload(id); - break; - - default: - break; - } + MediaMenuHandler(hwnd, message, wParam, lParam); return(0); case WM_LBUTTONDOWN: @@ -1148,6 +1222,7 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) RECT rectDialog; int dw, dh; uint8_t i; + HMENU hmenu; /* Load our icons into the cache for faster access. */ for (i = 16; i < 18; i++) @@ -1219,6 +1294,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) memset(sb_menu_handles, 0, sb_parts * sizeof(HMENU)); sbTips = (WCHAR **)malloc(sb_parts * sizeof(WCHAR *)); memset(sbTips, 0, sb_parts * sizeof(WCHAR *)); + media_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU)); + memset(media_menu_handles, 0, sb_parts * sizeof(HMENU)); sb_parts = 0; iStatusWidths[sb_parts] = -1; sb_part_meanings[sb_parts] = SB_TEXT; @@ -1227,6 +1304,12 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths); SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)L"Welcome to 86Box !"); + + hmenu = GetMenu(hwndParent); + hmenuMedia = CreatePopupMenu(); + InsertMenu(hmenu, 2, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, plat_get_string(IDS_2126)); + DrawMenuBar(hwndParent); + sb_ready = 1; } @@ -1245,6 +1328,7 @@ ui_sb_check_menu_item(int tag, int id, int chk) return; CheckMenuItem(sb_menu_handles[part], id, chk); + CheckMenuItem(media_menu_handles[part], id, chk); } @@ -1262,6 +1346,7 @@ ui_sb_enable_menu_item(int tag, int id, int flg) return; EnableMenuItem(sb_menu_handles[part], id, flg); + EnableMenuItem(media_menu_handles[part], id, flg); } diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 2a9099c3f..cc4240949 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -594,6 +594,9 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) svga_dump_vram(); break; #endif + default: + MediaMenuHandler(hwnd, message, wParam, lParam); + break; } return(0); From 870fdaef3df769b8ff5a402fe9caaa5c239159d6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 02:22:27 +0200 Subject: [PATCH 19/43] Fixed some warnings in win_jsconf.c. --- src/win/win_jsconf.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/win/win_jsconf.c b/src/win/win_jsconf.c index f4269871b..a557f753d 100644 --- a/src/win/win_jsconf.c +++ b/src/win/win_jsconf.c @@ -59,7 +59,7 @@ static void rebuild_axis_button_selections(HWND hdlg) sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s); } - for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) + for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) { SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick - 1].slider[d].name); } @@ -126,8 +126,7 @@ static int get_axis(HWND hdlg, int id) HWND h = GetDlgItem(hdlg, id); int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0); int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_axes; - int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs; - int nr_sliders = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_sliders; + int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs; if (axis_sel < nr_axes) return axis_sel; @@ -175,7 +174,6 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) int joystick; int nr_axes; int nr_povs; - int nr_sliders; int mapping; switch (message) @@ -199,7 +197,6 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { nr_axes = plat_joystick_state[joystick-1].nr_axes; nr_povs = plat_joystick_state[joystick-1].nr_povs; - nr_sliders = plat_joystick_state[joystick - 1].nr_sliders; for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) { @@ -211,8 +208,8 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else if (mapping & POV_Y) SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2 + 1, 0); else if (mapping & SLIDER) - SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0); - else + SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0); + else SendMessage(h, CB_SETCURSEL, mapping, 0); id += 2; } From e3296f452964d462519868ac9db70a3188634efd Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 02:23:59 +0200 Subject: [PATCH 20/43] Split USB and Distributed DMA into their own files in preparation for the overhaul of the VIA southbridges. --- src/ddma.c | 200 +++++++++++++++++++++++++++++ src/include/86box/ddma.h | 56 ++++++++ src/include/86box/usb.h | 86 +++++++------ src/intel_piix.c | 253 +++---------------------------------- src/usb.c | 196 +++++++++++++++++++++++----- src/win/Makefile.mingw | 6 +- src/win/Makefile_ndr.mingw | 6 +- 7 files changed, 496 insertions(+), 307 deletions(-) create mode 100644 src/ddma.c create mode 100644 src/include/86box/ddma.h diff --git a/src/ddma.c b/src/ddma.c new file mode 100644 index 000000000..98e4da293 --- /dev/null +++ b/src/ddma.c @@ -0,0 +1,200 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include "cpu.h" +#include <86box/device.h> +#include <86box/mem.h> +#include <86box/io.h> +#include <86box/pci.h> +#include <86box/pic.h> +#include <86box/timer.h> +#include <86box/keyboard.h> +#include <86box/nvr.h> +#include <86box/pit.h> +#include <86box/dma.h> +#include <86box/ddma.h> + + +#ifdef ENABLE_DDMA_LOG +int ddma_do_log = ENABLE_DDMA_LOG; + + +static void +ddma_log(const char *fmt, ...) +{ + va_list ap; + + if (ddma_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define ddma_log(fmt, ...) +#endif + +static uint8_t +ddma_reg_read(uint16_t addr, void *p) +{ + ddma_channel_t *dev = (ddma_channel_t *) p; + uint8_t ret = 0xff; + int ch = dev->channel; + int dmab = (ch >= 4) ? 0xc0 : 0x00; + + switch (addr & 0x0f) { + case 0x00: + ret = dma[ch].ac & 0xff; + break; + case 0x01: + ret = (dma[ch].ac >> 8) & 0xff; + break; + case 0x02: + ret = dma[ch].page; + break; + case 0x04: + ret = dma[ch].cc & 0xff; + break; + case 0x05: + ret = (dma[ch].cc >> 8) & 0xff; + break; + case 0x09: + ret = inb(dmab + 0x08); + break; + } + + return ret; +} + + +static void +ddma_reg_write(uint16_t addr, uint8_t val, void *p) +{ + ddma_channel_t *dev = (ddma_channel_t *) p; + int ch = dev->channel; + int page_regs[4] = { 7, 3, 1, 2 }; + int i, dmab = (ch >= 4) ? 0xc0 : 0x00; + + switch (addr & 0x0f) { + case 0x00: + dma[ch].ab = (dma[ch].ab & 0xffff00) | val; + dma[ch].ac = dma[ch].ab; + break; + case 0x01: + dma[ch].ab = (dma[ch].ab & 0xff00ff) | (val << 8); + dma[ch].ac = dma[ch].ab; + break; + case 0x02: + if (ch >= 4) + outb(0x88 + page_regs[ch], val); + else + outb(0x80 + page_regs[ch], val); + break; + case 0x04: + dma[ch].cb = (dma[ch].cb & 0xffff00) | val; + dma[ch].cc = dma[ch].cb; + break; + case 0x05: + dma[ch].cb = (dma[ch].cb & 0xff00ff) | (val << 8); + dma[ch].cc = dma[ch].cb; + break; + case 0x08: + outb(dmab + 0x08, val); + break; + case 0x09: + outb(dmab + 0x09, val); + break; + case 0x0a: + outb(dmab + 0x0a, val); + break; + case 0x0b: + outb(dmab + 0x0b, val); + break; + case 0x0d: + outb(dmab + 0x0d, val); + break; + case 0x0e: + for (i = 0; i < 4; i++) + outb(dmab + 0x0a, i); + break; + case 0x0f: + outb(dmab + 0x0a, (val << 2) | (ch & 3)); + break; + } +} + + +void +ddma_update_io_mapping(ddma_t *dev, int ch, uint8_t base_l, uint8_t base_h, int enable) +{ + if (dev->channels[ch].enable && (dev->channels[ch].io_base != 0x0000)) + io_removehandler(dev->channels[ch].io_base, 0x10, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->channels[ch]); + + dev->channels[ch].io_base = base_l | (base_h << 8); + dev->channels[ch].enable = enable; + + if (dev->channels[ch].enable && (dev->channels[ch].io_base != 0x0000)) + io_sethandler(dev->channels[ch].io_base, 0x10, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->channels[ch]); +} + + +static void +ddma_close(void *priv) +{ + ddma_t *dev = (ddma_t *) priv; + + free(dev); +} + + +static void * +ddma_init(const device_t *info) +{ + ddma_t *dev; + int i; + + dev = (ddma_t *)malloc(sizeof(ddma_t)); + if (dev == NULL) return(NULL); + memset(dev, 0x00, sizeof(ddma_t)); + + for (i = 0; i < 8; i++) + dev->channels[i].channel = i; + + return dev; +} + + +const device_t ddma_device = +{ + "Distributed DMA", + DEVICE_PCI, + 0, + ddma_init, + ddma_close, + NULL, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/include/86box/ddma.h b/src/include/86box/ddma.h new file mode 100644 index 000000000..2d0a9f8d9 --- /dev/null +++ b/src/include/86box/ddma.h @@ -0,0 +1,56 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) + * + * Definitions for the Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#ifndef DDMA_H +# define DDMA_H + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + uint16_t io_base; + int channel, enable; +} ddma_channel_t; + +typedef struct +{ + ddma_channel_t channels[8]; +} ddma_t; + + +/* Global variables. */ +extern const device_t ddma_device; + + +/* Functions. */ +extern void ddma_update_io_mapping(ddma_t *dev, int ch, uint8_t base_l, uint8_t base_h, int enable); + +#ifdef __cplusplus +} +#endif + + +#endif /*DDMA_H*/ diff --git a/src/include/86box/usb.h b/src/include/86box/usb.h index 69adcf96b..b027796a2 100644 --- a/src/include/86box/usb.h +++ b/src/include/86box/usb.h @@ -1,41 +1,55 @@ -/* Copyright holders: Melissa Goad - see COPYING for more details -*/ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) + * + * Definitions for the Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#ifndef USB_H +# define USB_H + + +#ifdef __cplusplus +extern "C" { +#endif typedef struct { - uint8_t pid; //low 4 bits are the real pid, top 4 bits are just ~pid - uint8_t dev_addr; - uint8_t dev_endpoint; - int crc5; - uint16_t crc16; - uint8_t data[1024]; - int len; - void* device; -} usb_packet_t; + uint8_t ohci_mmio[4096]; + uint16_t uhci_io_base; + int uhci_enable, ohci_enable; + uint32_t ohci_mem_base; + mem_mapping_t ohci_mmio_mapping; +} usb_t; -typedef enum -{ - USB_DEV_TYPE_NONE = 0, - USB_DEV_TYPE_MOUSE, - USB_DEV_TYPE_TABLET, - USB_DEV_TYPE_KEYPAD, - USB_DEV_TYPE_DISK, - USB_DEV_TYPE_CDROM, - USB_DEV_TYPE_HUB, - USB_DEV_TYPE_PRINTER -} usb_device_type_t; -typedef enum -{ - USB_PID_TOKEN_STALL = 0x1e, - USB_PID_TOKEN_SETUP = 0x2d, - USB_PID_TOKEN_PRE = 0x3c, - USB_PID_TOKEN_DATA1 = 0x4b, - USB_PID_TOKEN_NAK = 0x5a, - USB_PID_TOKEN_IN = 0x69, - USB_PID_TOKEN_SOF = 0xa5, - USB_PID_TOKEN_DATA0 = 0xc3, - USB_PID_TOKEN_ACK = 0xd2, - USB_PID_TOKEN_OUT = 0xe1 -} usb_pid_type_t; \ No newline at end of file +/* Global variables. */ +extern const device_t usb_device; + + +/* Functions. */ +extern void uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable); +extern void ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable); + +#ifdef __cplusplus +} +#endif + + +#endif /*USB_H*/ diff --git a/src/intel_piix.c b/src/intel_piix.c index 8e83e0f0e..33061c4dd 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -40,6 +40,7 @@ #include <86box/timer.h> #include <86box/nvr.h> #include <86box/acpi.h> +#include <86box/ddma.h> #include <86box/pci.h> #include <86box/pic.h> #include <86box/pit.h> @@ -47,19 +48,13 @@ #include <86box/hdc.h> #include <86box/hdc_ide.h> #include <86box/hdc_ide_sff8038i.h> +#include <86box/usb.h> #include <86box/zip.h> #include <86box/machine.h> #include <86box/smbus_piix4.h> #include <86box/piix.h> -typedef struct -{ - uint16_t io_base; - int base_channel; -} ddma_t; - - typedef struct { uint8_t cur_readout_reg, rev, @@ -68,15 +63,14 @@ typedef struct regs[4][256], readout_regs[256], board_config[2]; uint16_t func0_id, nvr_io_base, - usb_io_base, acpi_io_base; + acpi_io_base; double fast_off_period; - uint8_t *usb_smsc_mmio; - mem_mapping_t usb_smsc_mmio_mapping; sff8038i_t *bm[2]; - ddma_t ddma[2]; smbus_piix4_t * smbus; apm_t * apm; nvr_t * nvr; + ddma_t * ddma; + usb_t * usb; acpi_t * acpi; port_92_t * port_92; pc_timer_t fast_off_timer; @@ -246,200 +240,6 @@ kbc_alias_update_io_mapping(piix_t *dev) } -static uint8_t -ddma_reg_read(uint16_t addr, void *p) -{ - ddma_t *dev = (ddma_t *) p; - uint8_t ret = 0xff; - int rel_ch = (addr & 0x30) >> 4; - int ch = dev->base_channel + rel_ch; - int dmab = (ch >= 4) ? 0xc0 : 0x00; - - switch (addr & 0x0f) { - case 0x00: - ret = dma[ch].ac & 0xff; - break; - case 0x01: - ret = (dma[ch].ac >> 8) & 0xff; - break; - case 0x02: - ret = dma[ch].page; - break; - case 0x04: - ret = dma[ch].cc & 0xff; - break; - case 0x05: - ret = (dma[ch].cc >> 8) & 0xff; - break; - case 0x09: - ret = inb(dmab + 0x08); - break; - } - - return ret; -} - - -static void -ddma_reg_write(uint16_t addr, uint8_t val, void *p) -{ - ddma_t *dev = (ddma_t *) p; - int rel_ch = (addr & 0x30) >> 4; - int ch = dev->base_channel + rel_ch; - int page_regs[4] = { 7, 3, 1, 2 }; - int i, dmab = (ch >= 4) ? 0xc0 : 0x00; - - switch (addr & 0x0f) { - case 0x00: - dma[ch].ab = (dma[ch].ab & 0xffff00) | val; - dma[ch].ac = dma[ch].ab; - break; - case 0x01: - dma[ch].ab = (dma[ch].ab & 0xff00ff) | (val << 8); - dma[ch].ac = dma[ch].ab; - break; - case 0x02: - if (ch >= 4) - outb(0x88 + page_regs[rel_ch], val); - else - outb(0x80 + page_regs[rel_ch], val); - break; - case 0x04: - dma[ch].cb = (dma[ch].cb & 0xffff00) | val; - dma[ch].cc = dma[ch].cb; - break; - case 0x05: - dma[ch].cb = (dma[ch].cb & 0xff00ff) | (val << 8); - dma[ch].cc = dma[ch].cb; - break; - case 0x08: - outb(dmab + 0x08, val); - break; - case 0x09: - outb(dmab + 0x09, val); - break; - case 0x0a: - outb(dmab + 0x0a, val); - break; - case 0x0b: - outb(dmab + 0x0b, val); - break; - case 0x0d: - outb(dmab + 0x0d, val); - break; - case 0x0e: - for (i = 0; i < 4; i++) - outb(dmab + 0x0a, i); - break; - case 0x0f: - outb(dmab + 0x0a, (val << 2) | rel_ch); - break; - } -} - - -static void -ddma_update_io_mapping(piix_t *dev, int n) -{ - int base_reg = 0x92 + (n << 1); - - if (dev->ddma[n].io_base != 0x0000) - io_removehandler(dev->ddma[n].io_base, 0x40, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->ddma[n]); - - dev->ddma[n].io_base = (dev->regs[0][base_reg] & ~0x3f) | (dev->regs[0][base_reg + 1] << 8); - - if (dev->ddma[n].io_base != 0x0000) - io_sethandler(dev->ddma[n].io_base, 0x40, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->ddma[n]); -} - - -static uint8_t -usb_reg_read(uint16_t addr, void *p) -{ - uint8_t ret = 0xff; - - switch (addr & 0x1f) { - case 0x10: case 0x11: case 0x12: case 0x13: - /* Port status */ - ret = 0x00; - break; - } - - return ret; -} - - -static void -usb_reg_write(uint16_t addr, uint8_t val, void *p) -{ -} - - -static void -usb_update_io_mapping(piix_t *dev) -{ - if (dev->usb_io_base != 0x0000) - io_removehandler(dev->usb_io_base, 0x20, usb_reg_read, NULL, NULL, usb_reg_write, NULL, NULL, dev); - - dev->usb_io_base = (dev->regs[2][0x20] & ~0x1f) | (dev->regs[2][0x21] << 8); - - if ((dev->regs[2][PCI_REG_COMMAND] & PCI_COMMAND_IO) && (dev->usb_io_base != 0x0000)) - io_sethandler(dev->usb_io_base, 0x20, usb_reg_read, NULL, NULL, usb_reg_write, NULL, NULL, dev); -} - - -static void -usb_smsc_update_mem_mapping(piix_t *dev) -{ - uint32_t usb_bar; - - mem_mapping_disable(&dev->usb_smsc_mmio_mapping); - - usb_bar = ((dev->regs[2][0x11] << 8) | (dev->regs[2][0x12] << 16) | (dev->regs[2][0x13] << 24)) & 0xfffff000; - - if ((dev->regs[2][0x04] & 0x02) && (usb_bar != 0x00000000)) - mem_mapping_set_addr(&dev->usb_smsc_mmio_mapping, usb_bar, 0x1000); -} - - -static uint8_t -usb_smsc_mmio_read(uint32_t addr, void *p) -{ - piix_t *dev = (piix_t *) p; - uint8_t ret = 0x00; - - addr &= 0x00000fff; - - ret = dev->usb_smsc_mmio[addr]; - - return ret; -} - - -static void -usb_smsc_mmio_write(uint32_t addr, uint8_t val, void *p) -{ - piix_t *dev = (piix_t *) p; - - addr &= 0x00000fff; - - switch (addr) { - case 0x08: /* HCCOMMANDSTATUS */ - /* bit HostControllerReset must be cleared for the controller to be seen as initialized */ - val &= ~0x01; - - /* bit OwnershipChangeRequest triggers an ownership change (SMM <-> OS) */ - if (val & 0x0f) { - dev->usb_smsc_mmio[0x0f] = 0x40; - dev->usb_smsc_mmio[0x05] &= ~(dev->usb_smsc_mmio[0x05] & 0x01); - } - break; - } - - dev->usb_smsc_mmio[addr] = val; -} - - static void smbus_update_io_mapping(piix_t *dev) { @@ -480,6 +280,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) { piix_t *dev = (piix_t *) priv; uint8_t *fregs; + int i; /* Return on unsupported function. */ if (dev->max_func > 0) { @@ -643,10 +444,12 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x92: case 0x93: case 0x94: case 0x95: if (dev->type > 3) { if (addr & 0x01) - fregs[addr] = val & 0xc0; - else fregs[addr] = val & 0xff; - ddma_update_io_mapping(dev, (addr >> 2) & 1); + else + fregs[addr] = val & 0xc0; + + for (i = 0; i < 4; i++) + ddma_update_io_mapping(dev->ddma, (addr & 4) + i, fregs[addr & 0xfe] + (i << 4), fregs[addr | 0x01], 1); } break; case 0xa0: @@ -886,10 +689,10 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x04: if (dev->type > 4) { fregs[0x04] = (val & 7); - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } else { fregs[0x04] = (val & 5); - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x07: @@ -917,25 +720,25 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x11: if (dev->type > 4) { fregs[addr] = val & 0xf0; - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } break; case 0x12: case 0x13: if (dev->type > 4) { fregs[addr] = val; - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } break; case 0x20: if (dev->type < 5) { fregs[0x20] = (val & 0xe0) | 1; - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x21: if (dev->type < 5) { fregs[0x21] = val; - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x3c: @@ -1263,14 +1066,6 @@ piix_reset_hard(piix_t *dev) fregs[0xff] = (dev->type > 3) ? 0x10 : 0x00; } dev->max_func = 1; /* It starts with USB disabled, then enables it. */ - - /* SMSC OHCI memory-mapped registers */ - if (dev->usb_smsc_mmio) { - memset(dev->usb_smsc_mmio, 0, 4096); - dev->usb_smsc_mmio[0x00] = 0x10; - dev->usb_smsc_mmio[0x01] = 0x01; - dev->usb_smsc_mmio[0x48] = 0x02; - } } /* Function 3: Power Management */ @@ -1394,20 +1189,12 @@ static void dev->acpi = device_add(&acpi_device); acpi_set_slot(dev->acpi, dev->pci_slot); acpi_set_nvr(dev->acpi, dev->nvr); + + dev->ddma = device_add(&ddma_device); + dev->usb = device_add(&usb_device); } else timer_add(&dev->fast_off_timer, piix_fast_off_count, dev, 0); - if (dev->type > 4) { - dev->usb_smsc_mmio = (uint8_t *) malloc(4096); - memset(dev->usb_smsc_mmio, 0x00, 4096); - - mem_mapping_add(&dev->usb_smsc_mmio_mapping, 0, 0, - usb_smsc_mmio_read, NULL, NULL, - usb_smsc_mmio_write, NULL, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - mem_mapping_disable(&dev->usb_smsc_mmio_mapping); - } - piix_reset_hard(dev); piix_log("Maximum function: %i\n", dev->max_func); cpu_fast_off_flags = 0x00000000; diff --git a/src/usb.c b/src/usb.c index 721289afb..9b04c0383 100644 --- a/src/usb.c +++ b/src/usb.c @@ -1,53 +1,185 @@ -/* Copyright holders: Melissa Goad - see COPYING for more details -*/ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Universal Serial Bus emulation (currently dummy UHCI and + * OHCI). + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#include #include #include +#include #include #include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> #include <86box/io.h> #include <86box/mem.h> #include <86box/usb.h> -void *usb_priv[32]; -static int usb_min_card, usb_max_card; +#ifdef ENABLE_USB_LOG +int usb_do_log = ENABLE_USB_LOG; -void (*usb_packet_handle[32])(usb_packet_t* packet, void *priv); - - -void usb_init(int min_card, int max_card) +static void +usb_log(const char *fmt, ...) { - int c; - - for (c = 0; c < 32; c++) - usb_packet_handle[c] = usb_priv[c] = NULL; - - usb_min_card = min_card; - usb_max_card = max_card; + va_list ap; + + if (usb_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define usb_log(fmt, ...) +#endif + + +static uint8_t +uhci_reg_read(uint16_t addr, void *p) +{ + uint8_t ret = 0xff; + + switch (addr & 0x1f) { + case 0x10: case 0x11: case 0x12: case 0x13: + /* Port status */ + ret = 0x00; + break; + } + + return ret; } -void usb_add_specific(int card, void (*packet_handle)(usb_packet_t *packet, void *priv), void *priv) +static void +uhci_reg_write(uint16_t addr, uint8_t val, void *p) { - usb_packet_handle[card] = packet_handle; - usb_priv[card] = priv; } -void usb_add(void (*packet_handle)(usb_packet_t *packet, void *priv), void *priv) +void +uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable) { - int c; - - for (c = usb_min_card; c <= usb_max_card; c++) - { - if (!usb_packet_handle[c]) - { - usb_packet_handle[c] = packet_handle; - usb_priv[c] = priv; - // pclog("USB device added to card: %i\n", c); - return; - } - } + if (dev->uhci_enable && (dev->uhci_io_base != 0x0000)) + io_removehandler(dev->uhci_io_base, 0x20, uhci_reg_read, NULL, NULL, uhci_reg_write, NULL, NULL, dev); + + dev->uhci_io_base = base_l | (base_h << 8); + dev->uhci_enable = enable; + + if (dev->uhci_enable && (dev->uhci_io_base != 0x0000)) + io_sethandler(dev->uhci_io_base, 0x20, uhci_reg_read, NULL, NULL, uhci_reg_write, NULL, NULL, dev); } + + +static uint8_t +ohci_mmio_read(uint32_t addr, void *p) +{ + usb_t *dev = (usb_t *) p; + uint8_t ret = 0x00; + + addr &= 0x00000fff; + + ret = dev->ohci_mmio[addr]; + + return ret; +} + + +static void +ohci_mmio_write(uint32_t addr, uint8_t val, void *p) +{ + usb_t *dev = (usb_t *) p; + + addr &= 0x00000fff; + + switch (addr) { + case 0x08: /* HCCOMMANDSTATUS */ + /* bit HostControllerReset must be cleared for the controller to be seen as initialized */ + val &= ~0x01; + + /* bit OwnershipChangeRequest triggers an ownership change (SMM <-> OS) */ + if (val & 0x0f) { + dev->ohci_mmio[0x0f] = 0x40; + dev->ohci_mmio[0x05] &= ~(dev->ohci_mmio[0x05] & 0x01); + } + break; + } + + dev->ohci_mmio[addr] = val; +} + + +void +ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable) +{ + if (dev->ohci_enable && (dev->ohci_mem_base != 0x00000000)) + mem_mapping_disable(&dev->ohci_mmio_mapping); + + dev->ohci_mem_base = ((base1 << 8) | (base2 << 16) | (base3 << 24)) & 0xfffff000; + dev->ohci_enable = enable; + + if (dev->ohci_enable && (dev->ohci_mem_base != 0x00000000)) + mem_mapping_set_addr(&dev->ohci_mmio_mapping, dev->ohci_mem_base, 0x1000); +} + + +static void +usb_close(void *priv) +{ + usb_t *dev = (usb_t *) priv; + + free(dev); +} + + +static void * +usb_init(const device_t *info) +{ + usb_t *dev; + + dev = (usb_t *)malloc(sizeof(usb_t)); + if (dev == NULL) return(NULL); + memset(dev, 0x00, sizeof(usb_t)); + + memset(dev->ohci_mmio, 0x00, 4096); + dev->ohci_mmio[0x00] = 0x10; + dev->ohci_mmio[0x01] = 0x01; + dev->ohci_mmio[0x48] = 0x02; + + mem_mapping_add(&dev->ohci_mmio_mapping, 0, 0, + ohci_mmio_read, NULL, NULL, + ohci_mmio_write, NULL, NULL, + NULL, MEM_MAPPING_EXTERNAL, dev); + mem_mapping_disable(&dev->ohci_mmio_mapping); + + return dev; +} + + +const device_t usb_device = +{ + "Universal Serial Bus", + DEVICE_PCI, + 0, + usb_init, + usb_close, + NULL, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index f48318b7d..f8044ddd5 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -512,9 +512,9 @@ CXXFLAGS := $(CFLAGS) ######################################################################### # Create the (final) list of objects to build. # ######################################################################### -MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o nmi.o \ - pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o \ - rom.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ +MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ + nmi.o pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o rom.o \ + usb.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ via_vt82c596b.o $(VNCOBJ) INTELOBJ := intel_flash.o \ diff --git a/src/win/Makefile_ndr.mingw b/src/win/Makefile_ndr.mingw index a5242812d..1a15963e6 100644 --- a/src/win/Makefile_ndr.mingw +++ b/src/win/Makefile_ndr.mingw @@ -516,9 +516,9 @@ CXXFLAGS := $(CFLAGS) ######################################################################### # Create the (final) list of objects to build. # ######################################################################### -MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o nmi.o \ - pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o \ - rom.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ +MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ + nmi.o pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o rom.o \ + usb.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ via_vt82c596b.o $(VNCOBJ) INTELOBJ := intel_flash.o \ From 3b85d4f0c7ef0ee1490a2d5583838f4c090baf1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 12:58:19 +0200 Subject: [PATCH 21/43] win: Add a placeholder menuitem for the Media menu This makes it possible to change the position of the menu by only editing the resource script itself. --- src/include/86box/resource.h | 2 ++ src/win/86Box.rc | 1 + src/win/win_stbar.c | 29 +++++++++++++++++++++++------ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 60990f691..59dc27d0d 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -300,6 +300,8 @@ #define IDM_VID_GRAY_GREEN 40083 #define IDM_VID_GRAY_WHITE 40084 +#define IDM_MEDIA 40085 + #ifdef USE_DISCORD #define IDM_DISCORD 40090 #endif diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 214dd945a..caba77e71 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -112,6 +112,7 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON END + MENUITEM "&Media", IDM_MEDIA POPUP "&Tools" BEGIN MENUITEM "&Settings...", IDM_CONFIG diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index 0dfd7af1d..080afad72 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -1215,6 +1215,27 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } +void +MediaMenuCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) +{ + HMENU hmenu; + LPWSTR lpMenuName; + + hmenu = GetMenu(hwndParent); + hmenuMedia = CreatePopupMenu(); + + int len = GetMenuString(hmenu, IDM_MEDIA, NULL, 0, MF_BYCOMMAND); + lpMenuName = malloc((len + 1) * sizeof(WCHAR)); + GetMenuString(hmenu, IDM_MEDIA, lpMenuName, len + 1, MF_BYCOMMAND); + + InsertMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, lpMenuName); + RemoveMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND); + DrawMenuBar(hwndParent); + + free(lpMenuName); +} + + /* API: Create and set up the Status Bar window. */ void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) @@ -1222,7 +1243,6 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) RECT rectDialog; int dw, dh; uint8_t i; - HMENU hmenu; /* Load our icons into the cache for faster access. */ for (i = 16; i < 18; i++) @@ -1305,11 +1325,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)L"Welcome to 86Box !"); - hmenu = GetMenu(hwndParent); - hmenuMedia = CreatePopupMenu(); - InsertMenu(hmenu, 2, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, plat_get_string(IDS_2126)); - DrawMenuBar(hwndParent); - + MediaMenuCreate(hwndParent, idStatus, hInst); + sb_ready = 1; } From cab0bb845ad375d9f83318161c939ed7c950061f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 13:02:14 +0200 Subject: [PATCH 22/43] win: Move the statusbar initial text to resources --- src/include/86box/language.h | 2 +- src/win/86Box.rc | 2 +- src/win/win_stbar.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 7aa2e17ee..9b3065be9 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -99,7 +99,7 @@ #define IDS_2123 2123 // "Unable to initialize Ghostscript..." #define IDS_2124 2124 // "MO %i (%03i): %ls" #define IDS_2125 2125 // "MO images (*.IM?)\0*.IM..." -#define IDS_2126 2126 // "Media" +#define IDS_2126 2126 // "Welcome to 86Box!" #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" diff --git a/src/win/86Box.rc b/src/win/86Box.rc index caba77e71..c71fb8b43 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -916,7 +916,7 @@ BEGIN IDS_2123 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)." IDS_2124 "MO %i (%03i): %ls" IDS_2125 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0" - IDS_2126 "&Media" + IDS_2126 "Welcome to 86Box!" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index 080afad72..bdbd13f87 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -1323,7 +1323,7 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) sb_parts++; SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths); SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, - (LPARAM)L"Welcome to 86Box !"); + (LPARAM)plat_get_string(IDS_2126)); MediaMenuCreate(hwndParent, idStatus, hInst); From 812999f480d27f77d771d386abb995aaa0070c78 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 14:42:32 +0200 Subject: [PATCH 23/43] The PIIX code now also initializes the USB device on the PIIX3, fixes #713. --- src/intel_piix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/intel_piix.c b/src/intel_piix.c index 33061c4dd..64f5c6c0a 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -1182,6 +1182,9 @@ static void dev->bm[0] = device_add_inst(&sff8038i_device, 1); dev->bm[1] = device_add_inst(&sff8038i_device, 2); + if (dev->type >= 3) + dev->usb = device_add(&usb_device); + if (dev->type > 3) { dev->nvr = device_add(&piix4_nvr_device); dev->smbus = device_add(&piix4_smbus_device); @@ -1191,7 +1194,6 @@ static void acpi_set_nvr(dev->acpi, dev->nvr); dev->ddma = device_add(&ddma_device); - dev->usb = device_add(&usb_device); } else timer_add(&dev->fast_off_timer, piix_fast_off_count, dev, 0); From 8b8ba3d5a797e0269e7bfb7feccefe69db3cf06c Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 15:11:32 +0200 Subject: [PATCH 24/43] IDE sector and sector count now return 0xFF (noise) on an unassigned IDE device, fixed TC430HX hanging with empty IDE channels. --- src/disk/hdc_ide.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 4b2e46b13..2b6104ee8 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1815,12 +1815,13 @@ ide_readb(uint16_t addr, void *priv) case 0x2: /* Sector count */ if (ide->type == IDE_ATAPI) temp = ide->sc->phase; - else + else if (ide->type != IDE_NONE) temp = ide->secount; break; case 0x3: /* Sector */ - temp = (uint8_t) ide->sector; + if (ide->type != IDE_NONE) + temp = (uint8_t) ide->sector; break; case 0x4: /* Cylinder low */ From ae36bb093b134d3e99f8c69f49215f9882891877 Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Thu, 23 Apr 2020 16:57:52 +0300 Subject: [PATCH 25/43] 430VX rework Make the 430HX & 430VX Phoenix boards available while removed the 596B AMI machine --- src/include/86box/machine.h | 13 ++---- src/machine/m_at_socket370.c | 29 ------------ src/machine/m_at_socket7_s7.c | 86 +++++++++++++++++------------------ src/machine/machine_table.c | 38 ++++++++++++---- 4 files changed, 73 insertions(+), 93 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 838dc9a0d..c07f74ed7 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -287,15 +287,14 @@ extern int machine_at_acerv35n_init(const machine_t *); extern int machine_at_ap53_init(const machine_t *); extern int machine_at_p55t2p4_init(const machine_t *); extern int machine_at_p55t2s_init(const machine_t *); +extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); -extern int machine_at_equium5200_init(const machine_t *); /* Toshiba branded CU430HX. - Works as intended (No need to set an MPU too). */ +extern int machine_at_equium5200_init(const machine_t *); extern int machine_at_p55tvp4_init(const machine_t *); -extern int machine_at_i430vx_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); -extern int machine_at_j656vxd_init(const machine_t *); -extern int machine_at_mb520n_init(const machine_t *); +extern int machine_at_i430vx_init(const machine_t *); +extern int machine_at_brio80xx_init(const machine_t *); extern int machine_at_p55xb2_init(const machine_t *); extern int machine_at_tx97_init(const machine_t *); @@ -336,10 +335,6 @@ extern int machine_at_atc7020bxii_init(const machine_t *); extern int machine_at_63a_init(const machine_t *); extern int machine_at_apas3_init(const machine_t *); -#if defined(DEV_BRANCH) && defined(USE_596B) -extern int machine_at_bx98_init(const machine_t *); -#endif - /* m_at_t3100e.c */ extern int machine_at_t3100e_init(const machine_t *); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 24425793a..009999f07 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -199,32 +199,3 @@ machine_at_apas3_init(const machine_t *model) return ret; } - -#if defined(DEV_BRANCH) && defined(USE_596B) -int -machine_at_bx98_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear(L"roms/machines/bx98/vc98103e.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 2, 3, 4); - device_add(&via_apro_device); - device_add(&via_vt82c596b_device); - device_add(&um8669f_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} -#endif diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 9b4a615db..c0314ad88 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -302,6 +302,34 @@ machine_at_p55t2s_init(const machine_t *model) return ret; } +int +machine_at_m7shi_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear(L"roms/machines/m7shi/m7shi2n.rom", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + device_add(&i430vx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&fdc37c932fr_device); + device_add(&intel_flash_bxt_device); + + return ret; +} int machine_at_tc430hx_init(const machine_t *model) @@ -372,13 +400,12 @@ machine_at_equium5200_init(const machine_t *model) // Information about that mac return ret; } - int machine_at_p55tvp4_init(const machine_t *model) { int ret; - ret = bios_load_linear(L"roms/machines/p55tvp4/tv5i0204.awd", + ret = bios_load_linear(L"roms/machines/p55tvp4/0204_128.BIN", 0x000e0000, 131072, 0); if (bios_only || !ret) @@ -388,21 +415,20 @@ machine_at_p55tvp4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add(&keyboard_ps2_pci_device); + device_add(&keyboard_ps2_ami_pci_device); //It uses the AMIKEY KBC device_add(&w83877f_device); device_add(&intel_flash_bxt_device); return ret; } - int machine_at_i430vx_init(const machine_t *model) { @@ -432,7 +458,6 @@ machine_at_i430vx_init(const machine_t *model) return ret; } - int machine_at_p55va_init(const machine_t *model) { @@ -462,14 +487,13 @@ machine_at_p55va_init(const machine_t *model) return ret; } - int -machine_at_j656vxd_init(const machine_t *model) +machine_at_brio80xx_init(const machine_t *model) { int ret; - ret = bios_load_linear(L"roms/machines/j656vxd/J656VXD.BIN", - 0x000e0000, 131072, 0); + ret = bios_load_linear(L"roms/machines/brio80xx/Hf0705.rom", + 0x000c0000, 262144, 0); if (bios_only || !ret) return ret; @@ -477,49 +501,21 @@ machine_at_j656vxd_init(const machine_t *model) machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&i430vx_device); - device_add(&piix3_device); - device_add(&keyboard_ps2_pci_device); - device_add(&fdc37c669_device); - device_add(&intel_flash_bxt_device); - - return ret; -} -int -machine_at_mb520n_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear(L"roms/machines/mb520n/520n503s.rom", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init(model); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c669_device); + device_add(&fdc37c932fr_device); device_add(&intel_flash_bxt_device); return ret; } - int machine_at_p55xb2_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index ae8f41b08..cd64e4830 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -201,6 +201,7 @@ const machine_t machines[] = { { "[486 PCI] Zida Tomato 4DP", "4dps", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_4dps_init, NULL }, /* Socket 4 machines */ + //430LX { "[Socket 4 LX] IBM Ambra DP60 PCI", "ambradp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp60_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VPP60) { "[Socket 4 LX] IBM PS/ValuePoint P60", "valuepointp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_valuepointp60_init, NULL }, @@ -209,10 +210,12 @@ const machine_t machines[] = { { "[Socket 4 LX] Micro Star 586MC1", "586mc1", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_586mc1_init, NULL }, /* Socket 5 machines */ + //430NX { "[Socket 5 NX] Intel Premiere/PCI II", "plato", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_plato_init, NULL }, { "[Socket 5 NX] IBM Ambra DP90 PCI", "ambradp90", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp90_init, NULL }, { "[Socket 5 NX] Gigabyte GA-586IP", "430nx", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_430nx_init, NULL }, - + + //430FX { "[Socket 5 FX] AMI Apollo", "apollo", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_apollo_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VECTRA54) { "[Socket 5 FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 511, machine_at_vectra54_init, NULL }, @@ -223,6 +226,7 @@ const machine_t machines[] = { { "[Socket 5 FX] President Award 430FX PCI","president", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL }, /* Socket 7 machines */ + //430FX { "[Socket 7-3V FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p54tp4xe_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/ATX", "thor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/EV", "endeavor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_endeavor_init, at_endeavor_get_device }, @@ -231,21 +235,24 @@ const machine_t machines[] = { #endif { "[Socket 7-3V FX] Packard Bell PB640", "pb640", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_pb640_init, at_pb640_get_device }, + //430HX { "[Socket 7-3V HX] Acer M3a", "acerm3a", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerm3a_init, NULL }, { "[Socket 7-3V HX] AOpen AP53", "ap53", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_ap53_init, NULL }, { "[Socket 7-3V HX] SuperMicro Super P55T2S","p55t2s", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 127, machine_at_p55t2s_init, NULL }, { "[Socket 7 HX] Acer V35n", "acerv35n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL }, { "[Socket 7 HX] ASUS P/I-P55T2P4", "p55t2p4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_p55t2p4_init, NULL }, + { "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_m7shi_init, NULL }, { "[Socket 7 HX] TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, { "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL }, + //430VX { "[Socket 7 VX] ASUS P/I-P55TVP4", "p55tvp4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55tvp4_init, NULL }, - { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, - { "[Socket 7 VX] Jetway J656VXD", "j656vxd", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_j656vxd_init, NULL }, - { "[Socket 7 VX] PC Partner MB520N", "mb520n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_mb520n_init, NULL }, { "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL }, + { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, + { "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL }, + //430TX { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, { "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL }, { "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL }, @@ -253,39 +260,50 @@ const machine_t machines[] = { { "[Socket 7 TX] PC Partner TXA807DS", "807ds", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_807ds_init, NULL }, { "[Socket 7 TX] SuperMicro P5MMS98", "p5mms98", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p5mms98_init, NULL }, + //Apollo VPX { "[Socket 7 VPX] Zida Tomato TX100", "tx100", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_tx100_init, NULL }, - + + //Apollo VP3 { "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL }, /* Super Socket 7 machines */ + //Apollo MVP3 { "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL }, { "[Super 7 MVP3] FIC VA-503+", "ficva503p", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_mvp3_init, NULL }, /* Socket 8 machines */ + //440FX { "[Socket 8 FX] Gigabyte GA-686NX", "686nx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_686nx_init, NULL }, { "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL }, { "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL }, { "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL }, /* Slot 1 machines */ + //440FX { "[Slot 1 FX] ECS P6KFX-A", "p6kfx", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_p6kfx_init, NULL }, + //440LX + + + //440BX { "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL }, { "[Slot 1 BX] ASUS P2B-LS", "p2bls", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p2bls_init, NULL }, { "[Slot 1 BX] ASUS P3B-F", "p3bf", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p3bf_init, NULL }, { "[Slot 1 BX] ABit BF6", "bf6", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_bf6_init, NULL }, + //440ZX { "[Slot 1 ZX] Packard Bell Bora Pro", "borapro", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_borapro_init, NULL }, /* PGA370 machines */ + //440BX { "[Socket 370 BX] ASUS CUBX", "cubx", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_cubx_init, NULL }, { "[Socket 370 BX] A-Trend ATC7020BXII", "atc7020bxii", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_atc7020bxii_init, NULL }, - { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, - { "[Socket 370 APRO] PC Partner APAS3", "apas3", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_apas3_init, NULL }, -#if defined(DEV_BRANCH) && defined(USE_596B) - { "[Socket 370 APRO] Zida Tomato BX98", "bx98", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_bx98_init, NULL }, -#endif + //440ZX + { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, + + //VIA Apollo Pro + { "[Socket 370 APRO] PC Partner APAS3", "apas3", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_apas3_init, NULL }, { NULL, NULL, {{"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}}, 0, 0, 0, 0, 0, NULL, NULL } }; From 9c6493a6f8765081bafeb3d2051a4ea180fbeb36 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 17:49:04 +0200 Subject: [PATCH 26/43] Fixed the two new Phoenix machines by switching their Super I/O chips to SMC FDC73C935 (it's really 932/935 without additional letters), fixing some things in said Super I/O chips, and giving the HP Brio 80xx the correct (SST 29EE020) Flash chip. --- src/machine/m_at_socket7_s7.c | 9 +++++---- src/machine/machine_table.c | 2 +- src/sio_fdc37c93x.c | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index c0314ad88..5dbd00b48 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -322,10 +322,10 @@ machine_at_m7shi_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - device_add(&i430vx_device); + device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c932fr_device); + device_add(&fdc37c935_device); device_add(&intel_flash_bxt_device); return ret; @@ -510,8 +510,9 @@ machine_at_brio80xx_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c932fr_device); - device_add(&intel_flash_bxt_device); + device_add(&fdc37c935_device); + // device_add(&intel_flash_bxt_device); + device_add(&sst_flash_29ee020_device); return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index cd64e4830..b116a452a 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -242,7 +242,7 @@ const machine_t machines[] = { { "[Socket 7 HX] Acer V35n", "acerv35n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL }, { "[Socket 7 HX] ASUS P/I-P55T2P4", "p55t2p4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_p55t2p4_init, NULL }, - { "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_m7shi_init, NULL }, + { "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 511, machine_at_m7shi_init, NULL }, { "[Socket 7 HX] TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, { "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL }, diff --git a/src/sio_fdc37c93x.c b/src/sio_fdc37c93x.c index e5ed9e164..7e08ab373 100644 --- a/src/sio_fdc37c93x.c +++ b/src/sio_fdc37c93x.c @@ -393,6 +393,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) fdc37c93x_serial_handler(dev, 0); if (valxor & 0x20) fdc37c93x_serial_handler(dev, 1); + if ((valxor & 0x40) && (dev->chip_id != 0x02)) + fdc37c932fr_access_bus_handler(dev); break; } @@ -406,6 +408,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x30: case 0x60: case 0x61: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x01; if (valxor) fdc37c93x_fdc_handler(dev); break; @@ -454,6 +458,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x08; if (valxor) fdc37c93x_lpt_handler(dev); break; @@ -466,6 +472,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x10; if (valxor) fdc37c93x_serial_handler(dev, 0); break; @@ -478,6 +486,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x20; if (valxor) fdc37c93x_serial_handler(dev, 1); break; @@ -556,6 +566,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x40; if (valxor) fdc37c932fr_access_bus_handler(dev); break; @@ -757,6 +769,8 @@ fdc37c93x_init(const device_t *info) if (dev->chip_id == 0x03) dev->access_bus = device_add(&access_bus_device); + io_sethandler(0x370, 0x0002, + fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); io_sethandler(0x3f0, 0x0002, fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); From d042939600dfa494af5d305c5109db0030be2b34 Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Thu, 23 Apr 2020 20:17:18 +0300 Subject: [PATCH 27/43] Added the Packard Bell PB680 Intel AMI based board. To cover up the needs for an AMI BIOS on 430VX --- src/include/86box/machine.h | 1 + src/machine/m_at_socket7_s7.c | 33 +++++++++++++++++++++++++++++++++ src/machine/machine_table.c | 1 + 3 files changed, 35 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index c07f74ed7..b24bbcff1 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -295,6 +295,7 @@ extern int machine_at_p55tvp4_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); extern int machine_at_i430vx_init(const machine_t *); extern int machine_at_brio80xx_init(const machine_t *); +extern int machine_at_pb680_init(const machine_t *); extern int machine_at_p55xb2_init(const machine_t *); extern int machine_at_tx97_init(const machine_t *); diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 5dbd00b48..702f7d9d3 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -517,6 +517,39 @@ machine_at_brio80xx_init(const machine_t *model) return ret; } +int +machine_at_pb680_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined2(L"roms/machines/pb680/1012DN0R.BIO", + L"roms/machines/pb680/1012DN0R.BI1", + L"roms/machines/pb680/1012DN0R.BI2", + L"roms/machines/pb680/1012DN0R.BI3", + L"roms/machines/pb680/1012DN0R.RCV", + 0x3a000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&i430vx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&pc87306_device); + device_add(&intel_flash_bxt_ami_device); + + return ret; +} + int machine_at_p55xb2_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b116a452a..c00091cbb 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -251,6 +251,7 @@ const machine_t machines[] = { { "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL }, { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, { "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL }, + { "[Socket 7 VX] Packard Bell PB680", "pb680", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_pb680_init, NULL }, //430TX { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, From e132bf21e36bc818463296e46055cafff2c2382b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 23 Apr 2020 20:15:20 +0200 Subject: [PATCH 28/43] Simplified memory handler for the wd80x3 nic family. --- src/network/net_wd8003.c | 87 ++++++++-------------------------------- 1 file changed, 17 insertions(+), 70 deletions(-) diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 953212a0b..7eeb4d136 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -175,68 +175,22 @@ wd_soft_reset(void *priv) } -static uint32_t -wd_ram_read(uint32_t addr, unsigned len, void *priv) -{ - wd_t *dev = (wd_t *)priv; - uint32_t ret; - uint16_t ram_mask = dev->ram_size - 1; - - ret = dev->dp8390->mem[addr & ram_mask]; - - if (len == 2) - ret |= dev->dp8390->mem[(addr + 1) & ram_mask] << 8; - - return ret; -} - - static uint8_t -wd_ram_readb(uint32_t addr, void *priv) +wd_ram_read(uint32_t addr, void *priv) { wd_t *dev = (wd_t *)priv; - - return wd_ram_read(addr, 1, dev); + + wdlog("WD80x3: RAM Read: addr=%06x, val=%02x\n", addr & (dev->ram_size - 1), dev->dp8390->mem[addr & (dev->ram_size - 1)]); + return dev->dp8390->mem[addr & (dev->ram_size - 1)]; } - -static uint16_t -wd_ram_readw(uint32_t addr, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - return wd_ram_read(addr, 2, dev); -} - - static void -wd_ram_write(uint32_t addr, uint32_t val, unsigned len, void *priv) +wd_ram_write(uint32_t addr, uint8_t val, void *priv) { wd_t *dev = (wd_t *)priv; - uint16_t ram_mask = dev->ram_size - 1; - - dev->dp8390->mem[addr & ram_mask] = val & 0xff; - - if (len == 2) - dev->dp8390->mem[(addr + 1) & ram_mask] = val >> 8; -} - - -static void -wd_ram_writeb(uint32_t addr, uint8_t val, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - wd_ram_write(addr, val, 1, dev); -} - - -static void -wd_ram_writew(uint32_t addr, uint16_t val, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - wd_ram_write(addr, val, 2, dev); + + dev->dp8390->mem[addr & (dev->ram_size - 1)] = val; + wdlog("WD80x3: RAM Write: addr=%06x, val=%02x\n", addr & (dev->ram_size - 1), val); } @@ -605,7 +559,7 @@ wd_mca_write(int port, uint8_t val, void *priv) * So, remove current address, if any. */ if (dev->base_address) - wd_io_remove(dev, dev->base_address); + wd_io_remove(dev, dev->base_address); dev->base_address = (dev->pos_regs[2] & 0xfe) << 4; dev->ram_addr = (dev->pos_regs[3] & 0xfc) << 12; @@ -685,7 +639,7 @@ wd_init(const device_t *info) dev->dp8390 = device_add(&dp8390_device); dev->dp8390->priv = dev; dev->dp8390->interrupt = wd_interrupt; - dp8390_set_defaults(dev->dp8390, DP8390_FLAG_CLEAR_IRQ); + dp8390_set_defaults(dev->dp8390, DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); switch(dev->board) { /* Ethernet, ISA, no interface chip, RAM 8k */ @@ -748,25 +702,18 @@ wd_init(const device_t *info) memcpy(dev->dp8390->physaddr, dev->maclocal, sizeof(dev->maclocal)); wdlog("%s: I/O=%04x, IRQ=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", - dev->name, dev->base_address, dev->irq, - dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2], - dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]); + dev->name, dev->base_address, dev->irq, + dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2], + dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]); /* Reset the board. */ wd_reset(dev); /* Map this system into the memory map. */ - if (dev->bit16 & 1) { - mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, - wd_ram_readb, wd_ram_readw, NULL, - wd_ram_writeb, wd_ram_writew, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - } else { - mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, - wd_ram_readb, NULL, NULL, - wd_ram_writeb, NULL, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - } + mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, + wd_ram_read, NULL, NULL, + wd_ram_write, NULL, NULL, + NULL, MEM_MAPPING_EXTERNAL, dev); mem_mapping_disable(&dev->ram_mapping); From 191687e5ac130e5b5274efaa23992ab080a81008 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 23 Apr 2020 20:19:40 +0200 Subject: [PATCH 29/43] Hopefully fixed the dp8390 side of the wd80x3. --- src/network/net_dp8390.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 376b4dc51..892101976 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -204,11 +204,8 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* Check for start-tx */ if ((val & 0x04) && dev->TCR.loop_cntl) { if (dev->TCR.loop_cntl) { - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - dp8390_rx(dev, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], - dev->tx_bytes); - else - dp8390_rx(dev, dev->mem, dev->tx_bytes); + dp8390_rx(dev, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], + dev->tx_bytes); } } else if (val & 0x04) { if (dev->CR.stop || (!dev->CR.start && (dev->flags & DP8390_FLAG_CHECK_CR))) { @@ -226,11 +223,8 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* Send the packet to the system driver */ dev->CR.tx_packet = 1; - - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - network_tx(&dev->mem[(dev->tx_page_start * 256) - dev->mem_start], dev->tx_bytes); - else - network_tx(dev->mem, dev->tx_bytes); + + network_tx(&dev->mem[(dev->tx_page_start * 256) - dev->mem_start], dev->tx_bytes); /* some more debug */ #ifdef ENABLE_DP8390_LOG @@ -394,10 +388,7 @@ dp8390_rx(void *priv, uint8_t *buf, int io_len) pkthdr[0], pkthdr[1], pkthdr[2], pkthdr[3]); /* Copy into buffer, update curpage, and signal interrupt if config'd */ - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; - else - startptr = dev->mem + ((dev->curr_page * 256) - dev->mem_start); + startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; memcpy(startptr, pkthdr, sizeof(pkthdr)); if ((nextpage > dev->curr_page) || ((dev->curr_page + pages) == dev->page_stop)) { @@ -405,10 +396,7 @@ dp8390_rx(void *priv, uint8_t *buf, int io_len) } else { endbytes = (dev->page_stop - dev->curr_page) * 256; memcpy(startptr+sizeof(pkthdr), buf, endbytes-sizeof(pkthdr)); - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - startptr = &dev->mem[(dev->page_start * 256) - dev->mem_start]; - else - startptr = dev->mem + ((dev->page_start * 256) - dev->mem_start); + startptr = &dev->mem[(dev->page_start * 256) - dev->mem_start]; memcpy(startptr, buf+endbytes-sizeof(pkthdr), io_len-endbytes+8); } dev->curr_page = nextpage; From e42a99cc0e129c7f56e88a6cb82d6b8915066852 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 20:57:13 +0200 Subject: [PATCH 30/43] Added a PCI APM device that has a reset function that clears and status back to 0x00 on device reset, fixes soft reset hangs on the ASUS P/I-P55TVP4, and also made it clear that the TC430HX is Intel. --- src/apm.c | 57 +++++++++++++++++++++++++++---------- src/include/86box/apm.h | 3 +- src/intel_piix.c | 6 ++-- src/machine/machine_table.c | 2 +- src/pci.c | 1 - 5 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/apm.c b/src/apm.c index 59f8e40e2..b197c0964 100644 --- a/src/apm.c +++ b/src/apm.c @@ -49,43 +49,55 @@ apm_log(const char *fmt, ...) void -apm_set_do_smi(apm_t *apm, uint8_t do_smi) +apm_set_do_smi(apm_t *dev, uint8_t do_smi) { - apm->do_smi = do_smi; + dev->do_smi = do_smi; } static void apm_out(uint16_t port, uint8_t val, void *p) { - apm_t *apm = (apm_t *) p; + apm_t *dev = (apm_t *) p; apm_log("[%04X:%08X] APM write: %04X = %02X (BX = %04X, CX = %04X)\n", CS, cpu_state.pc, port, val, BX, CX); port &= 0x0001; if (port == 0x0000) { - apm->cmd = val; - if (apm->do_smi) + dev->cmd = val; + if (dev->do_smi) smi_line = 1; } else - apm->stat = val; + dev->stat = val; } static uint8_t apm_in(uint16_t port, void *p) { - apm_t *apm = (apm_t *) p; - - apm_log("[%04X:%08X] APM read: %04X = FF\n", CS, cpu_state.pc, port); + apm_t *dev = (apm_t *) p; + uint8_t ret = 0xff; port &= 0x0001; if (port == 0x0000) - return apm->cmd; + ret = dev->cmd; else - return apm->stat; + ret = dev->stat; + + apm_log("[%04X:%08X] APM read: %04X = %02X\n", CS, cpu_state.pc, port, ret); + + return ret; +} + + +static void +apm_reset(void *p) +{ + apm_t *dev = (apm_t *)p; + + dev->cmd = dev->stat = 0x00; } @@ -101,12 +113,12 @@ apm_close(void *p) static void *apm_init(const device_t *info) { - apm_t *apm = (apm_t *) malloc(sizeof(apm_t)); - memset(apm, 0, sizeof(apm_t)); + apm_t *dev = (apm_t *) malloc(sizeof(apm_t)); + memset(dev, 0, sizeof(apm_t)); - io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, apm); + io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, dev); - return apm; + return dev; } @@ -123,3 +135,18 @@ const device_t apm_device = NULL, NULL }; + + +const device_t apm_pci_device = +{ + "Advanced Power Management (PCI)", + DEVICE_PCI, + 0, + apm_init, + apm_close, + apm_reset, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/include/86box/apm.h b/src/include/86box/apm.h index e420ec717..b7754f78a 100644 --- a/src/include/86box/apm.h +++ b/src/include/86box/apm.h @@ -38,10 +38,11 @@ typedef struct /* Global variables. */ extern const device_t apm_device; +extern const device_t apm_pci_device; /* Functions. */ -extern void apm_set_do_smi(apm_t *apm, uint8_t do_smi); +extern void apm_set_do_smi(apm_t *dev, uint8_t do_smi); #ifdef __cplusplus } diff --git a/src/intel_piix.c b/src/intel_piix.c index 64f5c6c0a..257b9be9a 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -455,7 +455,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0xa0: if (dev->type < 4) { fregs[addr] = val & 0x1f; - apm_set_do_smi(dev->apm, (val & 0x01) | (fregs[0xa2] & 0x80)); + apm_set_do_smi(dev->apm, !!(val & 0x01) && !!(fregs[0xa2] & 0x80)); switch ((val & 0x18) >> 3) { case 0x00: dev->fast_off_period = PCICLK * 32768.0 * 60000.0; @@ -480,7 +480,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0xa2: if (dev->type < 4) { fregs[addr] = val & 0xff; - apm_set_do_smi(dev->apm, (fregs[0xa0] & 0x01) | (val & 0x80)); + apm_set_do_smi(dev->apm, !!(fregs[0xa0] & 0x01) && !!(val & 0x80)); } break; case 0xaa: case 0xac: case 0xae: @@ -1206,7 +1206,7 @@ static void } else cpu_fast_off_val = cpu_fast_off_count = 0; - dev->apm = device_add(&apm_device); + dev->apm = device_add(&apm_pci_device); /* APM intercept handler to update PIIX/PIIX3 and PIIX4/4E/SMSC ACPI SMI status on APM SMI. */ io_sethandler(0x00b2, 0x0001, NULL, NULL, NULL, piix_apm_out, NULL, NULL, dev); dev->port_92 = device_add(&port_92_pci_device); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c00091cbb..b358fde33 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -243,7 +243,7 @@ const machine_t machines[] = { { "[Socket 7 HX] Acer V35n", "acerv35n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL }, { "[Socket 7 HX] ASUS P/I-P55T2P4", "p55t2p4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_p55t2p4_init, NULL }, { "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 511, machine_at_m7shi_init, NULL }, - { "[Socket 7 HX] TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, + { "[Socket 7 HX] Intel TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, { "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL }, //430VX diff --git a/src/pci.c b/src/pci.c index f0b411d71..1e142a554 100644 --- a/src/pci.c +++ b/src/pci.c @@ -710,7 +710,6 @@ void trc_write(uint16_t port, uint8_t val, void *priv) { pci_log("TRC Write: %02X\n", val); - pci_log("TRC Write: %02X\n", val); if (!(trc_reg & 4) && (val & 4)) trc_reset(val); From 746175e3976614168afa733d17704b1c4956dfc3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 23:10:13 +0200 Subject: [PATCH 31/43] Fixed the PB680 PCI slots. --- src/machine/m_at_socket7_s7.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 702f7d9d3..4eb1f963b 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -511,7 +511,6 @@ machine_at_brio80xx_init(const machine_t *model) device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&fdc37c935_device); - // device_add(&intel_flash_bxt_device); device_add(&sst_flash_29ee020_device); return ret; @@ -536,7 +535,7 @@ machine_at_pb680_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x08, PCI_CARD_ONBOARD, 4, 0, 0, 0); pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); From 3942f97a1a291d563cfef5ef7a8ab36c950cf646 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 24 Apr 2020 00:36:49 +0200 Subject: [PATCH 32/43] Removed the AMI Apollo. --- src/include/86box/machine.h | 1 - src/machine/m_at_socket4_5.c | 31 ------------------------- src/machine/machine_table.c | 44 +++++++++++++++++------------------- 3 files changed, 21 insertions(+), 55 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index b24bbcff1..7e51ab210 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -265,7 +265,6 @@ extern int machine_at_endeavor_init(const machine_t *); extern int machine_at_zappa_init(const machine_t *); extern int machine_at_mb500n_init(const machine_t *); extern int machine_at_president_init(const machine_t *); -extern int machine_at_apollo_init(const machine_t *); #if defined(DEV_BRANCH) && defined(USE_VECTRA54) extern int machine_at_vectra54_init(const machine_t *); #endif diff --git a/src/machine/m_at_socket4_5.c b/src/machine/m_at_socket4_5.c index b86c3fe4b..81dcb13ac 100644 --- a/src/machine/m_at_socket4_5.c +++ b/src/machine/m_at_socket4_5.c @@ -384,37 +384,6 @@ machine_at_president_init(const machine_t *model) } -int -machine_at_apollo_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear(L"roms/machines/apollo/S728P.ROM", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - device_add(&ls486e_nvr_device); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&keyboard_ps2_pci_device); - device_add(&fdc37c932fr_device); - device_add(&intel_flash_bxt_device); - - return ret; -} - - #if defined(DEV_BRANCH) && defined(USE_VECTRA54) int machine_at_vectra54_init(const machine_t *model) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b358fde33..8cc0dbfaf 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -201,7 +201,7 @@ const machine_t machines[] = { { "[486 PCI] Zida Tomato 4DP", "4dps", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_4dps_init, NULL }, /* Socket 4 machines */ - //430LX + /* 430LX */ { "[Socket 4 LX] IBM Ambra DP60 PCI", "ambradp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp60_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VPP60) { "[Socket 4 LX] IBM PS/ValuePoint P60", "valuepointp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_valuepointp60_init, NULL }, @@ -210,13 +210,12 @@ const machine_t machines[] = { { "[Socket 4 LX] Micro Star 586MC1", "586mc1", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_586mc1_init, NULL }, /* Socket 5 machines */ - //430NX + /* 430NX */ { "[Socket 5 NX] Intel Premiere/PCI II", "plato", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_plato_init, NULL }, { "[Socket 5 NX] IBM Ambra DP90 PCI", "ambradp90", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp90_init, NULL }, { "[Socket 5 NX] Gigabyte GA-586IP", "430nx", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_430nx_init, NULL }, - - //430FX - { "[Socket 5 FX] AMI Apollo", "apollo", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_apollo_init, NULL }, + + /* 430FX */ #if defined(DEV_BRANCH) && defined(USE_VECTRA54) { "[Socket 5 FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 511, machine_at_vectra54_init, NULL }, #endif @@ -226,7 +225,7 @@ const machine_t machines[] = { { "[Socket 5 FX] President Award 430FX PCI","president", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL }, /* Socket 7 machines */ - //430FX + /* 430FX */ { "[Socket 7-3V FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p54tp4xe_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/ATX", "thor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/EV", "endeavor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_endeavor_init, at_endeavor_get_device }, @@ -235,7 +234,7 @@ const machine_t machines[] = { #endif { "[Socket 7-3V FX] Packard Bell PB640", "pb640", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_pb640_init, at_pb640_get_device }, - //430HX + /* 430HX */ { "[Socket 7-3V HX] Acer M3a", "acerm3a", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerm3a_init, NULL }, { "[Socket 7-3V HX] AOpen AP53", "ap53", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_ap53_init, NULL }, { "[Socket 7-3V HX] SuperMicro Super P55T2S","p55t2s", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 127, machine_at_p55t2s_init, NULL }, @@ -246,64 +245,63 @@ const machine_t machines[] = { { "[Socket 7 HX] Intel TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, { "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL }, - //430VX + /* 430VX */ { "[Socket 7 VX] ASUS P/I-P55TVP4", "p55tvp4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55tvp4_init, NULL }, { "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL }, { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, { "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL }, { "[Socket 7 VX] Packard Bell PB680", "pb680", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_pb680_init, NULL }, - //430TX + /* 430TX */ { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, { "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL }, { "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL }, { "[Socket 7 TX] Iwill P55XB2", "p55xb2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p55xb2_init, NULL }, { "[Socket 7 TX] PC Partner TXA807DS", "807ds", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_807ds_init, NULL }, { "[Socket 7 TX] SuperMicro P5MMS98", "p5mms98", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p5mms98_init, NULL }, - - //Apollo VPX + + /* Apollo VPX */ { "[Socket 7 VPX] Zida Tomato TX100", "tx100", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_tx100_init, NULL }, - //Apollo VP3 + /* Apollo VP3 */ { "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL }, /* Super Socket 7 machines */ - //Apollo MVP3 + /* Apollo MVP3 */ { "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL }, { "[Super 7 MVP3] FIC VA-503+", "ficva503p", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_mvp3_init, NULL }, /* Socket 8 machines */ - //440FX + /* 440FX */ { "[Socket 8 FX] Gigabyte GA-686NX", "686nx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_686nx_init, NULL }, { "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL }, { "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL }, { "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL }, /* Slot 1 machines */ - //440FX + /* 440FX */ { "[Slot 1 FX] ECS P6KFX-A", "p6kfx", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_p6kfx_init, NULL }, - //440LX - - - //440BX + /* 440LX */ + + /* 440BX */ { "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL }, { "[Slot 1 BX] ASUS P2B-LS", "p2bls", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p2bls_init, NULL }, { "[Slot 1 BX] ASUS P3B-F", "p3bf", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p3bf_init, NULL }, { "[Slot 1 BX] ABit BF6", "bf6", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_bf6_init, NULL }, - //440ZX + /* 440ZX */ { "[Slot 1 ZX] Packard Bell Bora Pro", "borapro", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_borapro_init, NULL }, /* PGA370 machines */ - //440BX + /* 440BX */ { "[Socket 370 BX] ASUS CUBX", "cubx", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_cubx_init, NULL }, { "[Socket 370 BX] A-Trend ATC7020BXII", "atc7020bxii", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_atc7020bxii_init, NULL }, - //440ZX + /* 440ZX */ { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, - //VIA Apollo Pro + /* VIA Apollo Pro */ { "[Socket 370 APRO] PC Partner APAS3", "apas3", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_apas3_init, NULL }, { NULL, NULL, {{"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}}, 0, 0, 0, 0, 0, NULL, NULL } From f9de3183aa32df1d277df894f2bf936a3417e9ed Mon Sep 17 00:00:00 2001 From: Shaojun Li Date: Fri, 24 Apr 2020 13:33:56 +0800 Subject: [PATCH 33/43] Allow relative path of disk images. --- src/config.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 0cc5d35a1..d63294264 100644 --- a/src/config.c +++ b/src/config.c @@ -957,7 +957,12 @@ load_hard_disks(void) wcsncpy(hdd[c].fn, &wp[wcslen(usr_path)], sizeof_w(hdd[c].fn)); } else #endif - wcsncpy(hdd[c].fn, wp, sizeof_w(hdd[c].fn)); + if (plat_path_abs(wp)) { + wcsncpy(hdd[c].fn, wp, sizeof_w(hdd[c].fn)); + } else { + wcsncpy(hdd[c].fn, usr_path, sizeof_w(hdd[c].fn)); + wcsncat(hdd[c].fn, wp, sizeof_w(hdd[c].fn)-wcslen(usr_path)); + } /* If disk is empty or invalid, mark it for deletion. */ if (! hdd_is_valid(c)) { @@ -1832,7 +1837,10 @@ save_hard_disks(void) sprintf(temp, "hdd_%02i_fn", c+1); if (hdd_is_valid(c) && (wcslen(hdd[c].fn) != 0)) - config_set_wstring(cat, temp, hdd[c].fn); + if (wcsnicmp(hdd[c].fn, usr_path, wcslen(usr_path))) + config_set_wstring(cat, temp, &hdd[c].fn[wcslen(usr_path)]); + else + config_set_wstring(cat, temp, hdd[c].fn); else config_delete_var(cat, temp); } From 0e7c0cca02ca2e16fbb43f68df936b9298b6e83e Mon Sep 17 00:00:00 2001 From: Shaojun Li Date: Fri, 24 Apr 2020 13:38:52 +0800 Subject: [PATCH 34/43] Fix the close button of about dialog not working. --- src/win/win_about.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/win/win_about.c b/src/win/win_about.c index b0001b177..0c57c346d 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -53,6 +53,7 @@ AboutDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: + case IDCANCEL: EndDialog(hdlg, 0); plat_pause(0); return TRUE; From 31216312f73a92f59ab2cb89508359e531c2e0a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Fri, 24 Apr 2020 14:42:01 +0200 Subject: [PATCH 35/43] config: fix hard disk images outside usrpath --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index d63294264..0d3b13a29 100644 --- a/src/config.c +++ b/src/config.c @@ -1837,7 +1837,7 @@ save_hard_disks(void) sprintf(temp, "hdd_%02i_fn", c+1); if (hdd_is_valid(c) && (wcslen(hdd[c].fn) != 0)) - if (wcsnicmp(hdd[c].fn, usr_path, wcslen(usr_path))) + if (!wcsnicmp(hdd[c].fn, usr_path, wcslen(usr_path))) config_set_wstring(cat, temp, &hdd[c].fn[wcslen(usr_path)]); else config_set_wstring(cat, temp, hdd[c].fn); From af07bd5e6c01a93f143546641de09af7e563c8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Fri, 24 Apr 2020 14:56:30 +0200 Subject: [PATCH 36/43] win: Don't show full path for HD images in usrpath --- src/win/win_settings.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index a6e34420b..b34afd943 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -2352,7 +2352,10 @@ win_settings_hard_disks_update_item(HWND hwndList, int i, int column) lvI.pszText = szText; lvI.iImage = 0; } else if (column == 1) { - lvI.pszText = temp_hdd[i].fn; + if (!wcsnicmp(temp_hdd[i].fn, usr_path, wcslen(usr_path))) + lvI.pszText = temp_hdd[i].fn + wcslen(usr_path); + else + lvI.pszText = temp_hdd[i].fn; lvI.iImage = 0; } else if (column == 2) { wsprintf(szText, plat_get_string(IDS_4098), temp_hdd[i].tracks); @@ -2421,7 +2424,10 @@ win_settings_hard_disks_recalc_list(HWND hwndList) return FALSE; lvI.iSubItem = 1; - lvI.pszText = temp_hdd[i].fn; + if (!wcsnicmp(temp_hdd[i].fn, usr_path, wcslen(usr_path))) + lvI.pszText = temp_hdd[i].fn + wcslen(usr_path); + else + lvI.pszText = temp_hdd[i].fn; lvI.iItem = j; lvI.iImage = 0; From fe6df042be95c74dfcba8c01ffcb44d33c2dac13 Mon Sep 17 00:00:00 2001 From: nerd73 Date: Sat, 25 Apr 2020 03:24:59 -0600 Subject: [PATCH 37/43] Implement a proper P6 timing model --- src/cpu/codegen_timing_p6.c | 1864 ++++++++++++++++--------------- src/cpu_new/codegen_timing_p6.c | 1864 ++++++++++++++++--------------- 2 files changed, 1902 insertions(+), 1826 deletions(-) diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index 0cddde494..a0da30304 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -1,4 +1,5 @@ -/*Hacky P6 timings based on K6 timings*/ +/*Basic P6 timing model by plant/nerd73. Based on the K6 timing model*/ +/*Some cycle timings come from https://www.agner.org/optimize/instruction_tables.pdf*/ #include #include #include @@ -21,24 +22,26 @@ typedef enum uop_type_t UOP_ALU = 0, /*Executes in Integer X or Y units*/ UOP_ALUX, /*Executes in Integer X unit*/ UOP_LOAD, /*Executes in Load unit*/ - UOP_STORE, /*Executes in Store unit*/ + UOP_STORED, /*Executes in Data Store unit*/ + UOP_STOREA, /*Executes in Address Store unit*/ UOP_FLOAD, /*Executes in Load unit*/ - UOP_FSTORE, /*Executes in Store unit*/ + UOP_FSTORED, /*Executes in Data Store unit*/ + UOP_FSTOREA, /*Executes in Address Store unit*/ UOP_MLOAD, /*Executes in Load unit*/ - UOP_MSTORE, /*Executes in Store unit*/ + UOP_MSTORED, /*Executes in Data Store unit*/ + UOP_MSTOREA, /*Executes in Address Store unit*/ UOP_FLOAT, /*Executes in Floating Point unit*/ - UOP_MEU, /*Executes in Multimedia unit*/ - UOP_MEU_SHIFT, /*Executes in Multimedia unit or ALU X/Y. Uses MMX shifter*/ - UOP_MEU_MUL, /*Executes in Multimedia unit or ALU X/Y. Uses MMX multiplier*/ + UOP_MMX, /*Executes in Integer X or Y units as MMX*/ + UOP_MMX_SHIFT, /*Executes in Integer Y unit. Uses MMX shifter*/ + UOP_MMX_MUL, /*Executes in Integer X unit. Uses MMX multiplier*/ UOP_BRANCH, /*Executes in Branch unit*/ UOP_LIMM /*Does not require an execution unit*/ } uop_type_t; typedef enum decode_type_t { - DECODE_SHORT, - DECODE_LONG, - DECODE_VECTOR + DECODE_SIMPLE, + DECODE_COMPLEX, } decode_type_t; #define MAX_UOPS 10 @@ -46,7 +49,6 @@ typedef enum decode_type_t typedef struct risc86_uop_t { uop_type_t type; - double throughput; double latency; } risc86_uop_t; @@ -60,804 +62,885 @@ typedef struct risc86_instruction_t static const risc86_instruction_t alu_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t alux_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t load_alu_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t load_alux_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t alu_store_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} + }; static const risc86_instruction_t alux_store_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t branch_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_BRANCH, .latency = 1} }; static const risc86_instruction_t limm_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LIMM, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_LIMM, .latency = 1} }; static const risc86_instruction_t load_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1} }; static const risc86_instruction_t store_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t bswap_op = { - .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, }; static const risc86_instruction_t leave_op = { .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t lods_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t loop_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} }; static const risc86_instruction_t mov_reg_seg_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, }; static const risc86_instruction_t movs_op = { .nr_uops = 4, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t pop_reg_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t pop_mem_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t push_imm_op = { - .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2}, + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1}, }; static const risc86_instruction_t push_mem_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t push_seg_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t stos_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_reg_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_reg_b_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t test_mem_imm_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_mem_imm_b_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t xchg_op = { .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t mmx_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX, .latency = 1.5} }; static const risc86_instruction_t mmx_mul_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1.5, .latency = 3} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t mmx_shift_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_SHIFT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_SHIFT, .latency = 1.5} }; static const risc86_instruction_t load_mmx_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU, .throughput = 1.5, .latency = 3} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_MMX, .latency = 1.5} }; static const risc86_instruction_t load_mmx_mul_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_MUL, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t load_mmx_shift_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_SHIFT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_SHIFT, .latency = 1.5} }; static const risc86_instruction_t mload_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MLOAD, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_MLOAD, .latency = 3}, }; static const risc86_instruction_t mstore_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MSTORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_MSTORED, .latency = 1}, + .uop[1] = {.type = UOP_MSTOREA, .latency = 1} }; static const risc86_instruction_t pmul_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t pmul_mem_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_MUL, .latency = 1.5} }; - static const risc86_instruction_t float_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t fadd_op = +{ + .nr_uops = 1, + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_FLOAT, .latency = 3} +}; +static const risc86_instruction_t fmul_op = +{ + .nr_uops = 1, + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 5} +}; +static const risc86_instruction_t float2_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t fchs_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 2}, + .uop[1] = {.type = UOP_FLOAT, .latency = 2}, + .uop[2] = {.type = UOP_FLOAT, .latency = 2} }; static const risc86_instruction_t load_float_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t load_fadd_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 3} +}; +static const risc86_instruction_t load_fmul_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 5} }; static const risc86_instruction_t fstore_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FSTORED, .latency = 1}, + .uop[1] = {.type = UOP_FSTOREA, .latency = 1}, +}; +static const risc86_instruction_t load_fiadd_op = +{ + .nr_uops = 7, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1}, + .uop[2] = {.type = UOP_FLOAT, .latency = 1}, + .uop[3] = {.type = UOP_FLOAT, .latency = 1}, + .uop[4] = {.type = UOP_FLOAT, .latency = 1}, + .uop[5] = {.type = UOP_FLOAT, .latency = 1}, + .uop[6] = {.type = UOP_FLOAT, .latency = 1} }; - static const risc86_instruction_t fdiv_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 38, .latency = 38} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 32} }; static const risc86_instruction_t fdiv_mem_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAT, .throughput = 38, .latency = 38} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 38} }; static const risc86_instruction_t fsin_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 62, .latency = 62} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 60} }; static const risc86_instruction_t fsqrt_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 49, .latency = 49} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 69} }; -static const risc86_instruction_t vector_fldcw_op = +static const risc86_instruction_t complex_fldcw_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 8, .latency = 8} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 10} }; -static const risc86_instruction_t vector_float_op = +static const risc86_instruction_t complex_float_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 1} }; -static const risc86_instruction_t vector_float_l_op = +static const risc86_instruction_t complex_float_l_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 50, .latency = 50} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 50} }; -static const risc86_instruction_t vector_flde_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2} -}; -static const risc86_instruction_t vector_fste_op = +static const risc86_instruction_t complex_flde_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2}, - .uop[1] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAD, .latency = 1}, + .uop[2] = {.type = UOP_FLOAT, .latency = 2} +}; +static const risc86_instruction_t complex_fste_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 2}, + .uop[1] = {.type = UOP_FSTORED, .latency = 1}, + .uop[2] = {.type = UOP_FSTOREA, .latency = 1} }; -static const risc86_instruction_t vector_alu1_op = +static const risc86_instruction_t complex_alu1_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu2_op = +static const risc86_instruction_t complex_alu2_op = { .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu3_op = +static const risc86_instruction_t complex_alu3_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu6_op = +static const risc86_instruction_t complex_alu6_op = { .nr_uops = 6, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1}, + .uop[4] = {.type = UOP_ALU, .latency = 1}, + .uop[5] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alux1_op = +static const risc86_instruction_t complex_alux1_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alux3_op = +static const risc86_instruction_t complex_alux3_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alux6_op = +static const risc86_instruction_t complex_alux6_op = { - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .nr_uops = 6, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1}, + .uop[3] = {.type = UOP_ALUX, .latency = 1}, + .uop[4] = {.type = UOP_ALUX, .latency = 1}, + .uop[5] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alu_store_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_alux_store_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_arpl_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_bound_op = +static const risc86_instruction_t complex_alu_store_op = { .nr_uops = 4, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1}, }; -static const risc86_instruction_t vector_bsx_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_call_far_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cli_sti_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 7, .latency = 7} -}; -static const risc86_instruction_t vector_cmps_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cmpsb_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cmpxchg_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, -}; -static const risc86_instruction_t vector_cmpxchg_b_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, -}; -static const risc86_instruction_t vector_cpuid_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 22, .latency = 22} -}; -static const risc86_instruction_t vector_div16_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_div16_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_div32_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 18, .latency = 18} -}; -static const risc86_instruction_t vector_div32_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 18, .latency = 18} -}; -static const risc86_instruction_t vector_emms_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 25, .latency = 25} -}; -static const risc86_instruction_t vector_enter_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_femms_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 6, .latency = 6} -}; -static const risc86_instruction_t vector_in_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11} -}; -static const risc86_instruction_t vector_ins_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_int_op = -{ - .nr_uops = 5, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 20, .latency = 20}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_iret_op = -{ - .nr_uops = 5, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[3] = {.type = UOP_ALU, .throughput = 20, .latency = 20}, - .uop[4] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_invd_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1000, .latency = 1000} -}; -static const risc86_instruction_t vector_jmp_far_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_load_alu_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_load_alux_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_loop_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_lss_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mov_mem_seg_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mov_seg_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mov_seg_reg_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mul_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul64_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul64_mem_op = +static const risc86_instruction_t complex_alux_store_op = { .nr_uops = 4, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} }; -static const risc86_instruction_t vector_out_op = +static const risc86_instruction_t complex_arpl_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_bound_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_bsx_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 10, .latency = 10} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 10} }; -static const risc86_instruction_t vector_outs_op = +static const risc86_instruction_t complex_call_far_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_cli_sti_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 7} +}; +static const risc86_instruction_t complex_cmps_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 10, .latency = 10}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_pusha_op = +static const risc86_instruction_t complex_cmpsb_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_cmpxchg_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_cmpxchg_b_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_cpuid_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 23} +}; +static const risc86_instruction_t complex_div16_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 10} +}; +static const risc86_instruction_t complex_div16_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 10} +}; +static const risc86_instruction_t complex_div32_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 18} +}; +static const risc86_instruction_t complex_div32_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 18} +}; +static const risc86_instruction_t complex_emms_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 25} +}; +static const risc86_instruction_t complex_enter_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 10} +}; +static const risc86_instruction_t complex_femms_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 6} +}; +static const risc86_instruction_t complex_in_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 10} +}; +static const risc86_instruction_t complex_ins_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 10}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_int_op = { .nr_uops = 8, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[6] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[7] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 20}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_STORED, .latency = 1}, + .uop[4] = {.type = UOP_STOREA, .latency = 1}, + .uop[5] = {.type = UOP_STORED, .latency = 1}, + .uop[6] = {.type = UOP_STOREA, .latency = 1}, + .uop[7] = {.type = UOP_BRANCH, .latency = 1} }; -static const risc86_instruction_t vector_popa_op = +static const risc86_instruction_t complex_iret_op = +{ + .nr_uops = 5, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_LOAD, .latency = 3}, + .uop[2] = {.type = UOP_LOAD, .latency = 3}, + .uop[3] = {.type = UOP_ALU, .latency = 20}, + .uop[4] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_invd_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 500} +}; +static const risc86_instruction_t complex_jmp_far_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_load_alu_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_load_alux_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_loop_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_lss_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mov_mem_seg_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, +}; +static const risc86_instruction_t complex_mov_seg_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mov_seg_reg_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mul_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul_mem_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul64_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul64_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1}, + .uop[3] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_out_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 10}, + .uop[1] = {.type = UOP_STOREA, .latency = 10}, +}; +static const risc86_instruction_t complex_outs_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 10}, + .uop[1] = {.type = UOP_STOREA, .latency = 10}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_pusha_op = { .nr_uops = 8, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[6] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[7] = {.type = UOP_LOAD, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 2}, + .uop[1] = {.type = UOP_STOREA, .latency = 2}, + .uop[2] = {.type = UOP_STORED, .latency = 2}, + .uop[3] = {.type = UOP_STOREA, .latency = 2}, + .uop[4] = {.type = UOP_STORED, .latency = 2}, + .uop[5] = {.type = UOP_STOREA, .latency = 2}, + .uop[6] = {.type = UOP_STORED, .latency = 2}, + .uop[7] = {.type = UOP_STOREA, .latency = 2} }; -static const risc86_instruction_t vector_popf_op = +static const risc86_instruction_t complex_popa_op = +{ + .nr_uops = 8, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_LOAD, .latency = 1}, + .uop[3] = {.type = UOP_LOAD, .latency = 1}, + .uop[4] = {.type = UOP_LOAD, .latency = 1}, + .uop[5] = {.type = UOP_LOAD, .latency = 1}, + .uop[6] = {.type = UOP_LOAD, .latency = 1}, + .uop[7] = {.type = UOP_LOAD, .latency = 1} +}; +static const risc86_instruction_t complex_popf_op = { .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 17, .latency = 17} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_ALUX, .latency = 17} }; -static const risc86_instruction_t vector_push_mem_op = +static const risc86_instruction_t complex_push_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_pushf_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_ret_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_retf_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 3}, + .uop[2] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_scas_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_scasb_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_setcc_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_FSTORED, .latency = 1}, + .uop[3] = {.type = UOP_FSTOREA, .latency = 1} +}; +static const risc86_instruction_t complex_setcc_reg_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_test_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_test_mem_b_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_xchg_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_xlat_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1} +}; +static const risc86_instruction_t complex_wbinvd_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_pushf_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_ret_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_retf_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[2] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_scas_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_scasb_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_setcc_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_setcc_reg_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_test_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_test_mem_b_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_xchg_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_xlat_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2} -}; -static const risc86_instruction_t vector_wbinvd_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 10000, .latency = 10000} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 10000} }; + #define INVALID NULL static const risc86_instruction_t *opcode_timings[256] = @@ -865,38 +948,38 @@ static const risc86_instruction_t *opcode_timings[256] = /* ADD ADD ADD ADD*/ /*00*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* ADD ADD PUSH ES POP ES*/ - &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, + &alux_op, &alu_op, &push_seg_op, &complex_mov_seg_mem_op, /* OR OR OR OR*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* OR OR PUSH CS */ &alux_op, &alu_op, &push_seg_op, INVALID, /* ADC ADC ADC ADC*/ -/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/*10*/ &complex_alux_store_op,&complex_alu_store_op, &complex_load_alux_op,&complex_load_alu_op, /* ADC ADC PUSH SS POP SS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* SBB SBB SBB SBB*/ -/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/*10*/ &complex_alux_store_op,&complex_alu_store_op, &complex_load_alux_op,&complex_load_alu_op, /* SBB SBB PUSH DS POP DS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* AND AND AND AND*/ /*20*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* AND AND DAA*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* SUB SUB SUB SUB*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* SUB SUB DAS*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* XOR XOR XOR XOR*/ /*30*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* XOR XOR AAA*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* CMP CMP CMP CMP*/ &load_alux_op, &load_alu_op, &load_alux_op, &load_alu_op, /* CMP CMP AAS*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* INC EAX INC ECX INC EDX INC EBX*/ /*40*/ &alu_op, &alu_op, &alu_op, &alu_op, @@ -917,12 +1000,12 @@ static const risc86_instruction_t *opcode_timings[256] = &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, /* PUSHA POPA BOUND ARPL*/ -/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, +/*60*/ &complex_pusha_op, &complex_popa_op, &complex_bound_op, &complex_arpl_op, INVALID, INVALID, INVALID, INVALID, /* PUSH imm IMUL PUSH imm IMUL*/ - &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, + &push_imm_op, &complex_mul_op, &push_imm_op, &complex_mul_op, /* INSB INSW OUTSB OUTSW*/ - &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + &complex_ins_op, &complex_ins_op, &complex_outs_op, &complex_outs_op, /* Jxx*/ /*70*/ &branch_op, &branch_op, &branch_op, &branch_op, @@ -932,29 +1015,29 @@ static const risc86_instruction_t *opcode_timings[256] = /*80*/ INVALID, INVALID, INVALID, INVALID, /* TEST TEST XCHG XCHG*/ - &vector_test_mem_b_op, &vector_test_mem_op, &vector_xchg_mem_op, &vector_xchg_mem_op, + &complex_test_mem_b_op, &complex_test_mem_op, &complex_xchg_mem_op, &complex_xchg_mem_op, /* MOV MOV MOV MOV*/ &store_op, &store_op, &load_op, &load_op, /* MOV from seg LEA MOV to seg POP*/ - &vector_mov_mem_seg_op, &store_op, &vector_mov_seg_mem_op, &pop_mem_op, + &complex_mov_mem_seg_op, &store_op, &complex_mov_seg_mem_op, &pop_mem_op, /* NOP XCHG XCHG XCHG*/ /*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, /* XCHG XCHG XCHG XCHG*/ &xchg_op, &xchg_op, &xchg_op, &xchg_op, /* CBW CWD CALL far WAIT*/ - &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, + &complex_alu1_op, &complex_alu1_op, &complex_call_far_op, &limm_op, /* PUSHF POPF SAHF LAHF*/ - &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + &complex_pushf_op, &complex_popf_op, &complex_alux1_op, &complex_alux1_op, /* MOV MOV MOV MOV*/ /*a0*/ &load_op, &load_op, &store_op, &store_op, /* MOVSB MOVSW CMPSB CMPSW*/ - &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, + &movs_op, &movs_op, &complex_cmpsb_op, &complex_cmps_op, /* TEST TEST STOSB STOSW*/ &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, /* LODSB LODSW SCASB SCASW*/ - &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + &lods_op, &lods_op, &complex_scasb_op, &complex_scas_op, /* MOV*/ /*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, @@ -963,37 +1046,37 @@ static const risc86_instruction_t *opcode_timings[256] = &limm_op, &limm_op, &limm_op, &limm_op, /* RET imm RET*/ -/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/*c0*/ INVALID, INVALID, &complex_ret_op, &complex_ret_op, /* LES LDS MOV MOV*/ - &vector_lss_op, &vector_lss_op, &store_op, &store_op, + &complex_lss_op, &complex_lss_op, &store_op, &store_op, /* ENTER LEAVE RETF RETF*/ - &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, + &complex_enter_op, &leave_op, &complex_retf_op, &complex_retf_op, /* INT3 INT INTO IRET*/ - &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + &complex_int_op, &complex_int_op, &complex_int_op, &complex_iret_op, /*d0*/ INVALID, INVALID, INVALID, INVALID, /* AAM AAD SETALC XLAT*/ - &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + &complex_alux6_op, &complex_alux3_op, &complex_alux1_op, &complex_xlat_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /* LOOPNE LOOPE LOOP JCXZ*/ -/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/*e0*/ &complex_loop_op, &complex_loop_op, &loop_op, &complex_loop_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* CALL JMP JMP JMP*/ - &store_op, &branch_op, &vector_jmp_far_op, &branch_op, + &store_op, &branch_op, &complex_jmp_far_op, &branch_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* REPNE REPE*/ /*f0*/ INVALID, INVALID, INVALID, INVALID, /* HLT CMC*/ - &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, + &complex_alux1_op, &complex_alu2_op, INVALID, INVALID, /* CLC STC CLI STI*/ - &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, + &complex_alu1_op, &complex_alu1_op, &complex_cli_sti_op, &complex_cli_sti_op, /* CLD STD INCDEC*/ - &vector_alu1_op, &vector_alu1_op, &alux_store_op, INVALID + &complex_alu1_op, &complex_alu1_op, &alux_store_op, INVALID }; static const risc86_instruction_t *opcode_timings_mod3[256] = @@ -1001,38 +1084,38 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = /* ADD ADD ADD ADD*/ /*00*/ &alux_op, &alu_op, &alux_op, &alu_op, /* ADD ADD PUSH ES POP ES*/ - &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, + &alux_op, &alu_op, &push_seg_op, &complex_mov_seg_mem_op, /* OR OR OR OR*/ &alux_op, &alu_op, &alux_op, &alu_op, /* OR OR PUSH CS */ &alux_op, &alu_op, &push_seg_op, INVALID, /* ADC ADC ADC ADC*/ -/*10*/ &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, +/*10*/ &complex_alux1_op, &complex_alu1_op, &complex_alux1_op, &complex_alu1_op, /* ADC ADC PUSH SS POP SS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* SBB SBB SBB SBB*/ - &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, + &complex_alux1_op, &complex_alu1_op, &complex_alux1_op, &complex_alu1_op, /* SBB SBB PUSH DS POP DS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* AND AND AND AND*/ /*20*/ &alux_op, &alu_op, &alux_op, &alu_op, /* AND AND DAA*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* SUB SUB SUB SUB*/ &alux_op, &alu_op, &alux_op, &alu_op, /* SUB SUB DAS*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* XOR XOR XOR XOR*/ /*30*/ &alux_op, &alu_op, &alux_op, &alu_op, /* XOR XOR AAA*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* CMP CMP CMP CMP*/ &alux_op, &alu_op, &alux_op, &alu_op, /* CMP CMP AAS*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* INC EAX INC ECX INC EDX INC EBX*/ /*40*/ &alu_op, &alu_op, &alu_op, &alu_op, @@ -1053,12 +1136,12 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, /* PUSHA POPA BOUND ARPL*/ -/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, +/*60*/ &complex_pusha_op, &complex_popa_op, &complex_bound_op, &complex_arpl_op, INVALID, INVALID, INVALID, INVALID, /* PUSH imm IMUL PUSH imm IMUL*/ - &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, + &push_imm_op, &complex_mul_op, &push_imm_op, &complex_mul_op, /* INSB INSW OUTSB OUTSW*/ - &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + &complex_ins_op, &complex_ins_op, &complex_outs_op, &complex_outs_op, /* Jxx*/ /*70*/ &branch_op, &branch_op, &branch_op, &branch_op, @@ -1068,29 +1151,29 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = /*80*/ INVALID, INVALID, INVALID, INVALID, /* TEST TEST XCHG XCHG*/ - &vector_alu1_op, &vector_alu1_op, &vector_alu3_op, &vector_alu3_op, + &complex_alu1_op, &complex_alu1_op, &complex_alu3_op, &complex_alu3_op, /* MOV MOV MOV MOV*/ &store_op, &store_op, &load_op, &load_op, /* MOV from seg LEA MOV to seg POP*/ - &mov_reg_seg_op, &store_op, &vector_mov_seg_reg_op, &pop_reg_op, + &mov_reg_seg_op, &store_op, &complex_mov_seg_reg_op, &pop_reg_op, /* NOP XCHG XCHG XCHG*/ /*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, /* XCHG XCHG XCHG XCHG*/ &xchg_op, &xchg_op, &xchg_op, &xchg_op, /* CBW CWD CALL far WAIT*/ - &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, + &complex_alu1_op, &complex_alu1_op, &complex_call_far_op, &limm_op, /* PUSHF POPF SAHF LAHF*/ - &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + &complex_pushf_op, &complex_popf_op, &complex_alux1_op, &complex_alux1_op, /* MOV MOV MOV MOV*/ /*a0*/ &load_op, &load_op, &store_op, &store_op, /* MOVSB MOVSW CMPSB CMPSW*/ - &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, + &movs_op, &movs_op, &complex_cmpsb_op, &complex_cmps_op, /* TEST TEST STOSB STOSW*/ &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, /* LODSB LODSW SCASB SCASW*/ - &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + &lods_op, &lods_op, &complex_scasb_op, &complex_scas_op, /* MOV*/ /*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, @@ -1099,57 +1182,57 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = &limm_op, &limm_op, &limm_op, &limm_op, /* RET imm RET*/ -/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/*c0*/ INVALID, INVALID, &complex_ret_op, &complex_ret_op, /* LES LDS MOV MOV*/ - &vector_lss_op, &vector_lss_op, &store_op, &store_op, + &complex_lss_op, &complex_lss_op, &store_op, &store_op, /* ENTER LEAVE RETF RETF*/ - &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, + &complex_enter_op, &leave_op, &complex_retf_op, &complex_retf_op, /* INT3 INT INTO IRET*/ - &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + &complex_int_op, &complex_int_op, &complex_int_op, &complex_iret_op, /*d0*/ INVALID, INVALID, INVALID, INVALID, /* AAM AAD SETALC XLAT*/ - &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + &complex_alux6_op, &complex_alux3_op, &complex_alux1_op, &complex_xlat_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /* LOOPNE LOOPE LOOP JCXZ*/ -/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/*e0*/ &complex_loop_op, &complex_loop_op, &loop_op, &complex_loop_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* CALL JMP JMP JMP*/ - &store_op, &branch_op, &vector_jmp_far_op, &branch_op, + &store_op, &branch_op, &complex_jmp_far_op, &branch_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* REPNE REPE*/ /*f0*/ INVALID, INVALID, INVALID, INVALID, /* HLT CMC*/ - &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, + &complex_alux1_op, &complex_alu2_op, INVALID, INVALID, /* CLC STC CLI STI*/ - &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, + &complex_alu1_op, &complex_alu1_op, &complex_cli_sti_op, &complex_cli_sti_op, /* CLD STD INCDEC*/ - &vector_alu1_op, &vector_alu1_op, &vector_alux1_op, INVALID + &complex_alu1_op, &complex_alu1_op, &complex_alux1_op, INVALID }; static const risc86_instruction_t *opcode_timings_0f[256] = { -/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, - &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, - INVALID, &load_op, &vector_femms_op, INVALID, +/*00*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + INVALID, &complex_alu6_op, &complex_alu6_op, INVALID, + &complex_invd_op, &complex_wbinvd_op, INVALID, INVALID, + INVALID, &load_op, &complex_femms_op, INVALID, /*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, -/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, +/*20*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, -/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, +/*30*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1170,7 +1253,7 @@ static const risc86_instruction_t *opcode_timings_0f[256] = INVALID, INVALID, &mload_op, &mload_op, /*70*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - &load_mmx_op, &load_mmx_op, &load_mmx_op, &vector_emms_op, + &load_mmx_op, &load_mmx_op, &load_mmx_op, &complex_emms_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, &mstore_op, &mstore_op, @@ -1179,122 +1262,122 @@ static const risc86_instruction_t *opcode_timings_0f[256] = &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, -/*90*/ &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, +/*90*/ &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, -/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_load_alu_op, - &vector_alu_store_op, &vector_alu_store_op, INVALID, INVALID, - &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_load_alu_op, - &vector_alu_store_op, &vector_alu_store_op, INVALID, &vector_mul_op, +/*a0*/ &push_seg_op, &complex_mov_seg_mem_op,&complex_cpuid_op, &complex_load_alu_op, + &complex_alu_store_op, &complex_alu_store_op, INVALID, INVALID, + &push_seg_op, &complex_mov_seg_mem_op,INVALID, &complex_load_alu_op, + &complex_alu_store_op, &complex_alu_store_op, INVALID, &complex_mul_op, -/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_load_alu_op, - &vector_lss_op, &vector_lss_op, &load_alux_op, &load_alu_op, - INVALID, INVALID, &vector_load_alu_op, &vector_load_alu_op, - &vector_bsx_op, &vector_bsx_op, &load_alux_op, &load_alu_op, +/*b0*/ &complex_cmpxchg_b_op, &complex_cmpxchg_op, &complex_lss_op, &complex_load_alu_op, + &complex_lss_op, &complex_lss_op, &load_alux_op, &load_alu_op, + INVALID, INVALID, &complex_load_alu_op, &complex_load_alu_op, + &complex_bsx_op, &complex_bsx_op, &load_alux_op, &load_alu_op, -/*c0*/ &vector_alux_store_op, &vector_alu_store_op, INVALID, INVALID, - INVALID, INVALID, INVALID, &vector_cmpxchg_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, +/*c0*/ &complex_alux_store_op, &complex_alu_store_op, INVALID, INVALID, + INVALID, INVALID, INVALID, &complex_cmpxchg_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, -/*d0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - INVALID, &load_mmx_mul_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, +/*d0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &load_mmx_mul_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, -/*e0*/ &load_mmx_op, &load_mmx_shift_op, &load_mmx_shift_op, INVALID, - INVALID, &pmul_mem_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, +/*e0*/ &load_mmx_op, &load_mmx_shift_op, &load_mmx_shift_op, INVALID, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, -/*f0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - INVALID, &pmul_mem_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, - &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, +/*f0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, }; static const risc86_instruction_t *opcode_timings_0f_mod3[256] = { -/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, - &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, - INVALID, INVALID, &vector_femms_op, INVALID, +/*00*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + INVALID, &complex_alu6_op, &complex_alu6_op, INVALID, + &complex_invd_op, &complex_wbinvd_op, INVALID, INVALID, + INVALID, INVALID, &complex_femms_op, INVALID, -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*20*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*30*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*60*/ &mmx_op, &mmx_op, &mmx_op, &mmx_op, - &mmx_op, &mmx_op, &mmx_op, &mmx_op, - &mmx_op, &mmx_op, &mmx_op, &mmx_op, - INVALID, INVALID, &mmx_op, &mmx_op, +/*60*/ &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + INVALID, INVALID, &mmx_op, &mmx_op, -/*70*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - &mmx_op, &mmx_op, &mmx_op, &vector_emms_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &mmx_op, &mmx_op, +/*70*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + &mmx_op, &mmx_op, &mmx_op, &complex_emms_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, &mmx_op, &mmx_op, /*80*/ &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, -/*90*/ &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, +/*90*/ &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, -/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_alu1_op, - &vector_alu1_op, &vector_alu1_op, INVALID, INVALID, - &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_alu1_op, - &vector_alu1_op, &vector_alu1_op, INVALID, &vector_mul_op, +/*a0*/ &push_seg_op, &complex_mov_seg_mem_op, &complex_cpuid_op, &complex_alu1_op, + &complex_alu1_op, &complex_alu1_op, INVALID, INVALID, + &push_seg_op, &complex_mov_seg_mem_op, INVALID, &complex_alu1_op, + &complex_alu1_op, &complex_alu1_op, INVALID, &complex_mul_op, -/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_alu1_op, - &vector_lss_op, &vector_lss_op, &alux_op, &alu_op, - INVALID, INVALID, &vector_alu1_op, &vector_alu1_op, - &vector_bsx_op, &vector_bsx_op, &alux_op, &alu_op, +/*b0*/ &complex_cmpxchg_b_op, &complex_cmpxchg_op, &complex_lss_op, &complex_alu1_op, + &complex_lss_op, &complex_lss_op, &alux_op, &alu_op, + INVALID, INVALID, &complex_alu1_op, &complex_alu1_op, + &complex_bsx_op, &complex_bsx_op, &alux_op, &alu_op, -/*c0*/ &vector_alux1_op, &vector_alu1_op, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, +/*c0*/ &complex_alux1_op, &complex_alu1_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, -/*d0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - INVALID, &mmx_mul_op, INVALID, INVALID, - &mmx_op, &mmx_op, INVALID, &mmx_op, - &mmx_op, &mmx_op, INVALID, &mmx_op, +/*d0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &mmx_mul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, -/*e0*/ &mmx_op, &mmx_shift_op, &mmx_shift_op, INVALID, - INVALID, &pmul_op, INVALID, INVALID, - &mmx_op, &mmx_op, INVALID, &mmx_op, - &mmx_op, &mmx_op, INVALID, &mmx_op, +/*e0*/ &mmx_op, &mmx_shift_op, &mmx_shift_op, INVALID, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, -/*f0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - INVALID, &pmul_op, INVALID, INVALID, - &mmx_op, &mmx_op, &mmx_op, INVALID, - &mmx_op, &mmx_op, &mmx_op, INVALID, +/*f0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, }; static const risc86_instruction_t *opcode_timings_0f0f[256] = @@ -1466,100 +1549,100 @@ static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = static const risc86_instruction_t *opcode_timings_shift[8] = { - &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, - &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op + &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, + &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op }; static const risc86_instruction_t *opcode_timings_shift_b[8] = { - &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, - &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op + &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, + &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op }; static const risc86_instruction_t *opcode_timings_shift_mod3[8] = { - &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, - &alu_op, &alu_op, &alu_op, &alu_op + &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, + &alu_op, &alu_op, &alu_op, &alu_op }; static const risc86_instruction_t *opcode_timings_shift_b_mod3[8] = { - &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, - &alux_op, &alux_op, &alux_op, &alux_op + &complex_alux1_op, &complex_alux1_op, &complex_alux1_op, &complex_alux1_op, + &alux_op, &alux_op, &alux_op, &alux_op }; static const risc86_instruction_t *opcode_timings_80[8] = { - &alux_store_op, &alux_store_op, &vector_alux_store_op, &vector_alux_store_op, - &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, + &alux_store_op, &alux_store_op, &complex_alux_store_op, &complex_alux_store_op, + &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, }; static const risc86_instruction_t *opcode_timings_80_mod3[8] = { - &alux_op, &alux_op, &alux_store_op, &alux_store_op, - &alux_op, &alux_op, &alux_op, &alux_op, + &alux_op, &alux_op, &alux_store_op, &alux_store_op, + &alux_op, &alux_op, &alux_op, &alux_op, }; static const risc86_instruction_t *opcode_timings_8x[8] = { - &alu_store_op, &alu_store_op, &vector_alu_store_op, &vector_alu_store_op, - &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, + &alu_store_op, &alu_store_op, &complex_alu_store_op, &complex_alu_store_op, + &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, }; static const risc86_instruction_t *opcode_timings_8x_mod3[8] = { - &alu_op, &alu_op, &alu_store_op, &alu_store_op, - &alu_op, &alu_op, &alu_op, &alu_op, + &alu_op, &alu_op, &alu_store_op, &alu_store_op, + &alu_op, &alu_op, &alu_op, &alu_op, }; static const risc86_instruction_t *opcode_timings_f6[8] = { /* TST NOT NEG*/ - &test_mem_imm_b_op, INVALID, &vector_alux_store_op, &vector_alux_store_op, + &test_mem_imm_b_op, INVALID, &complex_alux_store_op, &complex_alux_store_op, /* MUL IMUL DIV IDIV*/ - &vector_mul_mem_op, &vector_mul_mem_op, &vector_div16_mem_op, &vector_div16_mem_op, + &complex_mul_mem_op, &complex_mul_mem_op, &complex_div16_mem_op, &complex_div16_mem_op, }; static const risc86_instruction_t *opcode_timings_f6_mod3[8] = { /* TST NOT NEG*/ &test_reg_b_op, INVALID, &alux_op, &alux_op, /* MUL IMUL DIV IDIV*/ - &vector_mul_op, &vector_mul_op, &vector_div16_op, &vector_div16_op, + &complex_mul_op, &complex_mul_op, &complex_div16_op, &complex_div16_op, }; static const risc86_instruction_t *opcode_timings_f7[8] = { /* TST NOT NEG*/ - &test_mem_imm_op, INVALID, &vector_alu_store_op, &vector_alu_store_op, + &test_mem_imm_op, INVALID, &complex_alu_store_op, &complex_alu_store_op, /* MUL IMUL DIV IDIV*/ - &vector_mul64_mem_op, &vector_mul64_mem_op, &vector_div32_mem_op, &vector_div32_mem_op, + &complex_mul64_mem_op, &complex_mul64_mem_op, &complex_div32_mem_op, &complex_div32_mem_op, }; static const risc86_instruction_t *opcode_timings_f7_mod3[8] = { /* TST NOT NEG*/ &test_reg_op, INVALID, &alu_op, &alu_op, /* MUL IMUL DIV IDIV*/ - &vector_mul64_op, &vector_mul64_op, &vector_div32_op, &vector_div32_op, + &complex_mul64_op, &complex_mul64_op, &complex_div32_op, &complex_div32_op, }; static const risc86_instruction_t *opcode_timings_ff[8] = { /* INC DEC CALL CALL far*/ - &alu_store_op, &alu_store_op, &store_op, &vector_call_far_op, + &alu_store_op, &alu_store_op, &store_op, &complex_call_far_op, /* JMP JMP far PUSH*/ - &branch_op, &vector_jmp_far_op, &push_mem_op, INVALID + &branch_op, &complex_jmp_far_op, &push_mem_op, INVALID }; static const risc86_instruction_t *opcode_timings_ff_mod3[8] = { /* INC DEC CALL CALL far*/ - &vector_alu1_op, &vector_alu1_op, &store_op, &vector_call_far_op, + &complex_alu1_op, &complex_alu1_op, &store_op, &complex_call_far_op, /* JMP JMP far PUSH*/ - &branch_op, &vector_jmp_far_op, &vector_push_mem_op, INVALID + &branch_op, &complex_jmp_far_op, &complex_push_mem_op, INVALID }; static const risc86_instruction_t *opcode_timings_d8[8] = { /* FADDs FMULs FCOMs FCOMPs*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FSUBs FSUBRs FDIVs FDIVRs*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; static const risc86_instruction_t *opcode_timings_d8_mod3[8] = { /* FADD FMUL FCOM FCOMP*/ - &float_op, &float_op, &float_op, &float_op, + &fadd_op, &fmul_op, &float_op, &float_op, /* FSUB FSUBR FDIV FDIVR*/ &float_op, &float_op, &fdiv_op, &fdiv_op, }; @@ -1569,7 +1652,7 @@ static const risc86_instruction_t *opcode_timings_d9[8] = /* FLDs FSTs FSTPs*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FLDENV FLDCW FSTENV FSTCW*/ - &vector_float_l_op, &vector_fldcw_op, &vector_float_l_op, &vector_float_op + &complex_float_l_op, &complex_fldcw_op, &complex_float_l_op, &complex_float_op }; static const risc86_instruction_t *opcode_timings_d9_mod3[64] = { @@ -1577,16 +1660,16 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, /*FXCH*/ - &float_op, &float_op, &float_op, &float_op, - &float_op, &float_op, &float_op, &float_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, /*FNOP*/ &float_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /*FSTP*/ - &float_op, &float_op, &float_op, &float_op, - &float_op, &float_op, &float_op, &float_op, + &float2_op, &float2_op, &float2_op, &float2_op, + &float2_op, &float2_op, &float2_op, &float2_op, /* opFCHS opFABS*/ - &float_op, &float_op, INVALID, INVALID, + &fchs_op, &float_op, INVALID, INVALID, /* opFTST opFXAM*/ &float_op, &float_op, INVALID, INVALID, /* opFLD1 opFLDL2T opFLDL2E opFLDPI*/ @@ -1606,7 +1689,7 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = static const risc86_instruction_t *opcode_timings_da[8] = { /* FIADDl FIMULl FICOMl FICOMPl*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FISUBl FISUBRl FIDIVl FIDIVRl*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; @@ -1622,7 +1705,7 @@ static const risc86_instruction_t *opcode_timings_db[8] = /* FLDil FSTil FSTPil*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FLDe FSTPe*/ - INVALID, &vector_flde_op, INVALID, &vector_fste_op + INVALID, &complex_flde_op, INVALID, &complex_fste_op }; static const risc86_instruction_t *opcode_timings_db_mod3[64] = { @@ -1656,14 +1739,14 @@ static const risc86_instruction_t *opcode_timings_db_mod3[64] = static const risc86_instruction_t *opcode_timings_dc[8] = { /* FADDd FMULd FCOMd FCOMPd*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FSUBd FSUBRd FDIVd FDIVRd*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; static const risc86_instruction_t *opcode_timings_dc_mod3[8] = { /* opFADDr opFMULr*/ - &float_op, &float_op, INVALID, INVALID, + &fadd_op, &fmul_op, INVALID, INVALID, /* opFSUBRr opFSUBr opFDIVRr opFDIVr*/ &float_op, &float_op, &fdiv_op, &fdiv_op }; @@ -1673,7 +1756,7 @@ static const risc86_instruction_t *opcode_timings_dd[8] = /* FLDd FSTd FSTPd*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FRSTOR FSAVE FSTSW*/ - &vector_float_l_op, INVALID, &vector_float_l_op, &vector_float_l_op + &complex_float_l_op, INVALID, &complex_float_l_op, &complex_float_l_op }; static const risc86_instruction_t *opcode_timings_dd_mod3[8] = { @@ -1686,14 +1769,14 @@ static const risc86_instruction_t *opcode_timings_dd_mod3[8] = static const risc86_instruction_t *opcode_timings_de[8] = { /* FIADDw FIMULw FICOMw FICOMPw*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, /* FISUBw FISUBRw FIDIVw FIDIVRw*/ - &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, }; static const risc86_instruction_t *opcode_timings_de_mod3[8] = { /* FADDP FMULP FCOMPP*/ - &float_op, &float_op, INVALID, &float_op, + &fadd_op, &fmul_op, INVALID, &float_op, /* FSUBP FSUBRP FDIVP FDIVRP*/ &float_op, &float_op, &fdiv_op, &fdiv_op, }; @@ -1703,7 +1786,7 @@ static const risc86_instruction_t *opcode_timings_df[8] = /* FILDiw FISTiw FISTPiw*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FILDiq FBSTP FISTPiq*/ - INVALID, &load_float_op, &vector_float_l_op, &fstore_op, + INVALID, &load_float_op, &complex_float_l_op, &fstore_op, }; static const risc86_instruction_t *opcode_timings_df_mod3[8] = { @@ -1731,34 +1814,27 @@ static p6_unit_t *units; /*Pentium Pro has no MMX*/ static p6_unit_t ppro_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX)}, /*Integer X*/ - {.uop_mask = (1 << UOP_ALU)}, /*Integer Y*/ - {.uop_mask = (1 << UOP_FLOAT)}, /*Floating point*/ - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Load*/ - {.uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE)}, /*Store*/ - {.uop_mask = (1 << UOP_BRANCH)} /*Branch*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_FLOAT)}, /*Integer X & Floating point*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Integer Y*/ + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Load*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Data Store*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Address Store*/ }; #define NR_PPRO_UNITS (sizeof(ppro_units) / sizeof(p6_unit_t)) -/*Well, it works I guess*/ +/*Pentium II/Celeron assigns the multiplier to port 0, the shifter to port 1, and shares the MMX ALU*/ static p6_unit_t p2_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_MEU) | /*Integer X*/ - (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL)}, - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_MEU) | /*Integer Y*/ - (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL)}, - {.uop_mask = (1 << UOP_FLOAT)}, /*Floating point*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_FLOAT) | /*Integer X & Floating point*/ + (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Integer Y*/ + (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Load*/ - {.uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE)}, /*Store*/ - {.uop_mask = (1 << UOP_BRANCH)} /*Branch*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Data Store*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Address Store*/ }; #define NR_P2_UNITS (sizeof(p2_units) / sizeof(p6_unit_t)) -/*First available cycles of shared execution units. Each of these can be submitted - to by ALU X and Y*/ -static int mul_first_available_cycle; -static int shift_first_available_cycle; - static int uop_run(const risc86_uop_t *uop, int decode_time) { int c; @@ -1767,16 +1843,8 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) /*UOP_LIMM does not require execution*/ if (uop->type == UOP_LIMM) - return decode_time; + return decode_time; - if (units == p2_units) /*More hackyness*/ - { - if (uop->type == UOP_MEU_MUL && decode_time < mul_first_available_cycle) - decode_time = mul_first_available_cycle; - else if (uop->type == UOP_MEU_SHIFT && decode_time < mul_first_available_cycle) - decode_time = shift_first_available_cycle; - } - /*Find execution unit for this uOP*/ for (c = 0; c < nr_units; c++) { @@ -1790,43 +1858,36 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) } } if (!best_unit) - fatal("uop_run: can not find execution unit\n"); + fatal("uop_run: can not find execution unit\n"); if (best_start_cycle < decode_time) best_start_cycle = decode_time; - best_unit->first_available_cycle = best_start_cycle + uop->throughput; + best_unit->first_available_cycle = best_start_cycle + uop->latency; - if (units == p2_units) /*More hackyness*/ - { - if (uop->type == UOP_MEU_MUL) - mul_first_available_cycle = best_start_cycle + uop->throughput; - else if (uop->type == UOP_MEU_SHIFT) - shift_first_available_cycle = best_start_cycle + uop->throughput; - } - return best_start_cycle + uop->throughput; + + return best_start_cycle + uop->latency; } -/*The K6 decoder can decode, per clock : - - 1 or 2 'short' instructions, each up to 2 uOPs and 7 bytes long - - 1 'long' instruction, up to 4 uOPs - - 1 'vector' instruction, up to 4 uOPs per cycle, plus (I think) 1 cycle startup delay) +/*The P6 decoders can decode, per clock : + - 1 to 3 'simple' instructions, each up to 1 uOP and 7 bytes long + - 1 'complex' instruction, up to 4 uOPs or 3 per cycle for instructions longer than 4 uOPs */ static struct { int nr_uops; - const risc86_uop_t *uops[4]; + const risc86_uop_t *uops[6]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[4]; + int earliest_start[6]; } decode_buffer; -#define NR_OPQUADS 6 -/*Timestamps of when the last six opquads completed. The K6 scheduler retires - opquads in order, so this is needed to determine when the next can be scheduled*/ -static int opquad_completion_timestamp[NR_OPQUADS]; -static int next_opquad = 0; +#define NR_OPSEQS 3 +/*Timestamps of when the last three op sequences completed. Technically this is incorrect, +as the actual size of the opseq buffer is 20 bytes and not 18, but I'm restricted to multiples of 6*/ +static int opseq_completion_timestamp[NR_OPSEQS]; +static int next_opseq = 0; #define NR_REGS 8 /*Timestamp of when last operation on an integer register completed*/ @@ -1841,50 +1902,48 @@ void decode_flush_p6() { int c; int uop_timestamp = 0; - - /*Decoded opquad can not be submitted if there are no free spaces in the - opquad buffer*/ - if (decode_timestamp < opquad_completion_timestamp[next_opquad]) - decode_timestamp = opquad_completion_timestamp[next_opquad]; + + /*Decoded opseq can not be submitted if there are no free spaces in the + opseq buffer*/ + if (decode_timestamp < opseq_completion_timestamp[next_opseq]) + decode_timestamp = opseq_completion_timestamp[next_opseq]; /*Ensure that uops can not be submitted before they have been decoded*/ if (decode_timestamp > last_uop_timestamp) last_uop_timestamp = decode_timestamp; /*Submit uops to execution units, and determine the latest completion time*/ - for (c = 0; c < decode_buffer.nr_uops; c++) + for (c = 0; c < (decode_buffer.nr_uops); c++) { int start_timestamp; - if (decode_buffer.earliest_start[c] == -1) - start_timestamp = last_uop_timestamp; - else - start_timestamp = decode_buffer.earliest_start[c]; + + start_timestamp = decode_buffer.earliest_start[c]; last_uop_timestamp = uop_run(decode_buffer.uops[c], start_timestamp); if (last_uop_timestamp > uop_timestamp) uop_timestamp = last_uop_timestamp; } - /*Calculate opquad completion time. Since opquads complete in order, it + /*Calculate opseq completion time. Since opseqs complete in order, it must be after the last completion.*/ if (uop_timestamp <= last_complete_timestamp) last_complete_timestamp = last_complete_timestamp + 1; else last_complete_timestamp = uop_timestamp; - /*Advance to next opquad in buffer*/ - opquad_completion_timestamp[next_opquad] = last_complete_timestamp; - next_opquad++; - if (next_opquad == NR_OPQUADS) - next_opquad = 0; + /*Advance to next opseq in buffer*/ + opseq_completion_timestamp[next_opseq] = last_complete_timestamp; + next_opseq++; + if (next_opseq == NR_OPSEQS) + next_opseq = 0; decode_timestamp++; decode_buffer.nr_uops = 0; } /*The instruction is only of interest here if it's longer than 7 bytes, as that's the - limit on K6 short decoding*/ + limit on P6 simple decoding*/ static int codegen_timing_instr_length(uint64_t deps, uint32_t fetchdat, int op_32) { int len = prefixes + 1; /*Opcode*/ @@ -1936,8 +1995,9 @@ static int codegen_timing_instr_length(uint64_t deps, uint32_t fetchdat, int op_ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetchdat, int op_32, int bit8) { uint32_t regmask_required; - uint32_t regmask_modified; - int c, d; + uint32_t regmask_modified; + int c; + int d = 0; /*Complex decoder uOPs*/ int earliest_start = 0; decode_type_t decode_type = ins->decode_type; int instr_length = codegen_timing_instr_length(deps, fetchdat, op_32); @@ -1967,87 +2027,68 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u earliest_start = fpu_st_timestamp[reg]; } - /*Short decoders are limited to 7 bytes*/ - if (decode_type == DECODE_SHORT && instr_length > 7) - decode_type = DECODE_LONG; - /*Long decoder is limited to 11 bytes*/ - else if (instr_length > 11) - decode_type = DECODE_VECTOR; + /*Simple decoders are limited to 7 bytes & 1 uOP*/ + if (decode_type == DECODE_SIMPLE && instr_length > 7) + decode_type = DECODE_COMPLEX; + else if (decode_type == DECODE_SIMPLE && ins->nr_uops > 1) + decode_type = DECODE_COMPLEX; switch (decode_type) - { - case DECODE_SHORT: - if (decode_buffer.nr_uops) + { + case DECODE_SIMPLE: + if (decode_buffer.nr_uops - d == 2) + { + decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; + decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; + decode_buffer.nr_uops = 3; + decode_flush_p6(); + } + else if (decode_buffer.nr_uops - d == 1) + { + decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; + decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; + decode_buffer.nr_uops = 2+d; + if (d) + decode_flush_p6(); + } + else if (decode_buffer.nr_uops) { decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; - if (ins->nr_uops > 1) - { - decode_buffer.uops[decode_buffer.nr_uops+1] = &ins->uop[1]; - decode_buffer.earliest_start[decode_buffer.nr_uops+1] = -1; - } - decode_buffer.nr_uops += ins->nr_uops; - - decode_flush_p6(); + decode_buffer.nr_uops = 1+d; } else { - decode_buffer.nr_uops = ins->nr_uops; + decode_buffer.nr_uops = 1; decode_buffer.uops[0] = &ins->uop[0]; decode_buffer.earliest_start[0] = earliest_start; - if (ins->nr_uops > 1) - { - decode_buffer.uops[1] = &ins->uop[1]; - decode_buffer.earliest_start[1] = -1; - } - } + } break; - case DECODE_LONG: + case DECODE_COMPLEX: if (decode_buffer.nr_uops) - decode_flush_p6(); + decode_flush_p6(); /*The 4-1-1 arrangement implies that a complex ins. can't be decoded after a simple one*/ - decode_buffer.nr_uops = ins->nr_uops; - for (c = 0; c < ins->nr_uops; c++) - { - decode_buffer.uops[c] = &ins->uop[c]; - if (c == 0) - decode_buffer.earliest_start[c] = earliest_start; - else - decode_buffer.earliest_start[c] = -1; - } - decode_flush_p6(); - break; - - case DECODE_VECTOR: - if (decode_buffer.nr_uops) - decode_flush_p6(); - - decode_timestamp++; d = 0; - + for (c = 0; c < ins->nr_uops; c++) { decode_buffer.uops[d] = &ins->uop[c]; - if (c == 0) - decode_buffer.earliest_start[d] = earliest_start; - else - decode_buffer.earliest_start[d] = -1; - d++; + decode_buffer.earliest_start[c] = earliest_start; + d++; - if (d == 4) + if (d == 3 && ins->nr_uops > 4) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { d = 0; - decode_buffer.nr_uops = 4; - decode_flush_p6(); + decode_buffer.nr_uops = 3; + decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - decode_flush_p6(); - } - break; + if (d) + { + decode_buffer.nr_uops = d; + } + break; } /*Update write timestamps for any output registers*/ @@ -2098,15 +2139,12 @@ void codegen_timing_p6_block_start() for (c = 0; c < nr_units; c++) units[c].first_available_cycle = 0; - mul_first_available_cycle = 0; - shift_first_available_cycle = 0; - decode_timestamp = 0; last_complete_timestamp = 0; - for (c = 0; c < NR_OPQUADS; c++) - opquad_completion_timestamp[c] = 0; - next_opquad = 0; + for (c = 0; c < NR_OPSEQS; c++) + opseq_completion_timestamp[c] = 0; + next_opseq = 0; for (c = 0; c < NR_REGS; c++) reg_available_timestamp[c] = 0; @@ -2298,7 +2336,7 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint if (ins_table[opcode]) decode_instruction(ins_table[opcode], deps[opcode], fetchdat, op_32, bit8); else - decode_instruction(&vector_alu1_op, 0, fetchdat, op_32, bit8); + decode_instruction(&complex_alu1_op, 0, fetchdat, op_32, bit8); codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp); } @@ -2327,4 +2365,4 @@ codegen_timing_t codegen_timing_p6 = codegen_timing_p6_block_start, codegen_timing_p6_block_end, codegen_timing_p6_jump_cycles -}; +}; \ No newline at end of file diff --git a/src/cpu_new/codegen_timing_p6.c b/src/cpu_new/codegen_timing_p6.c index d84a18904..845f46803 100644 --- a/src/cpu_new/codegen_timing_p6.c +++ b/src/cpu_new/codegen_timing_p6.c @@ -1,4 +1,5 @@ -/*Hacky P6 timings based on K6 timings*/ +/*Basic P6 timing model by plant/nerd73. Based on the K6 timing model*/ +/*Some cycle timings come from https://www.agner.org/optimize/instruction_tables.pdf*/ #include #include <86box/86box.h> #include "cpu.h" @@ -18,24 +19,26 @@ typedef enum uop_type_t UOP_ALU = 0, /*Executes in Integer X or Y units*/ UOP_ALUX, /*Executes in Integer X unit*/ UOP_LOAD, /*Executes in Load unit*/ - UOP_STORE, /*Executes in Store unit*/ + UOP_STORED, /*Executes in Data Store unit*/ + UOP_STOREA, /*Executes in Address Store unit*/ UOP_FLOAD, /*Executes in Load unit*/ - UOP_FSTORE, /*Executes in Store unit*/ + UOP_FSTORED, /*Executes in Data Store unit*/ + UOP_FSTOREA, /*Executes in Address Store unit*/ UOP_MLOAD, /*Executes in Load unit*/ - UOP_MSTORE, /*Executes in Store unit*/ + UOP_MSTORED, /*Executes in Data Store unit*/ + UOP_MSTOREA, /*Executes in Address Store unit*/ UOP_FLOAT, /*Executes in Floating Point unit*/ - UOP_MEU, /*Executes in Multimedia unit*/ - UOP_MEU_SHIFT, /*Executes in Multimedia unit or ALU X/Y. Uses MMX shifter*/ - UOP_MEU_MUL, /*Executes in Multimedia unit or ALU X/Y. Uses MMX multiplier*/ + UOP_MMX, /*Executes in Integer X or Y units as MMX*/ + UOP_MMX_SHIFT, /*Executes in Integer Y unit. Uses MMX shifter*/ + UOP_MMX_MUL, /*Executes in Integer X unit. Uses MMX multiplier*/ UOP_BRANCH, /*Executes in Branch unit*/ UOP_LIMM /*Does not require an execution unit*/ } uop_type_t; typedef enum decode_type_t { - DECODE_SHORT, - DECODE_LONG, - DECODE_VECTOR + DECODE_SIMPLE, + DECODE_COMPLEX, } decode_type_t; #define MAX_UOPS 10 @@ -43,7 +46,6 @@ typedef enum decode_type_t typedef struct risc86_uop_t { uop_type_t type; - double throughput; double latency; } risc86_uop_t; @@ -57,804 +59,885 @@ typedef struct risc86_instruction_t static const risc86_instruction_t alu_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t alux_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t load_alu_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t load_alux_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t alu_store_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} + }; static const risc86_instruction_t alux_store_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t branch_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_BRANCH, .latency = 1} }; static const risc86_instruction_t limm_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LIMM, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_LIMM, .latency = 1} }; static const risc86_instruction_t load_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1} }; static const risc86_instruction_t store_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t bswap_op = { - .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, }; static const risc86_instruction_t leave_op = { .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t lods_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t loop_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} }; static const risc86_instruction_t mov_reg_seg_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, }; static const risc86_instruction_t movs_op = { .nr_uops = 4, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t pop_reg_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t pop_mem_op = { - .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t push_imm_op = { - .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2}, + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1}, }; static const risc86_instruction_t push_mem_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1} }; static const risc86_instruction_t push_seg_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t stos_op = { - .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_reg_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_reg_b_op = { .nr_uops = 1, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t test_mem_imm_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t test_mem_imm_b_op = { .nr_uops = 2, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} }; static const risc86_instruction_t xchg_op = { .nr_uops = 3, - .decode_type = DECODE_LONG, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; static const risc86_instruction_t mmx_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX, .latency = 1.5} }; static const risc86_instruction_t mmx_mul_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1.5, .latency = 3} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t mmx_shift_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_SHIFT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_SHIFT, .latency = 1.5} }; static const risc86_instruction_t load_mmx_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU, .throughput = 1.5, .latency = 3} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_MMX, .latency = 1.5} }; static const risc86_instruction_t load_mmx_mul_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_MUL, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t load_mmx_shift_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_SHIFT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_SHIFT, .latency = 1.5} }; static const risc86_instruction_t mload_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MLOAD, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_MLOAD, .latency = 3}, }; static const risc86_instruction_t mstore_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MSTORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_MSTORED, .latency = 1}, + .uop[1] = {.type = UOP_MSTOREA, .latency = 1} }; static const risc86_instruction_t pmul_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_MMX_MUL, .latency = 1.5} }; static const risc86_instruction_t pmul_mem_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_MMX_MUL, .latency = 1.5} }; - static const risc86_instruction_t float_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t fadd_op = +{ + .nr_uops = 1, + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_FLOAT, .latency = 3} +}; +static const risc86_instruction_t fmul_op = +{ + .nr_uops = 1, + .decode_type = DECODE_SIMPLE, + .uop[0] = {.type = UOP_ALU, .latency = 5} +}; +static const risc86_instruction_t float2_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t fchs_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 2}, + .uop[1] = {.type = UOP_FLOAT, .latency = 2}, + .uop[2] = {.type = UOP_FLOAT, .latency = 2} }; static const risc86_instruction_t load_float_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAT, .throughput = 1.5, .latency = 1.5} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1} +}; +static const risc86_instruction_t load_fadd_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 3} +}; +static const risc86_instruction_t load_fmul_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 5} }; static const risc86_instruction_t fstore_op = { - .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FSTORED, .latency = 1}, + .uop[1] = {.type = UOP_FSTOREA, .latency = 1}, +}; +static const risc86_instruction_t load_fiadd_op = +{ + .nr_uops = 7, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 1}, + .uop[2] = {.type = UOP_FLOAT, .latency = 1}, + .uop[3] = {.type = UOP_FLOAT, .latency = 1}, + .uop[4] = {.type = UOP_FLOAT, .latency = 1}, + .uop[5] = {.type = UOP_FLOAT, .latency = 1}, + .uop[6] = {.type = UOP_FLOAT, .latency = 1} }; - static const risc86_instruction_t fdiv_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 38, .latency = 38} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 32} }; static const risc86_instruction_t fdiv_mem_op = { .nr_uops = 2, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAT, .throughput = 38, .latency = 38} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAT, .latency = 38} }; static const risc86_instruction_t fsin_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 62, .latency = 62} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 60} }; static const risc86_instruction_t fsqrt_op = { .nr_uops = 1, - .decode_type = DECODE_SHORT, - .uop[0] = {.type = UOP_FLOAT, .throughput = 49, .latency = 49} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 69} }; -static const risc86_instruction_t vector_fldcw_op = +static const risc86_instruction_t complex_fldcw_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 8, .latency = 8} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 10} }; -static const risc86_instruction_t vector_float_op = +static const risc86_instruction_t complex_float_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 1} }; -static const risc86_instruction_t vector_float_l_op = +static const risc86_instruction_t complex_float_l_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 50, .latency = 50} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 50} }; -static const risc86_instruction_t vector_flde_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2} -}; -static const risc86_instruction_t vector_fste_op = +static const risc86_instruction_t complex_flde_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2}, - .uop[1] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAD, .latency = 1}, + .uop[1] = {.type = UOP_FLOAD, .latency = 1}, + .uop[2] = {.type = UOP_FLOAT, .latency = 2} +}; +static const risc86_instruction_t complex_fste_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_FLOAT, .latency = 2}, + .uop[1] = {.type = UOP_FSTORED, .latency = 1}, + .uop[2] = {.type = UOP_FSTOREA, .latency = 1} }; -static const risc86_instruction_t vector_alu1_op = +static const risc86_instruction_t complex_alu1_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu2_op = +static const risc86_instruction_t complex_alu2_op = { .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu3_op = +static const risc86_instruction_t complex_alu3_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alu6_op = +static const risc86_instruction_t complex_alu6_op = { .nr_uops = 6, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1}, + .uop[4] = {.type = UOP_ALU, .latency = 1}, + .uop[5] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_alux1_op = +static const risc86_instruction_t complex_alux1_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alux3_op = +static const risc86_instruction_t complex_alux3_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alux6_op = +static const risc86_instruction_t complex_alux6_op = { - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .nr_uops = 6, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1}, + .uop[3] = {.type = UOP_ALUX, .latency = 1}, + .uop[4] = {.type = UOP_ALUX, .latency = 1}, + .uop[5] = {.type = UOP_ALUX, .latency = 1} }; -static const risc86_instruction_t vector_alu_store_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_alux_store_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_arpl_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_bound_op = +static const risc86_instruction_t complex_alu_store_op = { .nr_uops = 4, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1}, }; -static const risc86_instruction_t vector_bsx_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_call_far_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cli_sti_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 7, .latency = 7} -}; -static const risc86_instruction_t vector_cmps_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cmpsb_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_cmpxchg_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, -}; -static const risc86_instruction_t vector_cmpxchg_b_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, -}; -static const risc86_instruction_t vector_cpuid_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 22, .latency = 22} -}; -static const risc86_instruction_t vector_div16_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_div16_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_div32_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 18, .latency = 18} -}; -static const risc86_instruction_t vector_div32_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 18, .latency = 18} -}; -static const risc86_instruction_t vector_emms_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 25, .latency = 25} -}; -static const risc86_instruction_t vector_enter_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 10, .latency = 10} -}; -static const risc86_instruction_t vector_femms_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 6, .latency = 6} -}; -static const risc86_instruction_t vector_in_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11} -}; -static const risc86_instruction_t vector_ins_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_int_op = -{ - .nr_uops = 5, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 20, .latency = 20}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_iret_op = -{ - .nr_uops = 5, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[3] = {.type = UOP_ALU, .throughput = 20, .latency = 20}, - .uop[4] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_invd_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1000, .latency = 1000} -}; -static const risc86_instruction_t vector_jmp_far_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_load_alu_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_load_alux_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_loop_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_lss_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[2] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mov_mem_seg_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mov_seg_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mov_seg_reg_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3} -}; -static const risc86_instruction_t vector_mul_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul64_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_mul64_mem_op = +static const risc86_instruction_t complex_alux_store_op = { .nr_uops = 4, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} }; -static const risc86_instruction_t vector_out_op = +static const risc86_instruction_t complex_arpl_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_bound_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_bsx_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 10, .latency = 10} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 10} }; -static const risc86_instruction_t vector_outs_op = +static const risc86_instruction_t complex_call_far_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_cli_sti_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 7} +}; +static const risc86_instruction_t complex_cmps_op = { .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 10, .latency = 10}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} }; -static const risc86_instruction_t vector_pusha_op = +static const risc86_instruction_t complex_cmpsb_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_cmpxchg_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_cmpxchg_b_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_STORED, .latency = 1}, + .uop[3] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_cpuid_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 23} +}; +static const risc86_instruction_t complex_div16_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 10} +}; +static const risc86_instruction_t complex_div16_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 10} +}; +static const risc86_instruction_t complex_div32_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 18} +}; +static const risc86_instruction_t complex_div32_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 18} +}; +static const risc86_instruction_t complex_emms_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 25} +}; +static const risc86_instruction_t complex_enter_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 10} +}; +static const risc86_instruction_t complex_femms_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 6} +}; +static const risc86_instruction_t complex_in_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 10} +}; +static const risc86_instruction_t complex_ins_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 10}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_int_op = { .nr_uops = 8, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[6] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[7] = {.type = UOP_STORE, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 20}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_STORED, .latency = 1}, + .uop[4] = {.type = UOP_STOREA, .latency = 1}, + .uop[5] = {.type = UOP_STORED, .latency = 1}, + .uop[6] = {.type = UOP_STOREA, .latency = 1}, + .uop[7] = {.type = UOP_BRANCH, .latency = 1} }; -static const risc86_instruction_t vector_popa_op = +static const risc86_instruction_t complex_iret_op = +{ + .nr_uops = 5, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_LOAD, .latency = 3}, + .uop[2] = {.type = UOP_LOAD, .latency = 3}, + .uop[3] = {.type = UOP_ALU, .latency = 20}, + .uop[4] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_invd_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 500} +}; +static const risc86_instruction_t complex_jmp_far_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_load_alu_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_load_alux_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_loop_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_lss_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mov_mem_seg_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, +}; +static const risc86_instruction_t complex_mov_seg_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mov_seg_reg_op = +{ + .nr_uops = 1, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 3} +}; +static const risc86_instruction_t complex_mul_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul_mem_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul64_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_mul64_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALUX, .latency = 1}, + .uop[3] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_out_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 10}, + .uop[1] = {.type = UOP_STOREA, .latency = 10}, +}; +static const risc86_instruction_t complex_outs_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 10}, + .uop[1] = {.type = UOP_STOREA, .latency = 10}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_pusha_op = { .nr_uops = 8, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[3] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[4] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[5] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[6] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[7] = {.type = UOP_LOAD, .throughput = 1, .latency = 1} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 2}, + .uop[1] = {.type = UOP_STOREA, .latency = 2}, + .uop[2] = {.type = UOP_STORED, .latency = 2}, + .uop[3] = {.type = UOP_STOREA, .latency = 2}, + .uop[4] = {.type = UOP_STORED, .latency = 2}, + .uop[5] = {.type = UOP_STOREA, .latency = 2}, + .uop[6] = {.type = UOP_STORED, .latency = 2}, + .uop[7] = {.type = UOP_STOREA, .latency = 2} }; -static const risc86_instruction_t vector_popf_op = +static const risc86_instruction_t complex_popa_op = +{ + .nr_uops = 8, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1}, + .uop[2] = {.type = UOP_LOAD, .latency = 1}, + .uop[3] = {.type = UOP_LOAD, .latency = 1}, + .uop[4] = {.type = UOP_LOAD, .latency = 1}, + .uop[5] = {.type = UOP_LOAD, .latency = 1}, + .uop[6] = {.type = UOP_LOAD, .latency = 1}, + .uop[7] = {.type = UOP_LOAD, .latency = 1} +}; +static const risc86_instruction_t complex_popf_op = { .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 17, .latency = 17} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 3}, + .uop[1] = {.type = UOP_ALUX, .latency = 17} }; -static const risc86_instruction_t vector_push_mem_op = +static const risc86_instruction_t complex_push_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_STORED, .latency = 1}, + .uop[1] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_pushf_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1} +}; +static const risc86_instruction_t complex_ret_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_retf_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 3}, + .uop[2] = {.type = UOP_BRANCH, .latency = 1} +}; +static const risc86_instruction_t complex_scas_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_scasb_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_setcc_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_FSTORED, .latency = 1}, + .uop[3] = {.type = UOP_FSTOREA, .latency = 1} +}; +static const risc86_instruction_t complex_setcc_reg_op = +{ + .nr_uops = 3, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALUX, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_test_mem_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_test_mem_b_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_ALUX, .latency = 1} +}; +static const risc86_instruction_t complex_xchg_mem_op = +{ + .nr_uops = 4, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_LOAD, .latency = 1}, + .uop[1] = {.type = UOP_STORED, .latency = 1}, + .uop[2] = {.type = UOP_STOREA, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1} +}; +static const risc86_instruction_t complex_xlat_op = +{ + .nr_uops = 2, + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 1}, + .uop[1] = {.type = UOP_LOAD, .latency = 1} +}; +static const risc86_instruction_t complex_wbinvd_op = { .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_pushf_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_ret_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_retf_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, - .uop[2] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_scas_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_scasb_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_setcc_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_setcc_reg_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_test_mem_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_test_mem_b_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, - .uop[1] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_xchg_mem_op = -{ - .nr_uops = 3, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .throughput = 1, .latency = 1} -}; -static const risc86_instruction_t vector_xlat_op = -{ - .nr_uops = 2, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, - .uop[1] = {.type = UOP_LOAD, .throughput = 1, .latency = 2} -}; -static const risc86_instruction_t vector_wbinvd_op = -{ - .nr_uops = 1, - .decode_type = DECODE_VECTOR, - .uop[0] = {.type = UOP_ALU, .throughput = 10000, .latency = 10000} + .decode_type = DECODE_COMPLEX, + .uop[0] = {.type = UOP_ALU, .latency = 10000} }; + #define INVALID NULL static const risc86_instruction_t *opcode_timings[256] = @@ -862,38 +945,38 @@ static const risc86_instruction_t *opcode_timings[256] = /* ADD ADD ADD ADD*/ /*00*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* ADD ADD PUSH ES POP ES*/ - &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, + &alux_op, &alu_op, &push_seg_op, &complex_mov_seg_mem_op, /* OR OR OR OR*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* OR OR PUSH CS */ &alux_op, &alu_op, &push_seg_op, INVALID, /* ADC ADC ADC ADC*/ -/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/*10*/ &complex_alux_store_op,&complex_alu_store_op, &complex_load_alux_op,&complex_load_alu_op, /* ADC ADC PUSH SS POP SS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* SBB SBB SBB SBB*/ -/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/*10*/ &complex_alux_store_op,&complex_alu_store_op, &complex_load_alux_op,&complex_load_alu_op, /* SBB SBB PUSH DS POP DS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* AND AND AND AND*/ /*20*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* AND AND DAA*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* SUB SUB SUB SUB*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* SUB SUB DAS*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* XOR XOR XOR XOR*/ /*30*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, /* XOR XOR AAA*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* CMP CMP CMP CMP*/ &load_alux_op, &load_alu_op, &load_alux_op, &load_alu_op, /* CMP CMP AAS*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* INC EAX INC ECX INC EDX INC EBX*/ /*40*/ &alu_op, &alu_op, &alu_op, &alu_op, @@ -914,12 +997,12 @@ static const risc86_instruction_t *opcode_timings[256] = &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, /* PUSHA POPA BOUND ARPL*/ -/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, +/*60*/ &complex_pusha_op, &complex_popa_op, &complex_bound_op, &complex_arpl_op, INVALID, INVALID, INVALID, INVALID, /* PUSH imm IMUL PUSH imm IMUL*/ - &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, + &push_imm_op, &complex_mul_op, &push_imm_op, &complex_mul_op, /* INSB INSW OUTSB OUTSW*/ - &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + &complex_ins_op, &complex_ins_op, &complex_outs_op, &complex_outs_op, /* Jxx*/ /*70*/ &branch_op, &branch_op, &branch_op, &branch_op, @@ -929,29 +1012,29 @@ static const risc86_instruction_t *opcode_timings[256] = /*80*/ INVALID, INVALID, INVALID, INVALID, /* TEST TEST XCHG XCHG*/ - &vector_test_mem_b_op, &vector_test_mem_op, &vector_xchg_mem_op, &vector_xchg_mem_op, + &complex_test_mem_b_op, &complex_test_mem_op, &complex_xchg_mem_op, &complex_xchg_mem_op, /* MOV MOV MOV MOV*/ &store_op, &store_op, &load_op, &load_op, /* MOV from seg LEA MOV to seg POP*/ - &vector_mov_mem_seg_op, &store_op, &vector_mov_seg_mem_op, &pop_mem_op, + &complex_mov_mem_seg_op, &store_op, &complex_mov_seg_mem_op, &pop_mem_op, /* NOP XCHG XCHG XCHG*/ /*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, /* XCHG XCHG XCHG XCHG*/ &xchg_op, &xchg_op, &xchg_op, &xchg_op, /* CBW CWD CALL far WAIT*/ - &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, + &complex_alu1_op, &complex_alu1_op, &complex_call_far_op, &limm_op, /* PUSHF POPF SAHF LAHF*/ - &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + &complex_pushf_op, &complex_popf_op, &complex_alux1_op, &complex_alux1_op, /* MOV MOV MOV MOV*/ /*a0*/ &load_op, &load_op, &store_op, &store_op, /* MOVSB MOVSW CMPSB CMPSW*/ - &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, + &movs_op, &movs_op, &complex_cmpsb_op, &complex_cmps_op, /* TEST TEST STOSB STOSW*/ &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, /* LODSB LODSW SCASB SCASW*/ - &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + &lods_op, &lods_op, &complex_scasb_op, &complex_scas_op, /* MOV*/ /*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, @@ -960,37 +1043,37 @@ static const risc86_instruction_t *opcode_timings[256] = &limm_op, &limm_op, &limm_op, &limm_op, /* RET imm RET*/ -/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/*c0*/ INVALID, INVALID, &complex_ret_op, &complex_ret_op, /* LES LDS MOV MOV*/ - &vector_lss_op, &vector_lss_op, &store_op, &store_op, + &complex_lss_op, &complex_lss_op, &store_op, &store_op, /* ENTER LEAVE RETF RETF*/ - &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, + &complex_enter_op, &leave_op, &complex_retf_op, &complex_retf_op, /* INT3 INT INTO IRET*/ - &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + &complex_int_op, &complex_int_op, &complex_int_op, &complex_iret_op, /*d0*/ INVALID, INVALID, INVALID, INVALID, /* AAM AAD SETALC XLAT*/ - &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + &complex_alux6_op, &complex_alux3_op, &complex_alux1_op, &complex_xlat_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /* LOOPNE LOOPE LOOP JCXZ*/ -/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/*e0*/ &complex_loop_op, &complex_loop_op, &loop_op, &complex_loop_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* CALL JMP JMP JMP*/ - &store_op, &branch_op, &vector_jmp_far_op, &branch_op, + &store_op, &branch_op, &complex_jmp_far_op, &branch_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* REPNE REPE*/ /*f0*/ INVALID, INVALID, INVALID, INVALID, /* HLT CMC*/ - &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, + &complex_alux1_op, &complex_alu2_op, INVALID, INVALID, /* CLC STC CLI STI*/ - &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, + &complex_alu1_op, &complex_alu1_op, &complex_cli_sti_op, &complex_cli_sti_op, /* CLD STD INCDEC*/ - &vector_alu1_op, &vector_alu1_op, &alux_store_op, INVALID + &complex_alu1_op, &complex_alu1_op, &alux_store_op, INVALID }; static const risc86_instruction_t *opcode_timings_mod3[256] = @@ -998,38 +1081,38 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = /* ADD ADD ADD ADD*/ /*00*/ &alux_op, &alu_op, &alux_op, &alu_op, /* ADD ADD PUSH ES POP ES*/ - &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, + &alux_op, &alu_op, &push_seg_op, &complex_mov_seg_mem_op, /* OR OR OR OR*/ &alux_op, &alu_op, &alux_op, &alu_op, /* OR OR PUSH CS */ &alux_op, &alu_op, &push_seg_op, INVALID, /* ADC ADC ADC ADC*/ -/*10*/ &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, +/*10*/ &complex_alux1_op, &complex_alu1_op, &complex_alux1_op, &complex_alu1_op, /* ADC ADC PUSH SS POP SS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* SBB SBB SBB SBB*/ - &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, + &complex_alux1_op, &complex_alu1_op, &complex_alux1_op, &complex_alu1_op, /* SBB SBB PUSH DS POP DS*/ - &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + &complex_alux1_op, &complex_alu1_op, &push_seg_op, &complex_mov_seg_mem_op, /* AND AND AND AND*/ /*20*/ &alux_op, &alu_op, &alux_op, &alu_op, /* AND AND DAA*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* SUB SUB SUB SUB*/ &alux_op, &alu_op, &alux_op, &alu_op, /* SUB SUB DAS*/ - &alux_op, &alu_op, INVALID, &vector_alux1_op, + &alux_op, &alu_op, INVALID, &complex_alux1_op, /* XOR XOR XOR XOR*/ /*30*/ &alux_op, &alu_op, &alux_op, &alu_op, /* XOR XOR AAA*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* CMP CMP CMP CMP*/ &alux_op, &alu_op, &alux_op, &alu_op, /* CMP CMP AAS*/ - &alux_op, &alu_op, INVALID, &vector_alux6_op, + &alux_op, &alu_op, INVALID, &complex_alux6_op, /* INC EAX INC ECX INC EDX INC EBX*/ /*40*/ &alu_op, &alu_op, &alu_op, &alu_op, @@ -1050,12 +1133,12 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, /* PUSHA POPA BOUND ARPL*/ -/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, +/*60*/ &complex_pusha_op, &complex_popa_op, &complex_bound_op, &complex_arpl_op, INVALID, INVALID, INVALID, INVALID, /* PUSH imm IMUL PUSH imm IMUL*/ - &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, + &push_imm_op, &complex_mul_op, &push_imm_op, &complex_mul_op, /* INSB INSW OUTSB OUTSW*/ - &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + &complex_ins_op, &complex_ins_op, &complex_outs_op, &complex_outs_op, /* Jxx*/ /*70*/ &branch_op, &branch_op, &branch_op, &branch_op, @@ -1065,29 +1148,29 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = /*80*/ INVALID, INVALID, INVALID, INVALID, /* TEST TEST XCHG XCHG*/ - &vector_alu1_op, &vector_alu1_op, &vector_alu3_op, &vector_alu3_op, + &complex_alu1_op, &complex_alu1_op, &complex_alu3_op, &complex_alu3_op, /* MOV MOV MOV MOV*/ &store_op, &store_op, &load_op, &load_op, /* MOV from seg LEA MOV to seg POP*/ - &mov_reg_seg_op, &store_op, &vector_mov_seg_reg_op, &pop_reg_op, + &mov_reg_seg_op, &store_op, &complex_mov_seg_reg_op, &pop_reg_op, /* NOP XCHG XCHG XCHG*/ /*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, /* XCHG XCHG XCHG XCHG*/ &xchg_op, &xchg_op, &xchg_op, &xchg_op, /* CBW CWD CALL far WAIT*/ - &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, + &complex_alu1_op, &complex_alu1_op, &complex_call_far_op, &limm_op, /* PUSHF POPF SAHF LAHF*/ - &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + &complex_pushf_op, &complex_popf_op, &complex_alux1_op, &complex_alux1_op, /* MOV MOV MOV MOV*/ /*a0*/ &load_op, &load_op, &store_op, &store_op, /* MOVSB MOVSW CMPSB CMPSW*/ - &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, + &movs_op, &movs_op, &complex_cmpsb_op, &complex_cmps_op, /* TEST TEST STOSB STOSW*/ &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, /* LODSB LODSW SCASB SCASW*/ - &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + &lods_op, &lods_op, &complex_scasb_op, &complex_scas_op, /* MOV*/ /*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, @@ -1096,57 +1179,57 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = &limm_op, &limm_op, &limm_op, &limm_op, /* RET imm RET*/ -/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/*c0*/ INVALID, INVALID, &complex_ret_op, &complex_ret_op, /* LES LDS MOV MOV*/ - &vector_lss_op, &vector_lss_op, &store_op, &store_op, + &complex_lss_op, &complex_lss_op, &store_op, &store_op, /* ENTER LEAVE RETF RETF*/ - &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, + &complex_enter_op, &leave_op, &complex_retf_op, &complex_retf_op, /* INT3 INT INTO IRET*/ - &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + &complex_int_op, &complex_int_op, &complex_int_op, &complex_iret_op, /*d0*/ INVALID, INVALID, INVALID, INVALID, /* AAM AAD SETALC XLAT*/ - &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + &complex_alux6_op, &complex_alux3_op, &complex_alux1_op, &complex_xlat_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /* LOOPNE LOOPE LOOP JCXZ*/ -/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/*e0*/ &complex_loop_op, &complex_loop_op, &loop_op, &complex_loop_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* CALL JMP JMP JMP*/ - &store_op, &branch_op, &vector_jmp_far_op, &branch_op, + &store_op, &branch_op, &complex_jmp_far_op, &branch_op, /* IN AL IN AX OUT_AL OUT_AX*/ - &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + &complex_in_op, &complex_in_op, &complex_out_op, &complex_out_op, /* REPNE REPE*/ /*f0*/ INVALID, INVALID, INVALID, INVALID, /* HLT CMC*/ - &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, + &complex_alux1_op, &complex_alu2_op, INVALID, INVALID, /* CLC STC CLI STI*/ - &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, + &complex_alu1_op, &complex_alu1_op, &complex_cli_sti_op, &complex_cli_sti_op, /* CLD STD INCDEC*/ - &vector_alu1_op, &vector_alu1_op, &vector_alux1_op, INVALID + &complex_alu1_op, &complex_alu1_op, &complex_alux1_op, INVALID }; static const risc86_instruction_t *opcode_timings_0f[256] = { -/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, - &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, - INVALID, &load_op, &vector_femms_op, INVALID, +/*00*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + INVALID, &complex_alu6_op, &complex_alu6_op, INVALID, + &complex_invd_op, &complex_wbinvd_op, INVALID, INVALID, + INVALID, &load_op, &complex_femms_op, INVALID, /*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, -/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, +/*20*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, -/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, +/*30*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1167,7 +1250,7 @@ static const risc86_instruction_t *opcode_timings_0f[256] = INVALID, INVALID, &mload_op, &mload_op, /*70*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - &load_mmx_op, &load_mmx_op, &load_mmx_op, &vector_emms_op, + &load_mmx_op, &load_mmx_op, &load_mmx_op, &complex_emms_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, &mstore_op, &mstore_op, @@ -1176,122 +1259,122 @@ static const risc86_instruction_t *opcode_timings_0f[256] = &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, -/*90*/ &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, - &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, +/*90*/ &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, + &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, &complex_setcc_reg_op, -/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_load_alu_op, - &vector_alu_store_op, &vector_alu_store_op, INVALID, INVALID, - &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_load_alu_op, - &vector_alu_store_op, &vector_alu_store_op, INVALID, &vector_mul_op, +/*a0*/ &push_seg_op, &complex_mov_seg_mem_op,&complex_cpuid_op, &complex_load_alu_op, + &complex_alu_store_op, &complex_alu_store_op, INVALID, INVALID, + &push_seg_op, &complex_mov_seg_mem_op,INVALID, &complex_load_alu_op, + &complex_alu_store_op, &complex_alu_store_op, INVALID, &complex_mul_op, -/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_load_alu_op, - &vector_lss_op, &vector_lss_op, &load_alux_op, &load_alu_op, - INVALID, INVALID, &vector_load_alu_op, &vector_load_alu_op, - &vector_bsx_op, &vector_bsx_op, &load_alux_op, &load_alu_op, +/*b0*/ &complex_cmpxchg_b_op, &complex_cmpxchg_op, &complex_lss_op, &complex_load_alu_op, + &complex_lss_op, &complex_lss_op, &load_alux_op, &load_alu_op, + INVALID, INVALID, &complex_load_alu_op, &complex_load_alu_op, + &complex_bsx_op, &complex_bsx_op, &load_alux_op, &load_alu_op, -/*c0*/ &vector_alux_store_op, &vector_alu_store_op, INVALID, INVALID, - INVALID, INVALID, INVALID, &vector_cmpxchg_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, +/*c0*/ &complex_alux_store_op, &complex_alu_store_op, INVALID, INVALID, + INVALID, INVALID, INVALID, &complex_cmpxchg_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, -/*d0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - INVALID, &load_mmx_mul_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, +/*d0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &load_mmx_mul_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, -/*e0*/ &load_mmx_op, &load_mmx_shift_op, &load_mmx_shift_op, INVALID, - INVALID, &pmul_mem_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, - &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, +/*e0*/ &load_mmx_op, &load_mmx_shift_op, &load_mmx_shift_op, INVALID, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, -/*f0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, - INVALID, &pmul_mem_op, INVALID, INVALID, - &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, - &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, +/*f0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, }; static const risc86_instruction_t *opcode_timings_0f_mod3[256] = { -/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, - &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, - INVALID, INVALID, &vector_femms_op, INVALID, +/*00*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + INVALID, &complex_alu6_op, &complex_alu6_op, INVALID, + &complex_invd_op, &complex_wbinvd_op, INVALID, INVALID, + INVALID, INVALID, &complex_femms_op, INVALID, -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, - &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*20*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, + &complex_alu6_op, &complex_alu6_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*30*/ &complex_alu6_op, &complex_alu6_op, &complex_alu6_op, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, -/*60*/ &mmx_op, &mmx_op, &mmx_op, &mmx_op, - &mmx_op, &mmx_op, &mmx_op, &mmx_op, - &mmx_op, &mmx_op, &mmx_op, &mmx_op, - INVALID, INVALID, &mmx_op, &mmx_op, +/*60*/ &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + INVALID, INVALID, &mmx_op, &mmx_op, -/*70*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - &mmx_op, &mmx_op, &mmx_op, &vector_emms_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &mmx_op, &mmx_op, +/*70*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + &mmx_op, &mmx_op, &mmx_op, &complex_emms_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, &mmx_op, &mmx_op, /*80*/ &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, &branch_op, -/*90*/ &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, - &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, +/*90*/ &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, + &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, &complex_setcc_mem_op, -/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_alu1_op, - &vector_alu1_op, &vector_alu1_op, INVALID, INVALID, - &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_alu1_op, - &vector_alu1_op, &vector_alu1_op, INVALID, &vector_mul_op, +/*a0*/ &push_seg_op, &complex_mov_seg_mem_op, &complex_cpuid_op, &complex_alu1_op, + &complex_alu1_op, &complex_alu1_op, INVALID, INVALID, + &push_seg_op, &complex_mov_seg_mem_op, INVALID, &complex_alu1_op, + &complex_alu1_op, &complex_alu1_op, INVALID, &complex_mul_op, -/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_alu1_op, - &vector_lss_op, &vector_lss_op, &alux_op, &alu_op, - INVALID, INVALID, &vector_alu1_op, &vector_alu1_op, - &vector_bsx_op, &vector_bsx_op, &alux_op, &alu_op, +/*b0*/ &complex_cmpxchg_b_op, &complex_cmpxchg_op, &complex_lss_op, &complex_alu1_op, + &complex_lss_op, &complex_lss_op, &alux_op, &alu_op, + INVALID, INVALID, &complex_alu1_op, &complex_alu1_op, + &complex_bsx_op, &complex_bsx_op, &alux_op, &alu_op, -/*c0*/ &vector_alux1_op, &vector_alu1_op, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, - &bswap_op, &bswap_op, &bswap_op, &bswap_op, +/*c0*/ &complex_alux1_op, &complex_alu1_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, -/*d0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - INVALID, &mmx_mul_op, INVALID, INVALID, - &mmx_op, &mmx_op, INVALID, &mmx_op, - &mmx_op, &mmx_op, INVALID, &mmx_op, +/*d0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &mmx_mul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, -/*e0*/ &mmx_op, &mmx_shift_op, &mmx_shift_op, INVALID, - INVALID, &pmul_op, INVALID, INVALID, - &mmx_op, &mmx_op, INVALID, &mmx_op, - &mmx_op, &mmx_op, INVALID, &mmx_op, +/*e0*/ &mmx_op, &mmx_shift_op, &mmx_shift_op, INVALID, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, -/*f0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, - INVALID, &pmul_op, INVALID, INVALID, - &mmx_op, &mmx_op, &mmx_op, INVALID, - &mmx_op, &mmx_op, &mmx_op, INVALID, +/*f0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, }; static const risc86_instruction_t *opcode_timings_0f0f[256] = @@ -1463,100 +1546,100 @@ static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = static const risc86_instruction_t *opcode_timings_shift[8] = { - &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, - &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op + &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, + &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op }; static const risc86_instruction_t *opcode_timings_shift_b[8] = { - &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, - &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op + &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, + &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op, &complex_alux_store_op }; static const risc86_instruction_t *opcode_timings_shift_mod3[8] = { - &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, - &alu_op, &alu_op, &alu_op, &alu_op + &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, + &alu_op, &alu_op, &alu_op, &alu_op }; static const risc86_instruction_t *opcode_timings_shift_b_mod3[8] = { - &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, - &alux_op, &alux_op, &alux_op, &alux_op + &complex_alux1_op, &complex_alux1_op, &complex_alux1_op, &complex_alux1_op, + &alux_op, &alux_op, &alux_op, &alux_op }; static const risc86_instruction_t *opcode_timings_80[8] = { - &alux_store_op, &alux_store_op, &vector_alux_store_op, &vector_alux_store_op, - &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, + &alux_store_op, &alux_store_op, &complex_alux_store_op, &complex_alux_store_op, + &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, }; static const risc86_instruction_t *opcode_timings_80_mod3[8] = { - &alux_op, &alux_op, &alux_store_op, &alux_store_op, - &alux_op, &alux_op, &alux_op, &alux_op, + &alux_op, &alux_op, &alux_store_op, &alux_store_op, + &alux_op, &alux_op, &alux_op, &alux_op, }; static const risc86_instruction_t *opcode_timings_8x[8] = { - &alu_store_op, &alu_store_op, &vector_alu_store_op, &vector_alu_store_op, - &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, + &alu_store_op, &alu_store_op, &complex_alu_store_op, &complex_alu_store_op, + &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, }; static const risc86_instruction_t *opcode_timings_8x_mod3[8] = { - &alu_op, &alu_op, &alu_store_op, &alu_store_op, - &alu_op, &alu_op, &alu_op, &alu_op, + &alu_op, &alu_op, &alu_store_op, &alu_store_op, + &alu_op, &alu_op, &alu_op, &alu_op, }; static const risc86_instruction_t *opcode_timings_f6[8] = { /* TST NOT NEG*/ - &test_mem_imm_b_op, INVALID, &vector_alux_store_op, &vector_alux_store_op, + &test_mem_imm_b_op, INVALID, &complex_alux_store_op, &complex_alux_store_op, /* MUL IMUL DIV IDIV*/ - &vector_mul_mem_op, &vector_mul_mem_op, &vector_div16_mem_op, &vector_div16_mem_op, + &complex_mul_mem_op, &complex_mul_mem_op, &complex_div16_mem_op, &complex_div16_mem_op, }; static const risc86_instruction_t *opcode_timings_f6_mod3[8] = { /* TST NOT NEG*/ &test_reg_b_op, INVALID, &alux_op, &alux_op, /* MUL IMUL DIV IDIV*/ - &vector_mul_op, &vector_mul_op, &vector_div16_op, &vector_div16_op, + &complex_mul_op, &complex_mul_op, &complex_div16_op, &complex_div16_op, }; static const risc86_instruction_t *opcode_timings_f7[8] = { /* TST NOT NEG*/ - &test_mem_imm_op, INVALID, &vector_alu_store_op, &vector_alu_store_op, + &test_mem_imm_op, INVALID, &complex_alu_store_op, &complex_alu_store_op, /* MUL IMUL DIV IDIV*/ - &vector_mul64_mem_op, &vector_mul64_mem_op, &vector_div32_mem_op, &vector_div32_mem_op, + &complex_mul64_mem_op, &complex_mul64_mem_op, &complex_div32_mem_op, &complex_div32_mem_op, }; static const risc86_instruction_t *opcode_timings_f7_mod3[8] = { /* TST NOT NEG*/ &test_reg_op, INVALID, &alu_op, &alu_op, /* MUL IMUL DIV IDIV*/ - &vector_mul64_op, &vector_mul64_op, &vector_div32_op, &vector_div32_op, + &complex_mul64_op, &complex_mul64_op, &complex_div32_op, &complex_div32_op, }; static const risc86_instruction_t *opcode_timings_ff[8] = { /* INC DEC CALL CALL far*/ - &alu_store_op, &alu_store_op, &store_op, &vector_call_far_op, + &alu_store_op, &alu_store_op, &store_op, &complex_call_far_op, /* JMP JMP far PUSH*/ - &branch_op, &vector_jmp_far_op, &push_mem_op, INVALID + &branch_op, &complex_jmp_far_op, &push_mem_op, INVALID }; static const risc86_instruction_t *opcode_timings_ff_mod3[8] = { /* INC DEC CALL CALL far*/ - &vector_alu1_op, &vector_alu1_op, &store_op, &vector_call_far_op, + &complex_alu1_op, &complex_alu1_op, &store_op, &complex_call_far_op, /* JMP JMP far PUSH*/ - &branch_op, &vector_jmp_far_op, &vector_push_mem_op, INVALID + &branch_op, &complex_jmp_far_op, &complex_push_mem_op, INVALID }; static const risc86_instruction_t *opcode_timings_d8[8] = { /* FADDs FMULs FCOMs FCOMPs*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FSUBs FSUBRs FDIVs FDIVRs*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; static const risc86_instruction_t *opcode_timings_d8_mod3[8] = { /* FADD FMUL FCOM FCOMP*/ - &float_op, &float_op, &float_op, &float_op, + &fadd_op, &fmul_op, &float_op, &float_op, /* FSUB FSUBR FDIV FDIVR*/ &float_op, &float_op, &fdiv_op, &fdiv_op, }; @@ -1566,7 +1649,7 @@ static const risc86_instruction_t *opcode_timings_d9[8] = /* FLDs FSTs FSTPs*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FLDENV FLDCW FSTENV FSTCW*/ - &vector_float_l_op, &vector_fldcw_op, &vector_float_l_op, &vector_float_op + &complex_float_l_op, &complex_fldcw_op, &complex_float_l_op, &complex_float_op }; static const risc86_instruction_t *opcode_timings_d9_mod3[64] = { @@ -1574,16 +1657,16 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, &float_op, /*FXCH*/ - &float_op, &float_op, &float_op, &float_op, - &float_op, &float_op, &float_op, &float_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, /*FNOP*/ &float_op, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, /*FSTP*/ - &float_op, &float_op, &float_op, &float_op, - &float_op, &float_op, &float_op, &float_op, + &float2_op, &float2_op, &float2_op, &float2_op, + &float2_op, &float2_op, &float2_op, &float2_op, /* opFCHS opFABS*/ - &float_op, &float_op, INVALID, INVALID, + &fchs_op, &float_op, INVALID, INVALID, /* opFTST opFXAM*/ &float_op, &float_op, INVALID, INVALID, /* opFLD1 opFLDL2T opFLDL2E opFLDPI*/ @@ -1603,7 +1686,7 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = static const risc86_instruction_t *opcode_timings_da[8] = { /* FIADDl FIMULl FICOMl FICOMPl*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FISUBl FISUBRl FIDIVl FIDIVRl*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; @@ -1619,7 +1702,7 @@ static const risc86_instruction_t *opcode_timings_db[8] = /* FLDil FSTil FSTPil*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FLDe FSTPe*/ - INVALID, &vector_flde_op, INVALID, &vector_fste_op + INVALID, &complex_flde_op, INVALID, &complex_fste_op }; static const risc86_instruction_t *opcode_timings_db_mod3[64] = { @@ -1653,14 +1736,14 @@ static const risc86_instruction_t *opcode_timings_db_mod3[64] = static const risc86_instruction_t *opcode_timings_dc[8] = { /* FADDd FMULd FCOMd FCOMPd*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, /* FSUBd FSUBRd FDIVd FDIVRd*/ &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, }; static const risc86_instruction_t *opcode_timings_dc_mod3[8] = { /* opFADDr opFMULr*/ - &float_op, &float_op, INVALID, INVALID, + &fadd_op, &fmul_op, INVALID, INVALID, /* opFSUBRr opFSUBr opFDIVRr opFDIVr*/ &float_op, &float_op, &fdiv_op, &fdiv_op }; @@ -1670,7 +1753,7 @@ static const risc86_instruction_t *opcode_timings_dd[8] = /* FLDd FSTd FSTPd*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FRSTOR FSAVE FSTSW*/ - &vector_float_l_op, INVALID, &vector_float_l_op, &vector_float_l_op + &complex_float_l_op, INVALID, &complex_float_l_op, &complex_float_l_op }; static const risc86_instruction_t *opcode_timings_dd_mod3[8] = { @@ -1683,14 +1766,14 @@ static const risc86_instruction_t *opcode_timings_dd_mod3[8] = static const risc86_instruction_t *opcode_timings_de[8] = { /* FIADDw FIMULw FICOMw FICOMPw*/ - &load_float_op, &load_float_op, &load_float_op, &load_float_op, + &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, /* FISUBw FISUBRw FIDIVw FIDIVRw*/ - &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, }; static const risc86_instruction_t *opcode_timings_de_mod3[8] = { /* FADDP FMULP FCOMPP*/ - &float_op, &float_op, INVALID, &float_op, + &fadd_op, &fmul_op, INVALID, &float_op, /* FSUBP FSUBRP FDIVP FDIVRP*/ &float_op, &float_op, &fdiv_op, &fdiv_op, }; @@ -1700,7 +1783,7 @@ static const risc86_instruction_t *opcode_timings_df[8] = /* FILDiw FISTiw FISTPiw*/ &load_float_op, INVALID, &fstore_op, &fstore_op, /* FILDiq FBSTP FISTPiq*/ - INVALID, &load_float_op, &vector_float_l_op, &fstore_op, + INVALID, &load_float_op, &complex_float_l_op, &fstore_op, }; static const risc86_instruction_t *opcode_timings_df_mod3[8] = { @@ -1728,34 +1811,27 @@ static p6_unit_t *units; /*Pentium Pro has no MMX*/ static p6_unit_t ppro_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX)}, /*Integer X*/ - {.uop_mask = (1 << UOP_ALU)}, /*Integer Y*/ - {.uop_mask = (1 << UOP_FLOAT)}, /*Floating point*/ - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Load*/ - {.uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE)}, /*Store*/ - {.uop_mask = (1 << UOP_BRANCH)} /*Branch*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_FLOAT)}, /*Integer X & Floating point*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Integer Y*/ + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Load*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Data Store*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Address Store*/ }; #define NR_PPRO_UNITS (sizeof(ppro_units) / sizeof(p6_unit_t)) -/*Well, it works I guess*/ +/*Pentium II/Celeron assigns the multiplier to port 0, the shifter to port 1, and shares the MMX ALU*/ static p6_unit_t p2_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_MEU) | /*Integer X*/ - (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL)}, - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_MEU) | /*Integer Y*/ - (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL)}, - {.uop_mask = (1 << UOP_FLOAT)}, /*Floating point*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_FLOAT) | /*Integer X & Floating point*/ + (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Integer Y*/ + (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Load*/ - {.uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE)}, /*Store*/ - {.uop_mask = (1 << UOP_BRANCH)} /*Branch*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Data Store*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Address Store*/ }; #define NR_P2_UNITS (sizeof(p2_units) / sizeof(p6_unit_t)) -/*First available cycles of shared execution units. Each of these can be submitted - to by ALU X and Y*/ -static int mul_first_available_cycle; -static int shift_first_available_cycle; - static int uop_run(const risc86_uop_t *uop, int decode_time) { int c; @@ -1764,16 +1840,8 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) /*UOP_LIMM does not require execution*/ if (uop->type == UOP_LIMM) - return decode_time; + return decode_time; - if (units == p2_units) /*More hackyness*/ - { - if (uop->type == UOP_MEU_MUL && decode_time < mul_first_available_cycle) - decode_time = mul_first_available_cycle; - else if (uop->type == UOP_MEU_SHIFT && decode_time < mul_first_available_cycle) - decode_time = shift_first_available_cycle; - } - /*Find execution unit for this uOP*/ for (c = 0; c < nr_units; c++) { @@ -1787,43 +1855,36 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) } } if (!best_unit) - fatal("uop_run: can not find execution unit\n"); + fatal("uop_run: can not find execution unit\n"); if (best_start_cycle < decode_time) best_start_cycle = decode_time; - best_unit->first_available_cycle = best_start_cycle + uop->throughput; + best_unit->first_available_cycle = best_start_cycle + uop->latency; - if (units == p2_units) /*More hackyness*/ - { - if (uop->type == UOP_MEU_MUL) - mul_first_available_cycle = best_start_cycle + uop->throughput; - else if (uop->type == UOP_MEU_SHIFT) - shift_first_available_cycle = best_start_cycle + uop->throughput; - } - return best_start_cycle + uop->throughput; + + return best_start_cycle + uop->latency; } -/*The K6 decoder can decode, per clock : - - 1 or 2 'short' instructions, each up to 2 uOPs and 7 bytes long - - 1 'long' instruction, up to 4 uOPs - - 1 'vector' instruction, up to 4 uOPs per cycle, plus (I think) 1 cycle startup delay) +/*The P6 decoders can decode, per clock : + - 1 to 3 'simple' instructions, each up to 1 uOP and 7 bytes long + - 1 'complex' instruction, up to 4 uOPs or 3 per cycle for instructions longer than 4 uOPs */ static struct { int nr_uops; - const risc86_uop_t *uops[4]; + const risc86_uop_t *uops[6]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[4]; + int earliest_start[6]; } decode_buffer; -#define NR_OPQUADS 6 -/*Timestamps of when the last six opquads completed. The K6 scheduler retires - opquads in order, so this is needed to determine when the next can be scheduled*/ -static int opquad_completion_timestamp[NR_OPQUADS]; -static int next_opquad = 0; +#define NR_OPSEQS 3 +/*Timestamps of when the last three op sequences completed. Technically this is incorrect, +as the actual size of the opseq buffer is 20 bytes and not 18, but I'm restricted to multiples of 6*/ +static int opseq_completion_timestamp[NR_OPSEQS]; +static int next_opseq = 0; #define NR_REGS 8 /*Timestamp of when last operation on an integer register completed*/ @@ -1838,50 +1899,48 @@ void decode_flush_p6() { int c; int uop_timestamp = 0; - - /*Decoded opquad can not be submitted if there are no free spaces in the - opquad buffer*/ - if (decode_timestamp < opquad_completion_timestamp[next_opquad]) - decode_timestamp = opquad_completion_timestamp[next_opquad]; + + /*Decoded opseq can not be submitted if there are no free spaces in the + opseq buffer*/ + if (decode_timestamp < opseq_completion_timestamp[next_opseq]) + decode_timestamp = opseq_completion_timestamp[next_opseq]; /*Ensure that uops can not be submitted before they have been decoded*/ if (decode_timestamp > last_uop_timestamp) last_uop_timestamp = decode_timestamp; /*Submit uops to execution units, and determine the latest completion time*/ - for (c = 0; c < decode_buffer.nr_uops; c++) + for (c = 0; c < (decode_buffer.nr_uops); c++) { int start_timestamp; - if (decode_buffer.earliest_start[c] == -1) - start_timestamp = last_uop_timestamp; - else - start_timestamp = decode_buffer.earliest_start[c]; + + start_timestamp = decode_buffer.earliest_start[c]; last_uop_timestamp = uop_run(decode_buffer.uops[c], start_timestamp); if (last_uop_timestamp > uop_timestamp) uop_timestamp = last_uop_timestamp; } - /*Calculate opquad completion time. Since opquads complete in order, it + /*Calculate opseq completion time. Since opseqs complete in order, it must be after the last completion.*/ if (uop_timestamp <= last_complete_timestamp) last_complete_timestamp = last_complete_timestamp + 1; else last_complete_timestamp = uop_timestamp; - /*Advance to next opquad in buffer*/ - opquad_completion_timestamp[next_opquad] = last_complete_timestamp; - next_opquad++; - if (next_opquad == NR_OPQUADS) - next_opquad = 0; + /*Advance to next opseq in buffer*/ + opseq_completion_timestamp[next_opseq] = last_complete_timestamp; + next_opseq++; + if (next_opseq == NR_OPSEQS) + next_opseq = 0; decode_timestamp++; decode_buffer.nr_uops = 0; } /*The instruction is only of interest here if it's longer than 7 bytes, as that's the - limit on K6 short decoding*/ + limit on P6 simple decoding*/ static int codegen_timing_instr_length(uint64_t deps, uint32_t fetchdat, int op_32) { int len = prefixes + 1; /*Opcode*/ @@ -1933,8 +1992,9 @@ static int codegen_timing_instr_length(uint64_t deps, uint32_t fetchdat, int op_ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetchdat, int op_32, int bit8) { uint32_t regmask_required; - uint32_t regmask_modified; - int c, d; + uint32_t regmask_modified; + int c; + int d = 0; /*Complex decoder uOPs*/ int earliest_start = 0; decode_type_t decode_type = ins->decode_type; int instr_length = codegen_timing_instr_length(deps, fetchdat, op_32); @@ -1964,87 +2024,68 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u earliest_start = fpu_st_timestamp[reg]; } - /*Short decoders are limited to 7 bytes*/ - if (decode_type == DECODE_SHORT && instr_length > 7) - decode_type = DECODE_LONG; - /*Long decoder is limited to 11 bytes*/ - else if (instr_length > 11) - decode_type = DECODE_VECTOR; + /*Simple decoders are limited to 7 bytes & 1 uOP*/ + if (decode_type == DECODE_SIMPLE && instr_length > 7) + decode_type = DECODE_COMPLEX; + else if (decode_type == DECODE_SIMPLE && ins->nr_uops > 1) + decode_type = DECODE_COMPLEX; switch (decode_type) - { - case DECODE_SHORT: - if (decode_buffer.nr_uops) + { + case DECODE_SIMPLE: + if (decode_buffer.nr_uops - d == 2) + { + decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; + decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; + decode_buffer.nr_uops = 3; + decode_flush_p6(); + } + else if (decode_buffer.nr_uops - d == 1) + { + decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; + decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; + decode_buffer.nr_uops = 2+d; + if (d) + decode_flush_p6(); + } + else if (decode_buffer.nr_uops) { decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; - if (ins->nr_uops > 1) - { - decode_buffer.uops[decode_buffer.nr_uops+1] = &ins->uop[1]; - decode_buffer.earliest_start[decode_buffer.nr_uops+1] = -1; - } - decode_buffer.nr_uops += ins->nr_uops; - - decode_flush_p6(); + decode_buffer.nr_uops = 1+d; } else { - decode_buffer.nr_uops = ins->nr_uops; + decode_buffer.nr_uops = 1; decode_buffer.uops[0] = &ins->uop[0]; decode_buffer.earliest_start[0] = earliest_start; - if (ins->nr_uops > 1) - { - decode_buffer.uops[1] = &ins->uop[1]; - decode_buffer.earliest_start[1] = -1; - } - } + } break; - case DECODE_LONG: + case DECODE_COMPLEX: if (decode_buffer.nr_uops) - decode_flush_p6(); + decode_flush_p6(); /*The 4-1-1 arrangement implies that a complex ins. can't be decoded after a simple one*/ - decode_buffer.nr_uops = ins->nr_uops; - for (c = 0; c < ins->nr_uops; c++) - { - decode_buffer.uops[c] = &ins->uop[c]; - if (c == 0) - decode_buffer.earliest_start[c] = earliest_start; - else - decode_buffer.earliest_start[c] = -1; - } - decode_flush_p6(); - break; - - case DECODE_VECTOR: - if (decode_buffer.nr_uops) - decode_flush_p6(); - - decode_timestamp++; d = 0; - + for (c = 0; c < ins->nr_uops; c++) { decode_buffer.uops[d] = &ins->uop[c]; - if (c == 0) - decode_buffer.earliest_start[d] = earliest_start; - else - decode_buffer.earliest_start[d] = -1; - d++; + decode_buffer.earliest_start[c] = earliest_start; + d++; - if (d == 4) + if (d == 3 && ins->nr_uops > 4) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { d = 0; - decode_buffer.nr_uops = 4; - decode_flush_p6(); + decode_buffer.nr_uops = 3; + decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - decode_flush_p6(); - } - break; + if (d) + { + decode_buffer.nr_uops = d; + } + break; } /*Update write timestamps for any output registers*/ @@ -2095,15 +2136,12 @@ void codegen_timing_p6_block_start() for (c = 0; c < nr_units; c++) units[c].first_available_cycle = 0; - mul_first_available_cycle = 0; - shift_first_available_cycle = 0; - decode_timestamp = 0; last_complete_timestamp = 0; - for (c = 0; c < NR_OPQUADS; c++) - opquad_completion_timestamp[c] = 0; - next_opquad = 0; + for (c = 0; c < NR_OPSEQS; c++) + opseq_completion_timestamp[c] = 0; + next_opseq = 0; for (c = 0; c < NR_REGS; c++) reg_available_timestamp[c] = 0; @@ -2295,7 +2333,7 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint if (ins_table[opcode]) decode_instruction(ins_table[opcode], deps[opcode], fetchdat, op_32, bit8); else - decode_instruction(&vector_alu1_op, 0, fetchdat, op_32, bit8); + decode_instruction(&complex_alu1_op, 0, fetchdat, op_32, bit8); codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp); } @@ -2324,4 +2362,4 @@ codegen_timing_t codegen_timing_p6 = codegen_timing_p6_block_start, codegen_timing_p6_block_end, codegen_timing_p6_jump_cycles -}; +}; \ No newline at end of file From 73b51bf5731257e16638b8a8447ded6e82183d2f Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Sat, 25 Apr 2020 18:59:37 +0300 Subject: [PATCH 38/43] Dev branch all machines with missing SIO chips + added the VS440FX This board returns D4 POST with no output. Needs further examination. Meant for the future PC87307 implementation. Also all boards that miss their SIO chips got Dev Branched just in case 2.10 gets released while some miss their SIO. --- src/machine/m_at_slot1.c | 6 +++++- src/machine/m_at_socket7_s7.c | 11 +++++++---- src/machine/m_at_socket8.c | 34 +++++++++++++++++++++++++++++++++- src/machine/machine_table.c | 13 ++++++++++++- src/win/Makefile.mingw | 10 ++++++++++ src/win/Makefile_ndr.mingw | 10 ++++++++++ 6 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 800768ce8..46ebe4727 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -33,12 +33,14 @@ #include <86box/intel_sio.h> #include <86box/piix.h> #include <86box/sio.h> +#include <86box/intel_sio.h> #include <86box/sst_flash.h> #include <86box/hwm.h> #include <86box/spd.h> #include <86box/video.h> #include "cpu.h" #include <86box/machine.h> + int machine_at_p6kfx_init(const machine_t *model) { @@ -69,6 +71,7 @@ machine_at_p6kfx_init(const machine_t *model) return ret; } +#if defined(DEV_BRANCH) && defined(NO_SIO) int machine_at_6bxc_init(const machine_t *model) { @@ -93,12 +96,13 @@ machine_at_6bxc_init(const machine_t *model) device_add(&i440bx_device); device_add(&piix4e_device); device_add(&keyboard_ps2_pci_device); - device_add(&um8669f_device); /*Placeholder for ITE 8671*/ + device_add(&um8669f_device); /*ITE 8671*/ device_add(&sst_flash_39sf020_device); spd_register(SPD_TYPE_SDRAM, 0xF, 256); return ret; } +#endif int machine_at_p2bls_init(const machine_t *model) diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 4eb1f963b..3892109b9 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -549,6 +549,7 @@ machine_at_pb680_init(const machine_t *model) return ret; } +#if defined(DEV_BRANCH) && defined(NO_SIO) int machine_at_p55xb2_init(const machine_t *model) { @@ -577,7 +578,7 @@ machine_at_p55xb2_init(const machine_t *model) return ret; } - +#endif int machine_at_tx97_init(const machine_t *model) @@ -702,7 +703,7 @@ machine_at_ym430tx_init(const machine_t *model) return ret; } - +#if defined(DEV_BRANCH) && defined(NO_SIO) int machine_at_586t2_init(const machine_t *model) { @@ -796,7 +797,7 @@ machine_at_807ds_init(const machine_t *model) return ret; } - +#endif int machine_at_p5mms98_init(const machine_t *model) @@ -862,6 +863,7 @@ machine_at_p5mms98_init(const machine_t *model) return ret; } +#if defined(DEV_BRANCH) && defined(NO_SIO) int machine_at_tx100_init(const machine_t *model) { @@ -919,4 +921,5 @@ machine_at_advanceii_init(const machine_t *model) spd_register(SPD_TYPE_SDRAM, 0xF, 64); return ret; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 14b72dcc7..30c9f5c0a 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -156,4 +156,36 @@ machine_at_m6mi_init(const machine_t *model) device_add(&intel_flash_bxt_device); return ret; -} \ No newline at end of file +} + +#if defined(DEV_BRANCH) && defined(NO_SIO) +int +machine_at_vs440fx_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined2(L"roms/machines/vs440fx/1011CS1_.BIO", + L"roms/machines/vs440fx/1011CS1_.BI1", + L"roms/machines/vs440fx/1011CS1_.BI2", + L"roms/machines/vs440fx/1011CS1_.BI3", + L"roms/machines/vs440fx/1011CS1_.RCV", + 0x3a000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&i440fx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + //device_add(&pc87307_device); + device_add(&pc87306_device); + device_add(&intel_flash_bxt_ami_device); + + return ret; +} +#endif \ No newline at end of file diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 8cc0dbfaf..fc2eeab91 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -254,18 +254,24 @@ const machine_t machines[] = { /* 430TX */ { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, +#if defined(DEV_BRANCH) && defined(NO_SIO) { "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL }, +#endif { "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL }, +#if defined(DEV_BRANCH) && defined(NO_SIO) { "[Socket 7 TX] Iwill P55XB2", "p55xb2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p55xb2_init, NULL }, { "[Socket 7 TX] PC Partner TXA807DS", "807ds", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_807ds_init, NULL }, +#endif { "[Socket 7 TX] SuperMicro P5MMS98", "p5mms98", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p5mms98_init, NULL }, +#if defined(DEV_BRANCH) && defined(NO_SIO) /* Apollo VPX */ { "[Socket 7 VPX] Zida Tomato TX100", "tx100", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_tx100_init, NULL }, /* Apollo VP3 */ { "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL }, - +#endif + /* Super Socket 7 machines */ /* Apollo MVP3 */ { "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL }, @@ -277,6 +283,9 @@ const machine_t machines[] = { { "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL }, { "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL }, { "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL }, +#if defined(DEV_BRANCH) && defined(NO_SIO) + { "[Socket 8 FX] Intel Venus", "vs440fx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_vs440fx_init, NULL }, +#endif /* Slot 1 machines */ /* 440FX */ @@ -285,7 +294,9 @@ const machine_t machines[] = { /* 440LX */ /* 440BX */ +#if defined(DEV_BRANCH) && defined(NO_SIO) { "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL }, +#endif { "[Slot 1 BX] ASUS P2B-LS", "p2bls", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p2bls_init, NULL }, { "[Slot 1 BX] ASUS P3B-F", "p3bf", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p3bf_init, NULL }, { "[Slot 1 BX] ABit BF6", "bf6", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_bf6_init, NULL }, diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index f8044ddd5..4103f35c0 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -92,6 +92,9 @@ ifeq ($(DEV_BUILD), y) ifndef XL24 XL24 := y endif + ifndef NO_SIO + NO_SIO := y + endif else ifndef DEBUG DEBUG := n @@ -150,6 +153,9 @@ else ifndef XL24 XL24 := n endif + ifndef NO_SIO + NO_SIO := n + endif endif # Defaults for several build options (possibly defined in a chained file.) @@ -484,6 +490,10 @@ ifeq ($(XL24), y) OPTS += -DUSE_XL24 endif +ifeq ($(NO_SIO), y) +OPTS += -DNO_SIO +endif + endif diff --git a/src/win/Makefile_ndr.mingw b/src/win/Makefile_ndr.mingw index 1a15963e6..b1ec42759 100644 --- a/src/win/Makefile_ndr.mingw +++ b/src/win/Makefile_ndr.mingw @@ -92,6 +92,9 @@ ifeq ($(DEV_BUILD), y) ifndef XL24 XL24 := y endif + ifndef NO_SIO + NO_SIO := y + endif else ifndef DEBUG DEBUG := n @@ -153,6 +156,9 @@ else ifndef XL24 XL24 := n endif + ifndef NO_SIO + NO_SIO := n + endif endif # Defaults for several build options (possibly defined in a chained file.) @@ -493,6 +499,10 @@ ifeq ($(XL24), y) OPTS += -DUSE_XL24 endif +ifeq ($(NO_SIO), y) +OPTS += -DNO_SIO +endif + endif From d8f9a5528601716914cb84d4d244dfe8a5adb50b Mon Sep 17 00:00:00 2001 From: daviunic Date: Sat, 25 Apr 2020 18:12:30 +0200 Subject: [PATCH 39/43] Renamed logi bus mouse to logi/ms for clarity --- src/mouse_bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mouse_bus.c b/src/mouse_bus.c index e2146a5af..c2b4afad7 100644 --- a/src/mouse_bus.c +++ b/src/mouse_bus.c @@ -832,7 +832,7 @@ static const device_config_t ms_config[] = { const device_t mouse_logibus_device = { - "Logitech Bus Mouse", + "Logitech/Microsoft Bus Mouse", DEVICE_ISA, MOUSE_TYPE_LOGIBUS, bm_init, bm_close, NULL, From 6033f4480cc1641784e179213cae4890e322372f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 25 Apr 2020 22:02:48 +0200 Subject: [PATCH 40/43] Fixed P6 timings so they no longer fatal (and removed the 3DNow! stuff from them), and also fixed the Distributed DMA bug reported by TheCollector1995. --- src/cpu/codegen_timing_p6.c | 243 ++------------------------------ src/cpu_new/codegen_timing_p6.c | 243 ++------------------------------ src/ddma.c | 4 +- 3 files changed, 24 insertions(+), 466 deletions(-) diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index a0da30304..db0c965e1 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -1380,173 +1380,6 @@ static const risc86_instruction_t *opcode_timings_0f_mod3[256] = &mmx_op, &mmx_op, &mmx_op, INVALID, }; -static const risc86_instruction_t *opcode_timings_0f0f[256] = -{ -/*00*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*20*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*30*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*60*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*70*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*80*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*90*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*a0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*b0*/ INVALID, INVALID, INVALID, INVALID, - &load_mmx_mul_op, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, &load_mmx_op, - -/*c0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*d0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*e0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*f0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -}; -static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = -{ -/*00*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*20*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*30*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*60*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*70*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*80*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*90*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*a0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &mmx_mul_op, &mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*b0*/ INVALID, INVALID, INVALID, INVALID, - &mmx_mul_op, INVALID, &mmx_mul_op, &mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, &mmx_op, - -/*c0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*d0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*e0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*f0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -}; - static const risc86_instruction_t *opcode_timings_shift[8] = { &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, @@ -1876,11 +1709,11 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) static struct { int nr_uops; - const risc86_uop_t *uops[6]; + const risc86_uop_t *uops[MAX_UOPS]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[6]; + int earliest_start[MAX_UOPS]; } decode_buffer; #define NR_OPSEQS 3 @@ -1901,7 +1734,7 @@ static int last_uop_timestamp = 0; void decode_flush_p6() { int c; - int uop_timestamp = 0; + int start_timestamp, uop_timestamp = 0; /*Decoded opseq can not be submitted if there are no free spaces in the opseq buffer*/ @@ -1915,9 +1748,6 @@ void decode_flush_p6() /*Submit uops to execution units, and determine the latest completion time*/ for (c = 0; c < (decode_buffer.nr_uops); c++) { - int start_timestamp; - - start_timestamp = decode_buffer.earliest_start[c]; last_uop_timestamp = uop_run(decode_buffer.uops[c], start_timestamp); @@ -2037,7 +1867,7 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u { case DECODE_SIMPLE: if (decode_buffer.nr_uops - d == 2) - { + { decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; decode_buffer.nr_uops = 3; @@ -2084,10 +1914,10 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - } + if (d) + { + decode_buffer.nr_uops = d; + } break; } @@ -2188,59 +2018,8 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint switch (last_prefix) { case 0x0f: - if (opcode == 0x0f) - { - /*3DNow has the actual opcode after ModR/M, SIB and any offset*/ - uint32_t opcode_pc = op_pc + 1; /*Byte after ModR/M*/ - uint8_t modrm = fetchdat & 0xff; - uint8_t sib = (fetchdat >> 8) & 0xff; - - if ((modrm & 0xc0) != 0xc0) - { - if (op_32 & 0x200) - { - if ((modrm & 7) == 4) - { - /* Has SIB*/ - opcode_pc++; - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 4; - else if ((sib & 0x07) == 0x05) - opcode_pc += 4; - } - else - { - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 4; - else if ((modrm & 0xc7) == 0x05) - opcode_pc += 4; - } - } - else - { - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 2; - else if ((modrm & 0xc7) == 0x06) - opcode_pc += 2; - } - } - - opcode = fastreadb(cs + opcode_pc); - - ins_table = mod3 ? opcode_timings_0f0f_mod3 : opcode_timings_0f0f; - deps = mod3 ? opcode_deps_0f0f_mod3 : opcode_deps_0f0f; - } - else - { - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; - deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; - } + ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: @@ -2365,4 +2144,4 @@ codegen_timing_t codegen_timing_p6 = codegen_timing_p6_block_start, codegen_timing_p6_block_end, codegen_timing_p6_jump_cycles -}; \ No newline at end of file +}; diff --git a/src/cpu_new/codegen_timing_p6.c b/src/cpu_new/codegen_timing_p6.c index 845f46803..d002631bc 100644 --- a/src/cpu_new/codegen_timing_p6.c +++ b/src/cpu_new/codegen_timing_p6.c @@ -1377,173 +1377,6 @@ static const risc86_instruction_t *opcode_timings_0f_mod3[256] = &mmx_op, &mmx_op, &mmx_op, INVALID, }; -static const risc86_instruction_t *opcode_timings_0f0f[256] = -{ -/*00*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*20*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*30*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*60*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*70*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*80*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*90*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*a0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*b0*/ INVALID, INVALID, INVALID, INVALID, - &load_mmx_mul_op, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, &load_mmx_op, - -/*c0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*d0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*e0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*f0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -}; -static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = -{ -/*00*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*10*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*20*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*30*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*40*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*50*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*60*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*70*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*80*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*90*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*a0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, &mmx_mul_op, &mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*b0*/ INVALID, INVALID, INVALID, INVALID, - &mmx_mul_op, INVALID, &mmx_mul_op, &mmx_mul_op, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, &mmx_op, - -/*c0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*d0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*e0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -/*f0*/ INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - INVALID, INVALID, INVALID, INVALID, - -}; - static const risc86_instruction_t *opcode_timings_shift[8] = { &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, &complex_alu_store_op, @@ -1873,11 +1706,11 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) static struct { int nr_uops; - const risc86_uop_t *uops[6]; + const risc86_uop_t *uops[MAX_UOPS]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[6]; + int earliest_start[MAX_UOPS]; } decode_buffer; #define NR_OPSEQS 3 @@ -1898,7 +1731,7 @@ static int last_uop_timestamp = 0; void decode_flush_p6() { int c; - int uop_timestamp = 0; + int start_timestamp, uop_timestamp = 0; /*Decoded opseq can not be submitted if there are no free spaces in the opseq buffer*/ @@ -1912,9 +1745,6 @@ void decode_flush_p6() /*Submit uops to execution units, and determine the latest completion time*/ for (c = 0; c < (decode_buffer.nr_uops); c++) { - int start_timestamp; - - start_timestamp = decode_buffer.earliest_start[c]; last_uop_timestamp = uop_run(decode_buffer.uops[c], start_timestamp); @@ -2034,7 +1864,7 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u { case DECODE_SIMPLE: if (decode_buffer.nr_uops - d == 2) - { + { decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; decode_buffer.nr_uops = 3; @@ -2081,10 +1911,10 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - } + if (d) + { + decode_buffer.nr_uops = d; + } break; } @@ -2185,59 +2015,8 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint switch (last_prefix) { case 0x0f: - if (opcode == 0x0f) - { - /*3DNow has the actual opcode after ModR/M, SIB and any offset*/ - uint32_t opcode_pc = op_pc + 1; /*Byte after ModR/M*/ - uint8_t modrm = fetchdat & 0xff; - uint8_t sib = (fetchdat >> 8) & 0xff; - - if ((modrm & 0xc0) != 0xc0) - { - if (op_32 & 0x200) - { - if ((modrm & 7) == 4) - { - /* Has SIB*/ - opcode_pc++; - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 4; - else if ((sib & 0x07) == 0x05) - opcode_pc += 4; - } - else - { - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 4; - else if ((modrm & 0xc7) == 0x05) - opcode_pc += 4; - } - } - else - { - if ((modrm & 0xc0) == 0x40) - opcode_pc++; - else if ((modrm & 0xc0) == 0x80) - opcode_pc += 2; - else if ((modrm & 0xc7) == 0x06) - opcode_pc += 2; - } - } - - opcode = fastreadb(cs + opcode_pc); - - ins_table = mod3 ? opcode_timings_0f0f_mod3 : opcode_timings_0f0f; - deps = mod3 ? opcode_deps_0f0f_mod3 : opcode_deps_0f0f; - } - else - { - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; - deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; - } + ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: @@ -2362,4 +2141,4 @@ codegen_timing_t codegen_timing_p6 = codegen_timing_p6_block_start, codegen_timing_p6_block_end, codegen_timing_p6_jump_cycles -}; \ No newline at end of file +}; diff --git a/src/ddma.c b/src/ddma.c index 98e4da293..92ee1f4d3 100644 --- a/src/ddma.c +++ b/src/ddma.c @@ -107,9 +107,9 @@ ddma_reg_write(uint16_t addr, uint8_t val, void *p) break; case 0x02: if (ch >= 4) - outb(0x88 + page_regs[ch], val); + outb(0x88 + page_regs[ch & 3], val); else - outb(0x80 + page_regs[ch], val); + outb(0x80 + page_regs[ch & 3], val); break; case 0x04: dma[ch].cb = (dma[ch].cb & 0xffff00) | val; From 20cf306d44dbc15d70f6fab1f1ca5fe94b91d5d7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 25 Apr 2020 22:14:43 +0200 Subject: [PATCH 41/43] Better fix for the P6 timings. --- src/cpu/codegen_timing_p6.c | 8 ++++---- src/cpu_new/codegen_timing_p6.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index db0c965e1..ec5c54640 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -1709,11 +1709,11 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) static struct { int nr_uops; - const risc86_uop_t *uops[MAX_UOPS]; + const risc86_uop_t *uops[6]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[MAX_UOPS]; + int earliest_start[6]; } decode_buffer; #define NR_OPSEQS 3 @@ -1904,10 +1904,10 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u for (c = 0; c < ins->nr_uops; c++) { decode_buffer.uops[d] = &ins->uop[c]; - decode_buffer.earliest_start[c] = earliest_start; + decode_buffer.earliest_start[d] = earliest_start; d++; - if (d == 3 && ins->nr_uops > 4) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ + if ((d == 3) && (ins->nr_uops > 4)) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { d = 0; decode_buffer.nr_uops = 3; diff --git a/src/cpu_new/codegen_timing_p6.c b/src/cpu_new/codegen_timing_p6.c index d002631bc..a51b4df32 100644 --- a/src/cpu_new/codegen_timing_p6.c +++ b/src/cpu_new/codegen_timing_p6.c @@ -1706,11 +1706,11 @@ static int uop_run(const risc86_uop_t *uop, int decode_time) static struct { int nr_uops; - const risc86_uop_t *uops[MAX_UOPS]; + const risc86_uop_t *uops[6]; /*Earliest time a uop can start. If the timestamp is -1, then the uop is part of a dependency chain and the start time is the completion time of the previous uop*/ - int earliest_start[MAX_UOPS]; + int earliest_start[6]; } decode_buffer; #define NR_OPSEQS 3 @@ -1901,10 +1901,10 @@ static void decode_instruction(const risc86_instruction_t *ins, uint64_t deps, u for (c = 0; c < ins->nr_uops; c++) { decode_buffer.uops[d] = &ins->uop[c]; - decode_buffer.earliest_start[c] = earliest_start; + decode_buffer.earliest_start[d] = earliest_start; d++; - if (d == 3 && ins->nr_uops > 4) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ + if ((d == 3) && (ins->nr_uops > 4)) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { d = 0; decode_buffer.nr_uops = 3; From e6ccbd2406b741d6a5b73e5139f6258451bf7367 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 25 Apr 2020 22:37:07 +0200 Subject: [PATCH 42/43] Bumped maximum UDMA mode from 2 (ATA 33) to 4 (ATA 66) so it can be used where supported. --- src/disk/hdc_ide.c | 2 +- src/disk/mo.c | 2 +- src/disk/zip.c | 2 +- src/scsi/scsi_cdrom.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 2b6104ee8..0c0453cb1 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -410,7 +410,7 @@ ide_get_max(ide_t *ide, int type) return -1; case TYPE_UDMA: /* UDMA */ if (!ide_boards[ide->board]->force_ata3 && (ide_bm[ide->board] != NULL)) - return 2; + return 4 /*2*/; return -1; default: diff --git a/src/disk/mo.c b/src/disk/mo.c index 289a3d187..1687d37f3 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -1983,7 +1983,7 @@ mo_get_max(int ide_has_dma, int type) ret = ide_has_dma ? 1 : -1; break; case TYPE_UDMA: - ret = ide_has_dma ? 2 : -1; + ret = ide_has_dma ? 4 /*2*/ : -1; break; } diff --git a/src/disk/zip.c b/src/disk/zip.c index 850468573..8a6253100 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -2243,7 +2243,7 @@ zip_get_max(int ide_has_dma, int type) ret = ide_has_dma ? 1 : -1; break; case TYPE_UDMA: - ret = ide_has_dma ? 2 : -1; + ret = ide_has_dma ? 4 /*2*/ : -1; break; } diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 2944335ee..106e2bb87 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2595,7 +2595,7 @@ scsi_cdrom_get_max(int ide_has_dma, int type) ret = ide_has_dma ? 2 : -1; break; case TYPE_UDMA: - ret = ide_has_dma ? 2 : -1; + ret = ide_has_dma ? 4 /*2*/ : -1; break; default: ret = -1; From 3aaf9ac6fe241d5a81277f890dff11fad0f3e9cd Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 26 Apr 2020 00:49:46 +0200 Subject: [PATCH 43/43] More ACPI improvements, implementation of VIA ACPI (yet to be hooked to the southbridges), removed ISABugger stuff from acpi.h, apm.h, dma.h, and usb.h, and updated the descriptions in piix.c and piix.h. --- src/acpi.c | 412 ++++++++++++++++++++++++++++++++++++--- src/apm.c | 18 +- src/include/86box/acpi.h | 30 +-- src/include/86box/apm.h | 9 +- src/include/86box/ddma.h | 7 - src/include/86box/piix.h | 3 +- src/include/86box/usb.h | 7 - src/intel_piix.c | 23 ++- 8 files changed, 437 insertions(+), 72 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 26855a743..d8555cb95 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -32,6 +32,7 @@ #include <86box/keyboard.h> #include <86box/nvr.h> #include <86box/pit.h> +#include <86box/apm.h> #include <86box/acpi.h> @@ -77,8 +78,28 @@ acpi_update_irq(void *priv) } +static void +acpi_raise_smi(void *priv) +{ + acpi_t *dev = (acpi_t *) priv; + + if (dev->vendor == VEN_VIA) { + if ((dev->regs.glbctl & 0x01) && (!dev->regs.smi_lock || !dev->regs.smi_active)) { + smi_line = 1; + dev->regs.smi_active = 1; + } + } else { + if (dev->regs.glbctl & 0x01) { + smi_line = 1; + /* Clear bit 16 of GLBCTL. */ + dev->regs.glbctl &= ~0x00010000; + } + } +} + + static uint32_t -acpi_reg_read_common(int size, uint16_t addr, void *p) +acpi_reg_read_intel(int size, uint16_t addr, void *p) { acpi_t *dev = (acpi_t *) p; uint32_t ret = 0x00000000; @@ -117,16 +138,6 @@ acpi_reg_read_common(int size, uint16_t addr, void *p) /* PCNTRL - Processor Control Register (IO) */ ret = (dev->regs.pcntrl >> shift32) & 0xff; break; - case 0x14: - /* PLVL2 - Processor Level 2 Register (IO) */ - if (size == 1) - ret = dev->regs.plvl2; - break; - case 0x15: - /* PLVL3 - Processor Level 3 Register (IO) */ - if (size == 1) - ret = dev->regs.plvl3; - break; case 0x18: case 0x19: /* GLBSTS - Global Status Register (IO) */ ret = (dev->regs.glbsts >> shift16) & 0xff; @@ -173,8 +184,118 @@ acpi_reg_read_common(int size, uint16_t addr, void *p) } +static uint32_t +acpi_reg_read_via(int size, uint16_t addr, void *p) +{ + acpi_t *dev = (acpi_t *) p; + uint32_t ret = 0x00000000; + int shift16, shift32; + + addr &= 0xff; + shift16 = (addr & 1) << 3; + shift32 = (addr & 3) << 3; + + switch (addr) { + case 0x00: case 0x01: + /* PMSTS - Power Management Status Register (IO) */ + ret = (dev->regs.pmsts >> shift16) & 0xff; + break; + case 0x02: case 0x03: + /* PMEN - Power Management Resume Enable Register (IO) */ + ret = (dev->regs.pmen >> shift16) & 0xff; + break; + case 0x04: case 0x05: + /* PMCNTRL - Power Management Control Register (IO) */ + ret = (dev->regs.pmcntrl >> shift16) & 0xff; + break; + case 0x08: case 0x09: case 0x0a: case 0x0b: + /* PMTMR - Power Management Timer Register (IO) */ + ret = (dev->regs.timer_val >> shift32) & 0xff; + break; + case 0x10: case 0x11: case 0x12: case 0x13: + /* PCNTRL - Processor Control Register (IO) */ + ret = (dev->regs.pcntrl >> shift32) & 0xff; + break; + case 0x20: case 0x21: + /* GPSTS - General Purpose Status Register (IO) */ + ret = (dev->regs.gpsts >> shift16) & 0xff; + break; + case 0x22: case 0x23: + /* General Purpose SCI Enable */ + ret = (dev->regs.gpscien >> shift16) & 0xff; + break; + case 0x24: case 0x25: + /* General Purpose SMI Enable */ + ret = (dev->regs.gpsmien >> shift16) & 0xff; + break; + case 0x26: case 0x27: + /* Power Supply Control */ + ret = (dev->regs.pscntrl >> shift16) & 0xff; + break; + case 0x28: case 0x29: + /* GLBSTS - Global Status Register (IO) */ + ret = (dev->regs.glbsts >> shift16) & 0xff; + break; + case 0x2a: case 0x2b: + /* GLBEN - Global Enable Register (IO) */ + ret = (dev->regs.glben >> shift16) & 0xff; + break; + case 0x2c: case 0x2d: + /* GLBCTL - Global Control Register (IO) */ + ret = (dev->regs.glbctl >> shift16) & 0xff; + ret &= ~0x0110; + ret |= (dev->regs.smi_lock ? 0x10 : 0x00); + ret |= (dev->regs.smi_active ? 0x01 : 0x00); + break; + case 0x2f: + /* SMI Command */ + if (size == 1) + ret = dev->regs.smicmd & 0xff; + break; + case 0x30: case 0x31: case 0x32: case 0x33: + /* Primary Activity Detect Status */ + ret = (dev->regs.padsts >> shift32) & 0xff; + break; + case 0x34: case 0x35: case 0x36: case 0x37: + /* Primary Activity Detect Enable */ + ret = (dev->regs.paden >> shift32) & 0xff; + break; + case 0x38: case 0x39: case 0x3a: case 0x3b: + /* GP Timer Reload Enable */ + ret = (dev->regs.gptren >> shift32) & 0xff; + break; + case 0x40: + /* GPIO Direction Control */ + if (size == 1) + ret = dev->regs.gpio_dir & 0xff; + break; + case 0x42: + /* GPIO port Output Value */ + if (size == 1) + ret = dev->regs.gpio_val & 0xff; + break; + case 0x44: + /* GPIO port Output Value */ + if (size == 1) + ret = dev->regs.extsmi_val & 0xff; + break; + case 0x46: case 0x47: + /* GPO Port Output Value */ + ret = (dev->regs.gpo_val >> shift16) & 0xff; + break; + case 0x48: case 0x49: + /* GPO Port Input Value */ + ret = (dev->regs.gpi_val >> shift16) & 0xff; + break; + } + + acpi_log("(%i) ACPI Read (%i) %02X: %02X\n", in_smm, size, addr, ret); + return ret; +} + + static void -acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) +acpi_reg_write_intel(int size, uint16_t addr, uint8_t val, void *p) { acpi_t *dev = (acpi_t *) p; int shift16, shift32; @@ -199,6 +320,12 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) case 0x04: case 0x05: /* PMCNTRL - Power Management Control Register (IO) */ dev->regs.pmcntrl = ((dev->regs.pmcntrl & ~(0xff << shift16)) | (val << shift16)) & 0x3c07; + /* Setting GBL_RLS also sets BIOS_STS and generates SMI. */ + if ((addr == 0x04) && (dev->regs.pmcntrl & 0x0004)) { + dev->regs.glbsts |= 0x01; + if (dev->regs.glben & 0x02) + acpi_raise_smi(dev); + } if (dev->regs.pmcntrl & 0x2000) { sus_typ = (dev->regs.pmcntrl >> 10) & 7; switch (sus_typ) { @@ -240,16 +367,6 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) /* PCNTRL - Processor Control Register (IO) */ dev->regs.pcntrl = ((dev->regs.pcntrl & ~(0xff << shift32)) | (val << shift32)) & 0x00023e1e; break; - case 0x14: - /* PLVL2 - Processor Level 2 Register (IO) */ - if (size == 1) - dev->regs.plvl2 = val; - break; - case 0x15: - /* PLVL3 - Processor Level 3 Register (IO) */ - if (size == 1) - dev->regs.plvl3 = val; - break; case 0x18: case 0x19: /* GLBSTS - Global Status Register (IO) */ dev->regs.glbsts &= ~((val << shift16) & 0x0df7); @@ -264,8 +381,13 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) break; case 0x28: case 0x29: case 0x2a: case 0x2b: /* GLBCTL - Global Control Register (IO) */ - // dev->regs.glbctl = ((dev->regs.glbctl & ~(0xff << shift32)) | (val << shift32)) & 0x0701ff07; - dev->regs.glbctl = ((dev->regs.glbctl & ~(0xff << shift32)) | (val << shift32)) & 0x0700ff07; + dev->regs.glbctl = ((dev->regs.glbctl & ~(0xff << shift32)) | (val << shift32)) & 0x0701ff07; + /* Setting BIOS_RLS also sets GBL_STS and generates SMI. */ + if (dev->regs.glbctl & 0x00000002) { + dev->regs.pmsts |= 0x20; + if (dev->regs.pmen & 0x20) + acpi_update_irq(dev); + } break; case 0x2c: case 0x2d: case 0x2e: case 0x2f: /* DEVCTL - Device Control Register (IO) */ @@ -280,6 +402,180 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) } +static void +acpi_reg_write_via(int size, uint16_t addr, uint8_t val, void *p) +{ + acpi_t *dev = (acpi_t *) p; + int shift16, shift32; + int sus_typ; + + addr &= 0xff; + acpi_log("(%i) ACPI Write (%i) %02X: %02X\n", in_smm, size, addr, val); + shift16 = (addr & 1) << 3; + shift32 = (addr & 3) << 3; + + switch (addr) { + case 0x00: case 0x01: + /* PMSTS - Power Management Status Register (IO) */ + dev->regs.pmsts &= ~((val << shift16) & 0x8d31); + acpi_update_irq(dev); + if ((addr == 0x00) && !(dev->regs.pmsts & 0x20)) + dev->regs.glbctl &= ~0x0002; + break; + case 0x02: case 0x03: + /* PMEN - Power Management Resume Enable Register (IO) */ + dev->regs.pmen = ((dev->regs.pmen & ~(0xff << shift16)) | (val << shift16)) & 0x0521; + acpi_update_irq(dev); + break; + case 0x04: case 0x05: + /* PMCNTRL - Power Management Control Register (IO) */ + dev->regs.pmcntrl = ((dev->regs.pmcntrl & ~(0xff << shift16)) | (val << shift16)) & 0x3c07; + /* Setting GBL_RLS also sets BIOS_STS and generates SMI. */ + if ((addr == 0x04) && (dev->regs.pmcntrl & 0x0004)) { + dev->regs.glbsts |= 0x20; + if (dev->regs.glben & 0x20) + acpi_raise_smi(dev); + } + if (dev->regs.pmcntrl & 0x2000) { + sus_typ = (dev->regs.pmcntrl >> 10) & 7; + switch (sus_typ) { + case 0: + /* Soft power off. */ + exit(-1); + break; + case 1: + /* Suspend to RAM. */ + nvr_reg_write(0x000f, 0xff, dev->nvr); + + /* Do a hard reset. */ + device_reset_all_pci(); + + cpu_alt_reset = 0; + + pci_reset(); + keyboard_at_reset(); + + mem_a20_alt = 0; + mem_a20_recalc(); + + flushmmucache(); + + resetx86(); + break; + } + } + break; + case 0x10: case 0x11: case 0x12: case 0x13: + /* PCNTRL - Processor Control Register (IO) */ + dev->regs.pcntrl = ((dev->regs.pcntrl & ~(0xff << shift32)) | (val << shift32)) & 0x0000001e; + break; + case 0x20: case 0x21: + /* GPSTS - General Purpose Status Register (IO) */ + dev->regs.gpsts &= ~((val << shift16) & 0x03ff); + break; + case 0x22: case 0x23: + /* General Purpose SCI Enable */ + dev->regs.gpscien = ((dev->regs.gpscien & ~(0xff << shift16)) | (val << shift16)) & 0x03ff; + break; + case 0x24: case 0x25: + /* General Purpose SMI Enable */ + dev->regs.gpsmien = ((dev->regs.gpsmien & ~(0xff << shift16)) | (val << shift16)) & 0x03ff; + break; + case 0x26: case 0x27: + /* Power Supply Control */ + dev->regs.pscntrl = ((dev->regs.pscntrl & ~(0xff << shift16)) | (val << shift16)) & 0x0701; + break; + case 0x28: case 0x29: + /* GLBSTS - Global Status Register (IO) */ + dev->regs.glbsts &= ~((val << shift16) & 0x007f); + break; + case 0x2a: case 0x2b: + /* GLBEN - Global Enable Register (IO) */ + dev->regs.glben = ((dev->regs.glben & ~(0xff << shift16)) | (val << shift16)) & 0x007f; + break; + case 0x2c: + /* GLBCTL - Global Control Register (IO) */ + dev->regs.glbctl = (dev->regs.glbctl & ~0xff) | (val & 0xff); + dev->regs.smi_lock = !!(dev->regs.glbctl & 0x0010); + /* Setting BIOS_RLS also sets GBL_STS and generates SMI. */ + if (dev->regs.glbctl & 0x0002) { + dev->regs.pmsts |= 0x20; + if (dev->regs.pmen & 0x20) + acpi_update_irq(dev); + } + break; + case 0x2d: + /* GLBCTL - Global Control Register (IO) */ + dev->regs.glbctl &= ~((val << 8) & 0x0100); + if (val & 0x01) + dev->regs.smi_active = 0; + break; + case 0x2f: + /* SMI Command */ + if (size == 1) { + dev->regs.smicmd = val & 0xff; + dev->regs.glbsts |= 0x40; + if (dev->regs.glben & 0x40) + acpi_raise_smi(dev); + } + break; + case 0x30: case 0x31: case 0x32: case 0x33: + /* Primary Activity Detect Status */ + dev->regs.padsts &= ~((val << shift32) & 0x000000fd); + break; + case 0x34: case 0x35: case 0x36: case 0x37: + /* Primary Activity Detect Enable */ + dev->regs.paden = ((dev->regs.paden & ~(0xff << shift32)) | (val << shift32)) & 0x000000fd; + break; + case 0x38: case 0x39: case 0x3a: case 0x3b: + /* GP Timer Reload Enable */ + dev->regs.gptren = ((dev->regs.gptren & ~(0xff << shift32)) | (val << shift32)) & 0x000000d9; + break; + case 0x40: + /* GPIO Direction Control */ + if (size == 1) + dev->regs.gpio_dir = val & 0xff; + break; + case 0x42: + /* GPIO port Output Value */ + if (size == 1) + dev->regs.gpio_val = val & 0xff; + break; + case 0x46: case 0x47: + /* GPO Port Output Value */ + dev->regs.gpo_val = ((dev->regs.gpo_val & ~(0xff << shift16)) | (val << shift16)) & 0xffff; + break; + } +} + + +static uint32_t +acpi_reg_read_common(int size, uint16_t addr, void *p) +{ + acpi_t *dev = (acpi_t *) p; + uint8_t ret = 0xff; + + if (dev->vendor == VEN_VIA) + ret = acpi_reg_read_via(size, addr, p); + else + ret = acpi_reg_read_intel(size, addr, p); + + return ret; +} + + +static void +acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) +{ + acpi_t *dev = (acpi_t *) p; + + if (dev->vendor == VEN_VIA) + acpi_reg_write_via(size, addr, val, p); + else + acpi_reg_write_intel(size, addr, val, p); +} + + static uint32_t acpi_reg_readl(uint16_t addr, void *p) { @@ -440,6 +736,46 @@ acpi_set_nvr(acpi_t *dev, nvr_t *nvr) } +static void +acpi_apm_out(uint16_t port, uint8_t val, void *p) +{ + acpi_t *dev = (acpi_t *) p; + + acpi_log("[%04X:%08X] APM write: %04X = %02X (BX = %04X, CX = %04X)\n", CS, cpu_state.pc, port, val, BX, CX); + + port &= 0x0001; + + if (port == 0x0000) { + dev->apm->cmd = val; + if (dev->apm->do_smi) { + if (dev->vendor == VEN_INTEL) + dev->regs.glbsts |= 0x20; + acpi_raise_smi(dev); + } + } else + dev->apm->stat = val; +} + + +static uint8_t +acpi_apm_in(uint16_t port, void *p) +{ + acpi_t *dev = (acpi_t *) p; + uint8_t ret = 0xff; + + port &= 0x0001; + + if (port == 0x0000) + ret = dev->apm->cmd; + else + ret = dev->apm->stat; + + acpi_log("[%04X:%08X] APM read: %04X = %02X\n", CS, cpu_state.pc, port, ret); + + return ret; +} + + static void acpi_reset(void *priv) { @@ -482,6 +818,13 @@ acpi_init(const device_t *info) if (dev == NULL) return(NULL); memset(dev, 0x00, sizeof(acpi_t)); + dev->vendor = info->local; + + if (dev->vendor == VEN_INTEL) { + dev->apm = device_add(&apm_pci_acpi_device); + io_sethandler(0x00b2, 0x0002, acpi_apm_in, NULL, NULL, acpi_apm_out, NULL, NULL, dev); + } + timer_add(&dev->timer, acpi_timer_count, dev, 0); timer_set_delay_u64(&dev->timer, ACPICONST); @@ -489,11 +832,26 @@ acpi_init(const device_t *info) } -const device_t acpi_device = +const device_t acpi_intel_device = { - "ACPI", + "ACPI v1.0", DEVICE_PCI, - 0, + VEN_INTEL, + acpi_init, + acpi_close, + acpi_reset, + NULL, + acpi_speed_changed, + NULL, + NULL +}; + + +const device_t acpi_via_device = +{ + "ACPI v1.2", + DEVICE_PCI, + VEN_VIA, acpi_init, acpi_close, acpi_reset, diff --git a/src/apm.c b/src/apm.c index b197c0964..38d223e88 100644 --- a/src/apm.c +++ b/src/apm.c @@ -116,7 +116,8 @@ static void apm_t *dev = (apm_t *) malloc(sizeof(apm_t)); memset(dev, 0, sizeof(apm_t)); - io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, dev); + if (info->local == 0) + io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, dev); return dev; } @@ -150,3 +151,18 @@ const device_t apm_pci_device = NULL, NULL }; + + +const device_t apm_pci_acpi_device = +{ + "Advanced Power Management (PCI)", + DEVICE_PCI, + 1, + apm_init, + apm_close, + apm_reset, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/include/86box/acpi.h b/src/include/86box/acpi.h index ca0cb3b93..fa10aaa2f 100644 --- a/src/include/86box/acpi.h +++ b/src/include/86box/acpi.h @@ -6,13 +6,6 @@ * * This file is part of the 86Box distribution. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) - * * Definitions for the ACPI emulation. * * @@ -46,21 +39,31 @@ extern "C" { #define ACPI_ENABLE 0xf1 #define ACPI_DISABLE 0xf0 +#define VEN_INTEL 0x8086 +#define VEN_VIA 0x1106 + typedef struct { uint8_t plvl2, plvl3, + smicmd, gpio_dir, + gpio_val, extsmi_val, timer32, gpireg[3], gporeg[4]; uint16_t pmsts, pmen, pmcntrl, gpsts, - gpen, io_base; - int slot, - irq_mode, irq_pin; + gpen, io_base, + gpscien, gpsmien, + pscntrl, gpo_val, + gpi_val; + int slot, irq_mode, + irq_pin, smi_lock, + smi_active; uint32_t pcntrl, glbsts, devsts, glben, glbctl, devctl, - timer_val; + padsts, paden, + gptren, timer_val; uint64_t tmr_overflow_time; } acpi_regs_t; @@ -69,13 +72,16 @@ typedef struct { acpi_regs_t regs; uint8_t gporeg_default[4]; + int vendor; pc_timer_t timer; nvr_t *nvr; + apm_t *apm; } acpi_t; /* Global variables. */ -extern const device_t acpi_device; +extern const device_t acpi_intel_device; +extern const device_t acpi_via_device; /* Functions. */ diff --git a/src/include/86box/apm.h b/src/include/86box/apm.h index b7754f78a..1fd985951 100644 --- a/src/include/86box/apm.h +++ b/src/include/86box/apm.h @@ -6,13 +6,6 @@ * * This file is part of the 86Box distribution. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) - * * Definitions for the Advanced Power Management emulation. * * @@ -38,7 +31,9 @@ typedef struct /* Global variables. */ extern const device_t apm_device; + extern const device_t apm_pci_device; +extern const device_t apm_pci_acpi_device; /* Functions. */ diff --git a/src/include/86box/ddma.h b/src/include/86box/ddma.h index 2d0a9f8d9..64642f2ae 100644 --- a/src/include/86box/ddma.h +++ b/src/include/86box/ddma.h @@ -6,13 +6,6 @@ * * This file is part of the 86Box distribution. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) - * * Definitions for the Distributed DMA emulation. * * diff --git a/src/include/86box/piix.h b/src/include/86box/piix.h index e07607606..9f6724fae 100644 --- a/src/include/86box/piix.h +++ b/src/include/86box/piix.h @@ -4,7 +4,8 @@ * PC systems and compatibles from 1981 through fairly recent * system designs based on the PCI bus. * - * Emulation of the Intel PIIX and PIIX3 Xcelerators. + * Emulation of the Intel PIIX, PIIX3, PIIX4, PIIX4E, and SMSC + * SLC90E66 (Victory66) Xcelerators. * * Emulation core dispatcher. * diff --git a/src/include/86box/usb.h b/src/include/86box/usb.h index b027796a2..aced538c8 100644 --- a/src/include/86box/usb.h +++ b/src/include/86box/usb.h @@ -6,13 +6,6 @@ * * This file is part of the 86Box distribution. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) - * * Definitions for the Distributed DMA emulation. * * diff --git a/src/intel_piix.c b/src/intel_piix.c index 257b9be9a..4a9a80f1e 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -4,7 +4,8 @@ * PC systems and compatibles from 1981 through fairly recent * system designs based on the PCI bus. * - * Emulation of the Intel PIIX and PIIX3 Xcelerators. + * Emulation of the Intel PIIX, PIIX3, PIIX4, PIIX4E, and SMSC + * SLC90E66 (Victory66) Xcelerators. * * PRD format : * word 0 - base address @@ -779,7 +780,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x04: fregs[0x04] = (val & 0x01); smbus_update_io_mapping(dev); - apm_set_do_smi(dev->apm, !!(fregs[0x5b] & 0x02) && !!(val & 0x01)); + apm_set_do_smi(dev->acpi->apm, !!(fregs[0x5b] & 0x02) && !!(val & 0x01)); break; case 0x07: if (val & 0x08) @@ -844,7 +845,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) break; case 0x5b: fregs[addr] = val & 0x03; - apm_set_do_smi(dev->apm, !!(val & 0x02) && !!(fregs[0x04] & 0x01)); + apm_set_do_smi(dev->acpi->apm, !!(val & 0x02) && !!(fregs[0x04] & 0x01)); break; case 0x63: fregs[addr] = val & 0xf7; @@ -1109,9 +1110,7 @@ piix_apm_out(uint16_t port, uint8_t val, void *p) piix_t *dev = (piix_t *) p; if (dev->apm->do_smi) { - if (dev->type > 3) - dev->acpi->regs.glbsts |= 0x20; - else + if (dev->type < 4) dev->regs[0][0xaa] |= 0x80; } } @@ -1189,7 +1188,7 @@ static void dev->nvr = device_add(&piix4_nvr_device); dev->smbus = device_add(&piix4_smbus_device); - dev->acpi = device_add(&acpi_device); + dev->acpi = device_add(&acpi_intel_device); acpi_set_slot(dev->acpi, dev->pci_slot); acpi_set_nvr(dev->acpi, dev->nvr); @@ -1206,9 +1205,13 @@ static void } else cpu_fast_off_val = cpu_fast_off_count = 0; - dev->apm = device_add(&apm_pci_device); - /* APM intercept handler to update PIIX/PIIX3 and PIIX4/4E/SMSC ACPI SMI status on APM SMI. */ - io_sethandler(0x00b2, 0x0001, NULL, NULL, NULL, piix_apm_out, NULL, NULL, dev); + /* On PIIX4, PIIX4E, and SMSC, APM is added by the ACPI device. */ + if (dev->type < 4) { + dev->apm = device_add(&apm_pci_device); + /* APM intercept handler to update PIIX/PIIX3 and PIIX4/4E/SMSC ACPI SMI status on APM SMI. */ + io_sethandler(0x00b2, 0x0001, NULL, NULL, NULL, piix_apm_out, NULL, NULL, dev); + } + dev->port_92 = device_add(&port_92_pci_device); dma_alias_set();