mirror of
https://github.com/dingusdev/dingusppc.git
synced 2025-01-08 14:30:55 +00:00
ppcfpopcodes: fneg fix.
fneg inverts the sign bit regardless of nan status.
This commit is contained in:
parent
b38b1731a0
commit
d41287c320
@ -816,18 +816,11 @@ template <field_rc rec>
|
||||
void dppc_interpreter::ppc_fneg() {
|
||||
ppc_grab_regsfpdb(ppc_cur_instruction);
|
||||
|
||||
double ppc_dblresult64_d = -(GET_FPR(reg_b));
|
||||
uint64_t ppc_result64_d = FPR_INT(reg_b) ^ 0x8000000000000000U;
|
||||
|
||||
if (std::isnan(GET_FPR(reg_b))) {
|
||||
ppc_dblresult64_d = std::numeric_limits<double>::quiet_NaN();
|
||||
}
|
||||
|
||||
if (snan_single_check(reg_b)) {
|
||||
uint64_t qnan = 0x7FFC000000000000;
|
||||
ppc_store_fpresult_int(reg_d, qnan);
|
||||
} else {
|
||||
ppc_store_fpresult_flt(reg_d, ppc_dblresult64_d);
|
||||
}
|
||||
ppc_store_fpresult_int(reg_d, ppc_result64_d);
|
||||
|
||||
snan_single_check(reg_d);
|
||||
|
||||
if (rec)
|
||||
ppc_update_cr1();
|
||||
|
@ -150,9 +150,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
int reg_d = (opcode >> 21) & 31; \
|
||||
int reg_b = (opcode >> 11) & 31;
|
||||
|
||||
#define GET_FPR(reg) \
|
||||
#define GET_FPR(reg) \
|
||||
ppc_state.fpr[(reg)].dbl64_r
|
||||
|
||||
#define FPR_INT(reg)\
|
||||
ppc_state.fpr[reg].int64_r
|
||||
|
||||
#define ppc_grab_regsfpdiab(opcode) \
|
||||
int reg_d = (opcode >> 21) & 31; \
|
||||
int reg_a = (opcode >> 16) & 31; \
|
||||
|
Loading…
Reference in New Issue
Block a user