mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-02 08:53:42 +00:00
- fix misc integer opcodes and remove mov statements when they have no effect
This commit is contained in:
parent
5fab45d275
commit
981950fef0
1 changed files with 58 additions and 29 deletions
|
@ -1448,13 +1448,15 @@ private:
|
||||||
void EmitSLL_RR()
|
void EmitSLL_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.shl(regD[A], rc);
|
cc.shl(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSLL_RI()
|
void EmitSLL_RI()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.shl(regD[A], C);
|
cc.shl(regD[A], C);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1468,13 +1470,15 @@ private:
|
||||||
void EmitSRL_RR()
|
void EmitSRL_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.shr(regD[A], rc);
|
cc.shr(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSRL_RI()
|
void EmitSRL_RI()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.shr(regD[A], C);
|
cc.shr(regD[A], C);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1488,13 +1492,15 @@ private:
|
||||||
void EmitSRA_RR()
|
void EmitSRA_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.sar(regD[A], rc);
|
cc.sar(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSRA_RI()
|
void EmitSRA_RI()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.sar(regD[A], C);
|
cc.sar(regD[A], C);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1508,32 +1514,37 @@ private:
|
||||||
void EmitADD_RR()
|
void EmitADD_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], konstd[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.add(regD[A], rc);
|
cc.add(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitADD_RK()
|
void EmitADD_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], konstd[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.add(regD[A], konstd[C]);
|
cc.add(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitADDI()
|
void EmitADDI()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], konstd[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.add(regD[A], Cs);
|
cc.add(regD[A], Cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSUB_RR()
|
void EmitSUB_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.sub(regD[A], rc);
|
cc.sub(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSUB_RK()
|
void EmitSUB_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], konstd[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.sub(regD[A], konstd[C]);
|
cc.sub(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1547,13 +1558,15 @@ private:
|
||||||
void EmitMUL_RR()
|
void EmitMUL_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.imul(regD[A], rc);
|
cc.imul(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitMUL_RK()
|
void EmitMUL_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.imul(regD[A], konstd[C]);
|
cc.imul(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1768,39 +1781,45 @@ private:
|
||||||
void EmitAND_RR()
|
void EmitAND_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.and_(regD[A], rc);
|
cc.and_(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitAND_RK()
|
void EmitAND_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.and_(regD[A], konstd[C]);
|
cc.and_(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitOR_RR()
|
void EmitOR_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.or_(regD[A], rc);
|
cc.or_(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitOR_RK()
|
void EmitOR_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.or_(regD[A], konstd[C]);
|
cc.or_(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitXOR_RR()
|
void EmitXOR_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegD(C, A);
|
auto rc = CheckRegD(C, A);
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.xor_(regD[A], rc);
|
cc.xor_(regD[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitXOR_RK()
|
void EmitXOR_RK()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.xor_(regD[A], konstd[C]);
|
cc.xor_(regD[A], konstd[C]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1868,7 +1887,8 @@ private:
|
||||||
|
|
||||||
void EmitNOT()
|
void EmitNOT()
|
||||||
{
|
{
|
||||||
cc.mov(regD[A], regD[B]);
|
if (A != B)
|
||||||
|
cc.mov(regD[A], regD[B]);
|
||||||
cc.not_(regD[A]);
|
cc.not_(regD[A]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2011,14 +2031,16 @@ private:
|
||||||
void EmitADDF_RR()
|
void EmitADDF_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegF(C, A);
|
auto rc = CheckRegF(C, A);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.addsd(regF[A], rc);
|
cc.addsd(regF[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitADDF_RK()
|
void EmitADDF_RK()
|
||||||
{
|
{
|
||||||
auto tmp = cc.newIntPtr();
|
auto tmp = cc.newIntPtr();
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
||||||
cc.addsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
cc.addsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
||||||
}
|
}
|
||||||
|
@ -2026,14 +2048,16 @@ private:
|
||||||
void EmitSUBF_RR()
|
void EmitSUBF_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegF(C, A);
|
auto rc = CheckRegF(C, A);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.subsd(regF[A], rc);
|
cc.subsd(regF[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitSUBF_RK()
|
void EmitSUBF_RK()
|
||||||
{
|
{
|
||||||
auto tmp = cc.newIntPtr();
|
auto tmp = cc.newIntPtr();
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
||||||
cc.subsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
cc.subsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
||||||
}
|
}
|
||||||
|
@ -2050,14 +2074,16 @@ private:
|
||||||
void EmitMULF_RR()
|
void EmitMULF_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegF(C, A);
|
auto rc = CheckRegF(C, A);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.mulsd(regF[A], rc);
|
cc.mulsd(regF[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitMULF_RK()
|
void EmitMULF_RK()
|
||||||
{
|
{
|
||||||
auto tmp = cc.newIntPtr();
|
auto tmp = cc.newIntPtr();
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
cc.mov(tmp, ToMemAddress(&konstf[C]));
|
||||||
cc.mulsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
cc.mulsd(regF[A], asmjit::x86::qword_ptr(tmp));
|
||||||
}
|
}
|
||||||
|
@ -2205,7 +2231,8 @@ private:
|
||||||
void EmitMINF_RR()
|
void EmitMINF_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegF(C, A);
|
auto rc = CheckRegF(C, A);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.minsd(regF[A], rc);
|
cc.minsd(regF[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2221,7 +2248,8 @@ private:
|
||||||
void EmitMAXF_RR()
|
void EmitMAXF_RR()
|
||||||
{
|
{
|
||||||
auto rc = CheckRegF(C, A);
|
auto rc = CheckRegF(C, A);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.maxsd(regF[A], rc);
|
cc.maxsd(regF[A], rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2256,7 +2284,8 @@ private:
|
||||||
auto mask = cc.newDoubleConst(asmjit::kConstScopeLocal, -0.0);
|
auto mask = cc.newDoubleConst(asmjit::kConstScopeLocal, -0.0);
|
||||||
auto maskXmm = cc.newXmmSd();
|
auto maskXmm = cc.newXmmSd();
|
||||||
cc.movsd(maskXmm, mask);
|
cc.movsd(maskXmm, mask);
|
||||||
cc.movsd(regF[A], regF[B]);
|
if (A != B)
|
||||||
|
cc.movsd(regF[A], regF[B]);
|
||||||
cc.xorpd(regF[A], maskXmm);
|
cc.xorpd(regF[A], maskXmm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue