Advertisement
Guest User

Untitled

a guest
Feb 25th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. diff --git a/src/backend_x64/emit_x64.cpp b/src/backend_x64/emit_x64.cpp
  2. index 4e871ba..8e1bcab 100644
  3. --- a/src/backend_x64/emit_x64.cpp
  4. +++ b/src/backend_x64/emit_x64.cpp
  5. @@ -2369,24 +2369,33 @@ void EmitX64::EmitFPSub64(RegAlloc& reg_alloc, IR::Block& block, IR::Inst* inst)
  6.  
  7. static void SetFpscrNzcvFromFlags(BlockOfCode* code, RegAlloc& reg_alloc) {
  8. reg_alloc.ScratchGpr({HostLoc::RAX}); // lahf requires use of ah
  9. - Xbyak::Reg32 nzcv_imm = reg_alloc.ScratchGpr().cvt32();
  10. Xbyak::Reg32 nzcv = reg_alloc.ScratchGpr().cvt32();
  11. + Xbyak::Reg32 tmp = reg_alloc.ScratchGpr().cvt32();
  12.  
  13. using namespace Xbyak::util;
  14.  
  15. + code->mov(eax, 0);
  16. code->lahf();
  17. - code->mov(nzcv_imm, 0x30000000);
  18. - code->cmp(ah, 0b01000111);
  19. - code->cmove(nzcv, nzcv_imm);
  20. - code->mov(nzcv_imm, 0x20000000);
  21. - code->cmp(ah, 0b00000010);
  22. - code->cmove(nzcv, nzcv_imm);
  23. - code->mov(nzcv_imm, 0x80000000);
  24. - code->cmp(ah, 0b00000011);
  25. - code->cmove(nzcv, nzcv_imm);
  26. - code->mov(nzcv_imm, 0x60000000);
  27. - code->cmp(ah, 0b01000010);
  28. - code->cmove(nzcv, nzcv_imm);
  29. + // Value in AH | Value in NZCV | Class
  30. + // ---------------------------------------------
  31. + // 01000111 | 0011 | unordered
  32. + // 00000010 | 0010 | greater than
  33. + // 00000011 | 1000 | less than
  34. + // 01000010 | 0110 | equal
  35. + code->shr(eax, 8);
  36. + code->mov(nzcv, eax);
  37. + code->shl(nzcv, 31); // N bit
  38. + code->mov(tmp, nzcv);
  39. + code->shr(tmp, 2); // C bit
  40. + code->or_(nzcv, 0x20000000);
  41. + code->xor_(nzcv, tmp);
  42. + code->mov(tmp, eax);
  43. + code->shl(tmp, 16);
  44. + code->and_(tmp, 0x40000000); // Z bit
  45. + code->or_(nzcv, tmp);
  46. + code->test(eax, 0b100); // test if unordered
  47. + code->mov(tmp, 0x30000000);
  48. + code->cmovnz(nzcv, tmp);
  49. code->mov(dword[r15 + offsetof(JitState, FPSCR_nzcv)], nzcv);
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement