Implement float comparison instruction.

This commit is contained in:
Skyth 2024-09-13 15:26:03 +03:00
parent e78e5b7534
commit 996fa013d0
2 changed files with 15 additions and 1 deletions

View File

@ -341,6 +341,7 @@ int main()
break; break;
case PPC_INST_FCMPU: case PPC_INST_FCMPU:
std::println(f, "\tctx.cr{}.compare(ctx.f{}.f64, ctx.f{}.f64);", insn.operands[0], insn.operands[1], insn.operands[2]);
break; break;
case PPC_INST_FCTID: case PPC_INST_FCTID:

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <cstdlib> #include <cstdlib>
#include <cmath>
#ifdef __clang__ #ifdef __clang__
#include <x86intrin.h> #include <x86intrin.h>
@ -53,7 +54,11 @@ struct PPCCRRegister
uint8_t lt; uint8_t lt;
uint8_t gt; uint8_t gt;
uint8_t eq; uint8_t eq;
union
{
uint8_t so; uint8_t so;
uint8_t un;
};
template<typename T> template<typename T>
void compare(T left, T right, const PPCXERRegister& xer) void compare(T left, T right, const PPCXERRegister& xer)
@ -63,6 +68,14 @@ struct PPCCRRegister
eq = left == right; eq = left == right;
so = xer.so; so = xer.so;
} }
void compare(double left, double right)
{
lt = left < right;
gt = left > right;
eq = left == right;
un = isnan(left) || isnan(right);
}
}; };
typedef float float128[4]; typedef float float128[4];