mirror of
https://github.com/azahar-emu/dynarmic
synced 2025-11-14 19:09:59 +01:00
emit_x64_floating_point: Deinterlace 64-bit FPToFixed signed/unsigned codepaths
This commit is contained in:
parent
442c01373a
commit
5fe274f510
@ -1500,32 +1500,45 @@ static void EmitFPToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
|||||||
if constexpr (isize == 64) {
|
if constexpr (isize == 64) {
|
||||||
Xbyak::Label saturate_max, end;
|
Xbyak::Label saturate_max, end;
|
||||||
|
|
||||||
if (unsigned_) {
|
if (!unsigned_) {
|
||||||
code.maxsd(src, code.MConst(xword, f64_min_u64));
|
code.movsd(scratch, code.MConst(xword, f64_max_s64_lim));
|
||||||
}
|
code.comisd(scratch, src);
|
||||||
code.movsd(scratch, code.MConst(xword, unsigned_ ? f64_max_u64_lim : f64_max_s64_lim));
|
code.jna(saturate_max, code.T_NEAR);
|
||||||
code.comisd(scratch, src);
|
code.cvttsd2si(result, src); // 64 bit gpr
|
||||||
code.jna(saturate_max, code.T_NEAR);
|
code.L(end);
|
||||||
if (unsigned_) {
|
|
||||||
|
code.SwitchToFarCode();
|
||||||
|
code.L(saturate_max);
|
||||||
|
code.mov(result, 0x7FFF'FFFF'FFFF'FFFF);
|
||||||
|
code.jmp(end, code.T_NEAR);
|
||||||
|
code.SwitchToNearCode();
|
||||||
|
} else {
|
||||||
Xbyak::Label below_max;
|
Xbyak::Label below_max;
|
||||||
|
|
||||||
|
code.maxsd(src, code.MConst(xword, f64_min_u64));
|
||||||
|
code.movsd(scratch, code.MConst(xword, f64_max_u64_lim));
|
||||||
|
code.comisd(scratch, src);
|
||||||
|
code.jna(saturate_max, code.T_NEAR);
|
||||||
|
|
||||||
code.movsd(scratch, code.MConst(xword, f64_max_s64_lim));
|
code.movsd(scratch, code.MConst(xword, f64_max_s64_lim));
|
||||||
code.comisd(src, scratch);
|
code.comisd(src, scratch);
|
||||||
code.jb(below_max);
|
code.jb(below_max);
|
||||||
|
|
||||||
code.subsd(src, scratch);
|
code.subsd(src, scratch);
|
||||||
code.cvttsd2si(result, src);
|
code.cvttsd2si(result, src);
|
||||||
code.btc(result, 63);
|
code.btc(result, 63);
|
||||||
code.jmp(end);
|
code.jmp(end);
|
||||||
code.L(below_max);
|
|
||||||
}
|
|
||||||
code.cvttsd2si(result, src); // 64 bit gpr
|
|
||||||
code.L(end);
|
|
||||||
|
|
||||||
code.SwitchToFarCode();
|
code.L(below_max);
|
||||||
code.L(saturate_max);
|
code.cvttsd2si(result, src); // 64 bit gpr
|
||||||
code.mov(result, unsigned_ ? 0xFFFF'FFFF'FFFF'FFFF : 0x7FFF'FFFF'FFFF'FFFF);
|
code.L(end);
|
||||||
code.jmp(end, code.T_NEAR);
|
|
||||||
code.SwitchToNearCode();
|
code.SwitchToFarCode();
|
||||||
|
code.L(saturate_max);
|
||||||
|
code.mov(result, 0xFFFF'FFFF'FFFF'FFFF);
|
||||||
|
code.jmp(end, code.T_NEAR);
|
||||||
|
code.SwitchToNearCode();
|
||||||
|
}
|
||||||
} else if constexpr (isize == 32) {
|
} else if constexpr (isize == 32) {
|
||||||
code.minsd(src, code.MConst(xword, unsigned_ ? f64_max_u32 : f64_max_s32));
|
code.minsd(src, code.MConst(xword, unsigned_ ? f64_max_u32 : f64_max_s32));
|
||||||
if (unsigned_) {
|
if (unsigned_) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user