mirror of
https://github.com/libretro/ppsspp.git
synced 2025-02-01 14:24:02 +00:00
JIT x86: cvt.s.w
This commit is contained in:
parent
8749ad0cb9
commit
377c94b125
@ -1292,6 +1292,8 @@ void XEmitter::CVTDQ2PS(X64Reg regOp, OpArg arg) {WriteSSEOp(32, 0x5B, true, reg
|
||||
void XEmitter::CVTPD2DQ(X64Reg regOp, OpArg arg) {WriteSSEOp(64, 0xE6, false, regOp, arg);}
|
||||
void XEmitter::CVTPS2DQ(X64Reg regOp, OpArg arg) {WriteSSEOp(64, 0x5B, true, regOp, arg);}
|
||||
|
||||
void XEmitter::CVTSI2SS(X64Reg xregdest, OpArg arg) {WriteSSEOp(32, 0x2A, false, xregdest, arg);}
|
||||
void XEmitter::CVTSS2SI(X64Reg xregdest, OpArg arg) {WriteSSEOp(32, 0x2D, false, xregdest, arg);}
|
||||
void XEmitter::CVTTSS2SI(X64Reg xregdest, OpArg arg) {WriteSSEOp(32, 0x2C, false, xregdest, arg);}
|
||||
void XEmitter::CVTTPS2DQ(X64Reg xregdest, OpArg arg) {WriteSSEOp(32, 0x5B, false, xregdest, arg);}
|
||||
|
||||
|
@ -564,6 +564,8 @@ public:
|
||||
void CVTDQ2PS(X64Reg regOp, OpArg arg);
|
||||
void CVTPS2DQ(X64Reg regOp, OpArg arg);
|
||||
|
||||
void CVTSI2SS(X64Reg xregdest, OpArg arg); // Yeah, destination really is a GPR like EAX!
|
||||
void CVTSS2SI(X64Reg xregdest, OpArg arg); // Yeah, destination really is a GPR like EAX!
|
||||
void CVTTSS2SI(X64Reg xregdest, OpArg arg); // Yeah, destination really is a GPR like EAX!
|
||||
void CVTTPS2DQ(X64Reg regOp, OpArg arg);
|
||||
|
||||
|
@ -266,10 +266,10 @@ const MIPSInstruction tableSpecial2[64] =
|
||||
//24
|
||||
{-2}, {-2}, {-2}, {-2}, {-2}, {-2}, {-2}, {-2},
|
||||
//32
|
||||
INSTR("cvt.s.w", &Jit::Comp_Generic, Dis_FPU2op, Int_FPU2op, 0),
|
||||
INSTR("cvt.s.w", &Jit::Comp_FPU2op, Dis_FPU2op, Int_FPU2op, 0),
|
||||
{-2}, {-2}, {-2},
|
||||
//36
|
||||
INSTR("cvt.w.s", &Jit::Comp_Generic, Dis_FPU2op, Int_FPU2op, 0),
|
||||
INSTR("cvt.w.s", &Jit::Comp_FPU2op, Dis_FPU2op, Int_FPU2op, 0),
|
||||
{-2},
|
||||
INSTR("dis.int", &Jit::Comp_Generic, Dis_Generic, Int_Interrupt, 0),
|
||||
{-2},
|
||||
|
@ -181,15 +181,12 @@ void Jit::Comp_FPU2op(u32 op)
|
||||
fpr.ReleaseSpillLocks();
|
||||
break;
|
||||
|
||||
case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s
|
||||
|
||||
case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt
|
||||
/* fpr.Lock(fd, fs); // this probably works, just badly tested
|
||||
fpr.SpillLock(fd, fs); // this probably works, just badly tested
|
||||
fpr.BindToRegister(fd, fd == fs, true);
|
||||
SQRTSS(fpr.RX(fd), fpr.R(fs));
|
||||
fpr.UnlockAll();
|
||||
break;*/
|
||||
Comp_Generic(op);
|
||||
fpr.ReleaseSpillLocks();
|
||||
return;
|
||||
|
||||
case 13: //FsI(fd) = F(fs)>=0 ? (int)floorf(F(fs)) : (int)ceilf(F(fs)); break;//trunc.w.s
|
||||
@ -200,9 +197,15 @@ void Jit::Comp_FPU2op(u32 op)
|
||||
fpr.ReleaseSpillLocks();
|
||||
break;
|
||||
|
||||
case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w
|
||||
fpr.StoreFromRegister(fs);
|
||||
CVTSI2SS(XMM0, fpr.R(fs));
|
||||
MOVSS(fpr.R(fd), XMM0);
|
||||
break;
|
||||
|
||||
case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s
|
||||
case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s
|
||||
case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s
|
||||
case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w
|
||||
case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s
|
||||
default:
|
||||
Comp_Generic(op);
|
||||
|
Loading…
x
Reference in New Issue
Block a user