ppctests: fix test cases with SNaN/QNaN operands.

This commit is contained in:
Maxim Poliakovski 2023-11-30 17:43:12 +01:00
parent 8c3dfe94c7
commit a1d8f8aa4e
4 changed files with 741 additions and 735 deletions

View File

@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-21 divingkatae and maximum
Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)

View File

@ -28,7 +28,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <cinttypes>
#include <cmath>
#include <cfloat>
#include <limits>
// Used for FP calcs
uint64_t ppc_result64_b;
@ -36,9 +35,6 @@ uint64_t ppc_result64_d;
double ppc_dblresult64_d;
double snan = std::numeric_limits<double>::signaling_NaN();
double qnan = std::numeric_limits<double>::quiet_NaN();
// Storage and register retrieval functions for the floating point functions.
#define GET_FPR(reg) ppc_state.fpr[(reg)].dbl64_r

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-21 divingkatae and maximum
Copyright (C) 2018-23 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@ -26,14 +26,15 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
#include <fstream>
#include <iomanip>
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int ntested; /* number of tested instructions */
int nfailed; /* number of failed instructions */
int ntested; // number of tested instructions
int nfailed; // number of failed instructions
void xer_ov_test(string mnem, uint32_t opcode) {
ppc_state.gpr[3] = 2;
@ -165,6 +166,15 @@ static void read_test_data() {
}
}
double double_from_string(string str) {
if (str == "snan")
return std::numeric_limits<double>::signaling_NaN();
else if (str == "qnan")
return std::numeric_limits<double>::quiet_NaN();
else
return stod(str, NULL);
}
static void read_test_float_data() {
string line, token;
int i, lineno;
@ -222,11 +232,11 @@ static void read_test_float_data() {
if (tokens[i].rfind("frD=", 0) == 0) {
dest_64 = stoull(tokens[i].substr(4), NULL, 16);
} else if (tokens[i].rfind("frA=", 0) == 0) {
dfp_src1 = stod(tokens[i].substr(4), NULL);
dfp_src1 = double_from_string(tokens[i].substr(4));
} else if (tokens[i].rfind("frB=", 0) == 0) {
dfp_src2 = stod(tokens[i].substr(4), NULL);
dfp_src2 = double_from_string(tokens[i].substr(4));
} else if (tokens[i].rfind("frC=", 0) == 0) {
dfp_src3 = stod(tokens[i].substr(4), NULL);
dfp_src3 = double_from_string(tokens[i].substr(4));
} else if (tokens[i].rfind("round=", 0) == 0) {
rounding_mode = tokens[i].substr(6, 3);
} else if (tokens[i].rfind("FPSCR=", 0) == 0) {