Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/backend_x64/emit_x64.cpp b/src/backend_x64/emit_x64.cpp
- index 4e871ba..8e1bcab 100644
- --- a/src/backend_x64/emit_x64.cpp
- +++ b/src/backend_x64/emit_x64.cpp
- @@ -2369,24 +2369,33 @@ void EmitX64::EmitFPSub64(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst)
- static void SetFpscrNzcvFromFlags(BlockOfCode* code, RegAlloc& reg_alloc) {
- reg_alloc.ScratchGpr({HostLoc::RAX}); // lahf requires use of ah
- - Xbyak::Reg32 nzcv_imm = reg_alloc.ScratchGpr().cvt32();
- Xbyak::Reg32 nzcv = reg_alloc.ScratchGpr().cvt32();
- + Xbyak::Reg32 tmp = reg_alloc.ScratchGpr().cvt32();
- using namespace Xbyak::util;
- + code->mov(eax, 0);
- code->lahf();
- - code->mov(nzcv_imm, 0x30000000);
- - code->cmp(ah, 0b01000111);
- - code->cmove(nzcv, nzcv_imm);
- - code->mov(nzcv_imm, 0x20000000);
- - code->cmp(ah, 0b00000010);
- - code->cmove(nzcv, nzcv_imm);
- - code->mov(nzcv_imm, 0x80000000);
- - code->cmp(ah, 0b00000011);
- - code->cmove(nzcv, nzcv_imm);
- - code->mov(nzcv_imm, 0x60000000);
- - code->cmp(ah, 0b01000010);
- - code->cmove(nzcv, nzcv_imm);
- + // Value in AH | Value in NZCV | Class
- + // ---------------------------------------------
- + // 01000111 | 0011 | unordered
- + // 00000010 | 0010 | greater than
- + // 00000011 | 1000 | less than
- + // 01000010 | 0110 | equal
- + code->shr(eax, 8);
- + code->mov(nzcv, eax);
- + code->shl(nzcv, 31); // N bit
- + code->mov(tmp, nzcv);
- + code->shr(tmp, 2); // C bit
- + code->or_(nzcv, 0x20000000);
- + code->xor_(nzcv, tmp);
- + code->mov(tmp, eax);
- + code->shl(tmp, 16);
- + code->and_(tmp, 0x40000000); // Z bit
- + code->or_(nzcv, tmp);
- + code->test(eax, 0b100); // test if unordered
- + code->mov(tmp, 0x30000000);
- + code->cmovnz(nzcv, tmp);
- code->mov(dword[r15 + offsetof(JitState, FPSCR_nzcv)], nzcv);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement