Tests: Handle integer floating point numbers

This commit is contained in:
Dr. Chat 2017-03-06 01:04:59 -06:00
parent 31766eaf8d
commit d8ed251ad1
2 changed files with 35 additions and 5 deletions

View File

@ -171,6 +171,19 @@ static inline vec128_t vec128i(uint32_t x, uint32_t y, uint32_t z, uint32_t w) {
v.u32[3] = w; v.u32[3] = w;
return v; return v;
} }
static inline vec128_t vec128q(uint64_t src) {
vec128_t v;
for (auto i = 0; i < 2; ++i) {
v.i64[i] = src;
}
return v;
}
static inline vec128_t vec128q(uint64_t x, uint64_t y) {
vec128_t v;
v.i64[0] = x;
v.i64[1] = y;
return v;
}
static inline vec128_t vec128d(double src) { static inline vec128_t vec128d(double src) {
vec128_t v; vec128_t v;
for (auto i = 0; i < 2; ++i) { for (auto i = 0; i < 2; ++i) {

View File

@ -147,12 +147,29 @@ bool PPCContext::CompareRegWithString(const char* name, const char* value,
} }
return true; return true;
} else if (sscanf(name, "f%d", &n) == 1) { } else if (sscanf(name, "f%d", &n) == 1) {
if (std::strstr(value, "0x")) {
// Special case: Treat float as integer.
uint64_t expected = string_util::from_string<uint64_t>(value, true);
union {
double f;
uint64_t u;
} f2u;
f2u.f = this->f[n];
if (f2u.u != expected) {
std::snprintf(out_value, out_value_size, "%016" PRIX64, f2u.u);
return false;
}
} else {
double expected = string_util::from_string<double>(value); double expected = string_util::from_string<double>(value);
// TODO(benvanik): epsilon // TODO(benvanik): epsilon
if (this->f[n] != expected) { if (this->f[n] != expected) {
std::snprintf(out_value, out_value_size, "%f", this->f[n]); std::snprintf(out_value, out_value_size, "%f", this->f[n]);
return false; return false;
} }
}
return true; return true;
} else if (sscanf(name, "v%d", &n) == 1) { } else if (sscanf(name, "v%d", &n) == 1) {
vec128_t expected = string_util::from_string<vec128_t>(value); vec128_t expected = string_util::from_string<vec128_t>(value);