mirror of
https://github.com/holub/mame
synced 2025-04-18 06:22:45 +03:00
m68k: add FPU instructions FETOX
, FETOXM1
, FTWOTOX
, FTENTOX
(#12903)
This commit is contained in:
parent
75a5326cea
commit
bae7420375
343
3rdparty/softfloat3/bochs_ext/f2xm1.c
vendored
343
3rdparty/softfloat3/bochs_ext/f2xm1.c
vendored
@ -25,27 +25,40 @@ these four paragraphs for those parts of this code that are retained.
|
|||||||
|
|
||||||
#define FLOAT128
|
#define FLOAT128
|
||||||
|
|
||||||
|
#include "../build/MAME/platform.h"
|
||||||
|
|
||||||
#include "../source/include/softfloat.h"
|
#include "../source/include/softfloat.h"
|
||||||
#include "../source/include/internals.h"
|
#include "../source/include/internals.h"
|
||||||
#include "softfloat-extra.h"
|
#include "softfloat-extra.h"
|
||||||
#include "softfloat-helpers.h"
|
#include "softfloat-helpers.h"
|
||||||
#include "softfloat-specialize.h"
|
#include "softfloat-specialize.h"
|
||||||
|
|
||||||
|
static const extFloat80_t floatx80_posone = packFloatx80(0, 0x3fff, uint64_t(0x8000000000000000));
|
||||||
static const extFloat80_t floatx80_negone = packFloatx80(1, 0x3fff, uint64_t(0x8000000000000000));
|
static const extFloat80_t floatx80_negone = packFloatx80(1, 0x3fff, uint64_t(0x8000000000000000));
|
||||||
static const extFloat80_t floatx80_neghalf = packFloatx80(1, 0x3ffe, uint64_t(0x8000000000000000));
|
static const extFloat80_t floatx80_neghalf = packFloatx80(1, 0x3ffe, uint64_t(0x8000000000000000));
|
||||||
|
static const float128_t float128_e =
|
||||||
|
packFloat128(uint64_t(0x40005BF0A8B14576), uint64_t(0x95355FB8AC404E7A));
|
||||||
static const float128_t float128_ln2 =
|
static const float128_t float128_ln2 =
|
||||||
packFloat128(uint64_t(0x3ffe62e42fefa39e), uint64_t(0xf35793c7673007e6));
|
packFloat128(uint64_t(0x3ffe62e42fefa39e), uint64_t(0xf35793c7673007e6));
|
||||||
|
static const float128_t float128_ln10 =
|
||||||
|
packFloat128(uint64_t(0x400026bb1bbb5551), uint64_t(0x582dd4adac5705a6));
|
||||||
|
|
||||||
#ifdef BETTER_THAN_PENTIUM
|
#ifdef BETTER_THAN_PENTIUM
|
||||||
|
|
||||||
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
|
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
|
||||||
#define LN2_SIG_LO uint64_t(0xc9e3b39800000000) /* 96 bit precision */
|
#define LN2_SIG_LO uint64_t(0xc9e3b39800000000) /* 96 bit precision */
|
||||||
|
|
||||||
|
#define LN10_SIG_HI uint64_t(0xae585ba95bb0a2aa)
|
||||||
|
#define LN10_SIG_LO uint64_t(0x763776d400000000) /* 96 bit precision */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
|
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
|
||||||
#define LN2_SIG_LO uint64_t(0xc000000000000000) /* 67-bit precision */
|
#define LN2_SIG_LO uint64_t(0xc000000000000000) /* 67-bit precision */
|
||||||
|
|
||||||
|
#define LN10_SIG_HI uint64_t(0xae585ba95bb0a2aa)
|
||||||
|
#define LN10_SIG_LO uint64_t(0x7000000000000000) /* 67-bit precision */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EXP_ARR_SIZE 15
|
#define EXP_ARR_SIZE 15
|
||||||
@ -75,25 +88,25 @@ extern float128_t EvalPoly(float128_t x, const float128_t *arr, int n);
|
|||||||
static float128_t poly_exp(float128_t x)
|
static float128_t poly_exp(float128_t x)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
// 2 3 4 5 6 7 8 9
|
2 3 4 5 6 7 8 9
|
||||||
// x x x x x x x x x
|
x x x x x x x x x
|
||||||
// e - 1 ~ x + --- + --- + --- + --- + --- + --- + --- + --- + ...
|
e - 1 ~ x + --- + --- + --- + --- + --- + --- + --- + --- + ...
|
||||||
// 2! 3! 4! 5! 6! 7! 8! 9!
|
2! 3! 4! 5! 6! 7! 8! 9!
|
||||||
//
|
|
||||||
// 2 3 4 5 6 7 8
|
2 3 4 5 6 7 8
|
||||||
// x x x x x x x x
|
x x x x x x x x
|
||||||
// = x [ 1 + --- + --- + --- + --- + --- + --- + --- + --- + ... ]
|
= x [ 1 + --- + --- + --- + --- + --- + --- + --- + --- + ... ]
|
||||||
// 2! 3! 4! 5! 6! 7! 8! 9!
|
2! 3! 4! 5! 6! 7! 8! 9!
|
||||||
//
|
|
||||||
// 8 8
|
8 8
|
||||||
// -- 2k -- 2k+1
|
-- 2k -- 2k+1
|
||||||
// p(x) = > C * x q(x) = > C * x
|
p(x) = > C * x q(x) = > C * x
|
||||||
// -- 2k -- 2k+1
|
-- 2k -- 2k+1
|
||||||
// k=0 k=0
|
k=0 k=0
|
||||||
//
|
|
||||||
// x
|
x
|
||||||
// e - 1 ~ x * [ p(x) + x * q(x) ]
|
e - 1 ~ x * [ p(x) + x * q(x) ]
|
||||||
//
|
|
||||||
*/
|
*/
|
||||||
float128_t t = EvalPoly(x, (const float128_t*) exp_arr, EXP_ARR_SIZE);
|
float128_t t = EvalPoly(x, (const float128_t*) exp_arr, EXP_ARR_SIZE);
|
||||||
return f128_mul(t, x);
|
return f128_mul(t, x);
|
||||||
@ -184,3 +197,295 @@ extFloat80_t extFloat80_2xm1(extFloat80_t a)
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =================================================
|
||||||
|
// x
|
||||||
|
// Compute e
|
||||||
|
// =================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Uses the following identities:
|
||||||
|
//
|
||||||
|
// 1. ----------------------------------------------------------
|
||||||
|
// 2 3 4 5 n
|
||||||
|
// x x x x x x x
|
||||||
|
// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
|
||||||
|
// 1! 2! 3! 4! 5! n!
|
||||||
|
//
|
||||||
|
extFloat80_t extFloat80_etox(extFloat80_t a)
|
||||||
|
{
|
||||||
|
uint64_t zSig0, zSig1, zSig2;
|
||||||
|
struct exp32_sig64 normExpSig;
|
||||||
|
|
||||||
|
// handle unsupported extended double-precision floating encodings
|
||||||
|
if (extF80_isUnsupported(a)) {
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_invalid;
|
||||||
|
return floatx80_default_nan;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t aSig = extF80_fraction(a);
|
||||||
|
int32_t aExp = extF80_exp(a);
|
||||||
|
int aSign = extF80_sign(a);
|
||||||
|
|
||||||
|
if (aExp == 0x7FFF) {
|
||||||
|
if (aSig << 1) {
|
||||||
|
const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
|
||||||
|
extFloat80_t rv;
|
||||||
|
rv.signExp = nan.v64;
|
||||||
|
rv.signif = nan.v0;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (aSign) ? floatx80_negone : a;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! aExp) {
|
||||||
|
if (! aSig) return a;
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
|
||||||
|
normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
|
||||||
|
aExp = normExpSig.exp + 1;
|
||||||
|
aSig = normExpSig.sig;
|
||||||
|
|
||||||
|
mul128By64To192(0x1000000000000000, 0, aSig, &zSig0, &zSig1, &zSig2);
|
||||||
|
if (0 < (int64_t) zSig0) {
|
||||||
|
shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
|
||||||
|
--aExp;
|
||||||
|
}
|
||||||
|
return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
|
||||||
|
}
|
||||||
|
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||||
|
|
||||||
|
const extFloat80_t base = f128_to_extF80(float128_e);
|
||||||
|
extFloat80_t val = floatx80_posone;
|
||||||
|
float128_t x;
|
||||||
|
|
||||||
|
while (!(extF80_lt(a, floatx80_posone))) {
|
||||||
|
val = extF80_mul(val, base);
|
||||||
|
|
||||||
|
if (extF80_exp(val) == 0x7FFF) { // inf
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_sub(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (extF80_le(a, floatx80_negone)) {
|
||||||
|
val = extF80_div(val, base);
|
||||||
|
|
||||||
|
if (!extF80_exp(val)) { // subnormal
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_add(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret:
|
||||||
|
/* ******************************** */
|
||||||
|
/* using float128 for approximation */
|
||||||
|
/* ******************************** */
|
||||||
|
x = extF80_to_f128(a);
|
||||||
|
x = poly_exp(x);
|
||||||
|
|
||||||
|
val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =================================================
|
||||||
|
// x
|
||||||
|
// Compute 2
|
||||||
|
// =================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Uses the following identities:
|
||||||
|
//
|
||||||
|
// 1. ----------------------------------------------------------
|
||||||
|
// x x*ln(2)
|
||||||
|
// 2 = e
|
||||||
|
//
|
||||||
|
// 2. ----------------------------------------------------------
|
||||||
|
// 2 3 4 5 n
|
||||||
|
// x x x x x x x
|
||||||
|
// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
|
||||||
|
// 1! 2! 3! 4! 5! n!
|
||||||
|
//
|
||||||
|
extFloat80_t extFloat80_2tox(extFloat80_t a)
|
||||||
|
{
|
||||||
|
uint64_t zSig0, zSig1, zSig2;
|
||||||
|
struct exp32_sig64 normExpSig;
|
||||||
|
|
||||||
|
// handle unsupported extended double-precision floating encodings
|
||||||
|
if (extF80_isUnsupported(a)) {
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_invalid;
|
||||||
|
return floatx80_default_nan;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t aSig = extF80_fraction(a);
|
||||||
|
int32_t aExp = extF80_exp(a);
|
||||||
|
int aSign = extF80_sign(a);
|
||||||
|
|
||||||
|
if (aExp == 0x7FFF) { // inf or NaN
|
||||||
|
if (aSig << 1) { // NaN
|
||||||
|
const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
|
||||||
|
extFloat80_t rv;
|
||||||
|
rv.signExp = nan.v64;
|
||||||
|
rv.signif = nan.v0;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (aSign) ? floatx80_negone : a; // -inf or +inf
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! aExp) { // subnormal
|
||||||
|
if (! aSig) return a;
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
|
||||||
|
normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
|
||||||
|
aExp = normExpSig.exp + 1;
|
||||||
|
aSig = normExpSig.sig;
|
||||||
|
|
||||||
|
mul128By64To192(LN2_SIG_HI, LN2_SIG_LO, aSig, &zSig0, &zSig1, &zSig2);
|
||||||
|
if (0 < (int64_t) zSig0) {
|
||||||
|
shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
|
||||||
|
--aExp;
|
||||||
|
}
|
||||||
|
return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
|
||||||
|
}
|
||||||
|
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||||
|
|
||||||
|
const extFloat80_t base = i32_to_extF80(2);
|
||||||
|
extFloat80_t val = floatx80_posone;
|
||||||
|
float128_t x;
|
||||||
|
|
||||||
|
while (!(extF80_lt(a, floatx80_posone))) {
|
||||||
|
val = extF80_mul(val, base);
|
||||||
|
|
||||||
|
if (extF80_exp(val) == 0x7FFF) { // inf
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_sub(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (extF80_le(a, floatx80_negone)) {
|
||||||
|
val = extF80_div(val, base);
|
||||||
|
|
||||||
|
if (!extF80_exp(val)) { // subnormal
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_add(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret:
|
||||||
|
/* ******************************** */
|
||||||
|
/* using float128 for approximation */
|
||||||
|
/* ******************************** */
|
||||||
|
x = extF80_to_f128(a);
|
||||||
|
x = f128_mul(x, float128_ln2);
|
||||||
|
x = poly_exp(x);
|
||||||
|
|
||||||
|
val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =================================================
|
||||||
|
// x
|
||||||
|
// Compute 10
|
||||||
|
// =================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Uses the following identities:
|
||||||
|
//
|
||||||
|
// 1. ----------------------------------------------------------
|
||||||
|
// x x*ln(10)
|
||||||
|
// 2 = e
|
||||||
|
//
|
||||||
|
// 2. ----------------------------------------------------------
|
||||||
|
// 2 3 4 5 n
|
||||||
|
// x x x x x x x
|
||||||
|
// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
|
||||||
|
// 1! 2! 3! 4! 5! n!
|
||||||
|
//
|
||||||
|
extFloat80_t extFloat80_10tox(extFloat80_t a)
|
||||||
|
{
|
||||||
|
uint64_t zSig0, zSig1, zSig2;
|
||||||
|
struct exp32_sig64 normExpSig;
|
||||||
|
|
||||||
|
// handle unsupported extended double-precision floating encodings
|
||||||
|
if (extF80_isUnsupported(a)) {
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_invalid;
|
||||||
|
return floatx80_default_nan;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t aSig = extF80_fraction(a);
|
||||||
|
int32_t aExp = extF80_exp(a);
|
||||||
|
int aSign = extF80_sign(a);
|
||||||
|
|
||||||
|
if (aExp == 0x7FFF) {
|
||||||
|
if (aSig << 1) {
|
||||||
|
const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
|
||||||
|
extFloat80_t rv;
|
||||||
|
rv.signExp = nan.v64;
|
||||||
|
rv.signif = nan.v0;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (aSign) ? floatx80_negone : a;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! aExp) {
|
||||||
|
if (! aSig) return a;
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
|
||||||
|
normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
|
||||||
|
aExp = normExpSig.exp + 1;
|
||||||
|
aSig = normExpSig.sig;
|
||||||
|
|
||||||
|
mul128By64To192(LN10_SIG_HI, LN10_SIG_LO, aSig, &zSig0, &zSig1, &zSig2);
|
||||||
|
if (0 < (int64_t) zSig0) {
|
||||||
|
shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
|
||||||
|
--aExp;
|
||||||
|
}
|
||||||
|
return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
|
||||||
|
}
|
||||||
|
|
||||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||||
|
|
||||||
|
const extFloat80_t base = i32_to_extF80(10);
|
||||||
|
extFloat80_t val = floatx80_posone;
|
||||||
|
float128_t x;
|
||||||
|
|
||||||
|
while (!(extF80_lt(a, floatx80_posone))) {
|
||||||
|
val = extF80_mul(val, base);
|
||||||
|
|
||||||
|
if (extF80_exp(val) == 0x7FFF) { // inf
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_sub(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (extF80_le(a, floatx80_negone)) {
|
||||||
|
val = extF80_div(val, base);
|
||||||
|
|
||||||
|
if (!extF80_exp(val)) { // subnormal
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = extF80_add(a, floatx80_posone);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret:
|
||||||
|
/* ******************************** */
|
||||||
|
/* using float128 for approximation */
|
||||||
|
/* ******************************** */
|
||||||
|
x = extF80_to_f128(a);
|
||||||
|
x = f128_mul(x, float128_ln10);
|
||||||
|
x = poly_exp(x);
|
||||||
|
|
||||||
|
val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
@ -11,6 +11,9 @@ extFloat80_t extFloat80_getman(extFloat80_t a);
|
|||||||
extFloat80_t extFloat80_fyl2x(extFloat80_t a, extFloat80_t b);
|
extFloat80_t extFloat80_fyl2x(extFloat80_t a, extFloat80_t b);
|
||||||
extFloat80_t extFloat80_fyl2xp1(extFloat80_t a, extFloat80_t b);
|
extFloat80_t extFloat80_fyl2xp1(extFloat80_t a, extFloat80_t b);
|
||||||
extFloat80_t extFloat80_2xm1(extFloat80_t a);
|
extFloat80_t extFloat80_2xm1(extFloat80_t a);
|
||||||
|
extFloat80_t extFloat80_etox(extFloat80_t a);
|
||||||
|
extFloat80_t extFloat80_2tox(extFloat80_t a);
|
||||||
|
extFloat80_t extFloat80_10tox(extFloat80_t a);
|
||||||
extFloat80_t extFloat80_lognp1(extFloat80_t a);
|
extFloat80_t extFloat80_lognp1(extFloat80_t a);
|
||||||
extFloat80_t extFloat80_logn(extFloat80_t a);
|
extFloat80_t extFloat80_logn(extFloat80_t a);
|
||||||
extFloat80_t extFloat80_log2(extFloat80_t a);
|
extFloat80_t extFloat80_log2(extFloat80_t a);
|
||||||
|
@ -1738,6 +1738,42 @@ void m68000_musashi_device::fpgen_rm_reg(u16 w2)
|
|||||||
m_icount -= 56;
|
m_icount -= 56;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0x08: // FETOXM1
|
||||||
|
{
|
||||||
|
m_fpr[dst] = extF80_sub(extFloat80_etox(source), i32_to_extF80(1));
|
||||||
|
set_condition_codes(m_fpr[dst]);
|
||||||
|
sync_exception_flags(source, dstCopy, EXC_ENB_UNDFLOW);
|
||||||
|
LOGMASKED(LOG_INSTRUCTIONS_VERBOSE, "FETOXM1: e ** %f - 1 = %f\n", fx80_to_double(source), fx80_to_double(m_fpr[dst]));
|
||||||
|
m_icount -= 568;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x10: // FETOX
|
||||||
|
{
|
||||||
|
m_fpr[dst] = extFloat80_etox(source);
|
||||||
|
set_condition_codes(m_fpr[dst]);
|
||||||
|
sync_exception_flags(source, dstCopy, EXC_ENB_UNDFLOW);
|
||||||
|
LOGMASKED(LOG_INSTRUCTIONS_VERBOSE, "FETOX: e ** %f = %f\n", fx80_to_double(source), fx80_to_double(m_fpr[dst]));
|
||||||
|
m_icount -= 520;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x11: // FTWOTOX
|
||||||
|
{
|
||||||
|
m_fpr[dst] = extFloat80_2tox(source);
|
||||||
|
set_condition_codes(m_fpr[dst]);
|
||||||
|
sync_exception_flags(source, dstCopy, EXC_ENB_UNDFLOW);
|
||||||
|
printf("FTWOTOX: 2 ** %f = %f\n", fx80_to_double(source), fx80_to_double(m_fpr[dst]));
|
||||||
|
m_icount -= 590;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x12: // FTENTOX
|
||||||
|
{
|
||||||
|
m_fpr[dst] = extFloat80_10tox(source);
|
||||||
|
set_condition_codes(m_fpr[dst]);
|
||||||
|
sync_exception_flags(source, dstCopy, EXC_ENB_UNDFLOW);
|
||||||
|
LOGMASKED(LOG_INSTRUCTIONS_VERBOSE, "FTENTOX: 10 ** %f = %f\n", fx80_to_double(source), fx80_to_double(m_fpr[dst]));
|
||||||
|
m_icount -= 590;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default: fatalerror("fpgen_rm_reg: unimplemented opmode %02X at %08X\n", opmode, m_ppc);
|
default: fatalerror("fpgen_rm_reg: unimplemented opmode %02X at %08X\n", opmode, m_ppc);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user