From 31aed306c9b5ffb7116a7ae816c3d5bc354649ce Mon Sep 17 00:00:00 2001 From: linear cannon Date: Sat, 29 Jan 2022 07:24:04 -0800 Subject: [PATCH] x87_timings: new timings for fpu/iu concurrency --- src/cpu/cpu.c | 1 + src/cpu/x87_timings.c | 155 ++++++++++++++++++++++++++++++++++++++++++ src/cpu/x87_timings.h | 5 +- 3 files changed, 160 insertions(+), 1 deletion(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 2004d7336..09d26cf25 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1369,6 +1369,7 @@ cpu_set(void) case FPU_487SX: default: x87_timings = x87_timings_486; + x87_concurrency = x87_concurrency_486; } if (is386) { diff --git a/src/cpu/x87_timings.c b/src/cpu/x87_timings.c index 7443aae72..905ff1c6a 100644 --- a/src/cpu/x87_timings.c +++ b/src/cpu/x87_timings.c @@ -8,6 +8,7 @@ #include "x87_timings.h" x87_timings_t x87_timings; +x87_timings_t x87_concurrency; const x87_timings_t x87_timings_8087 = { @@ -313,3 +314,157 @@ const x87_timings_t x87_timings_486 = .fyl2x = (196 + 329) / 2, .fyl2xp1 = (171 + 326) / 2 }; + +/* this should be used for FPUs with no concurrency. +some pre-486DX Cyrix FPUs reportedly are like this. */ +const x87_timings_t x87_concurrency_none = +{ + .f2xm1 = 0, + .fabs = 0, + .fadd = 0, + .fadd_32 = 0, + .fadd_64 = 0, + .fbld = 0, + .fbstp = 0, + .fchs = 0, + .fclex = 0, + .fcom = 0, + .fcom_32 = 0, + .fcom_64 = 0, + .fcos = 0, + .fincdecstp = 0, + .fdisi_eni = 0, + .fdiv = 0, + .fdiv_32 = 0, + .fdiv_64 = 0, + .ffree = 0, + .fadd_i16 = 0, + .fadd_i32 = 0, + .fcom_i16 = 0, + .fcom_i32 = 0, + .fdiv_i16 = 0, + .fdiv_i32 = 0, + .fild_16 = 0, + .fild_32 = 0, + .fild_64 = 0, + .fmul_i16 = 0, + .fmul_i32 = 0, + .finit = 0, + .fist_16 = 0, + .fist_32 = 0, + .fist_64 = 0, + .fld = 0, + .fld_32 = 0, + .fld_64 = 0, + .fld_80 = 0, + .fld_z1 = 0, + .fld_const = 0, + .fldcw = 0, + .fldenv = 0, + .fmul = 0, + .fmul_32 = 0, + .fmul_64 = 0, + .fnop = 0, + .fpatan = 0, + .fprem = 0, + .fprem1 = 0, + .fptan = 0, + .frndint = 0, + .frstor = 0, + .fsave = 0, + .fscale = 0, + .fsetpm = 0, + .fsin_cos = 0, + .fsincos = 0, + .fsqrt = 0, + .fst = 0, + .fst_32 = 0, + .fst_64 = 0, + .fst_80 = 0, + .fstcw_sw = 0, + .fstenv = 0, + .ftst = 0, + .fucom = 0, + .fwait = 0, + .fxam = 0, + .fxch = 0, + .fxtract = 0, + .fyl2x = 0, + .fyl2xp1 = 0, +}; + +const x87_timings_t x87_concurrency_486 = +{ + .f2xm1 = 2, + .fabs = 0, + .fadd = 7, + .fadd_32 = 7, + .fadd_64 = 7, + .fbld = 8, + .fbstp = 0, + .fchs = 0, + .fclex = 0, + .fcom = 1, + .fcom_32 = 1, + .fcom_64 = 1, + .fcos = 2, + .fincdecstp = 0, + .fdisi_eni = 0, + .fdiv = 70, + .fdiv_32 = 70, + .fdiv_64 = 70, + .ffree = 0, + .fadd_i16 = 7, + .fadd_i32 = 7, + .fcom_i16 = 1, + .fcom_i32 = 1, + .fdiv_i16 = 70, + .fdiv_i32 = 70, + .fild_16 = 4, + .fild_32 = 4, + .fild_64 = 8, + .fmul_i16 = 8, + .fmul_i32 = 8, + .finit = 0, + .fist_16 = 0, + .fist_32 = 0, + .fist_64 = 0, + .fld = 0, + .fld_32 = 0, + .fld_64 = 0, + .fld_80 = 0, + .fld_z1 = 0, + .fld_const = 2, + .fldcw = 0, + .fldenv = 0, + .fmul = 13, + .fmul_32 = 8, + .fmul_64 = 11, + .fnop = 0, + .fpatan = 5, + .fprem = 2, + .fprem1 = 6, + .fptan = 70, + .frndint = 0, + .frstor = 0, + .fsave = 0, + .fscale = 2, + .fsetpm = 0, + .fsin_cos = 2, + .fsincos = 2, + .fsqrt = 70, + .fst = 0, + .fst_32 = 0, + .fst_64 = 0, + .fst_80 = 0, + .fstcw_sw = 0, + .fstenv = 0, + .ftst = 1, + .fucom = 1, + .fwait = 0, + .fxam = 0, + .fxch = 0, + .fxtract = 4, + .fyl2x = 13, + .fyl2xp1 = 13, +}; \ No newline at end of file diff --git a/src/cpu/x87_timings.h b/src/cpu/x87_timings.h index ec4f8ceca..c7dac8270 100644 --- a/src/cpu/x87_timings.h +++ b/src/cpu/x87_timings.h @@ -53,4 +53,7 @@ extern const x87_timings_t x87_timings_287; extern const x87_timings_t x87_timings_387; extern const x87_timings_t x87_timings_486; -extern x87_timings_t x87_timings; \ No newline at end of file +extern const x87_timings_t x87_concurrency_486; + +extern x87_timings_t x87_timings; +extern x87_timings_t x87_concurrency; \ No newline at end of file