diff options
| author | LDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com> | 2020-08-08 17:18:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-08 17:18:51 +0200 |
| commit | e36e97c64d7b973fbbc3ac92e9f115d74a4d9e2d (patch) | |
| tree | 80bdb45273e6bbc0d862276bdb6f6551b0a2541d /ARMeilleure/Instructions/InstEmitSimdCmp32.cs | |
| parent | 8d59ad88b4d59ef6ad26b9a747dc871fd1f1007a (diff) | |
CPU: This PR fixes Fpscr, among other things. (#1433)
* CPU: This PR fixes Fpscr, among other things.
* Add Fpscr.Qc = 1 if sat. for Vqrshrn & Vqrshrun.
* Fix Vcmp & Vcmpe opcode table.
* Revert "Fix Vcmp & Vcmpe opcode table."
This reverts commit c117d9410d693185ff5f8ee8e457ffbfb2027dd5.
* Address PR feedbacks.
Diffstat (limited to 'ARMeilleure/Instructions/InstEmitSimdCmp32.cs')
| -rw-r--r-- | ARMeilleure/Instructions/InstEmitSimdCmp32.cs | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/ARMeilleure/Instructions/InstEmitSimdCmp32.cs b/ARMeilleure/Instructions/InstEmitSimdCmp32.cs index db925053..290cc17e 100644 --- a/ARMeilleure/Instructions/InstEmitSimdCmp32.cs +++ b/ARMeilleure/Instructions/InstEmitSimdCmp32.cs @@ -307,7 +307,10 @@ namespace ARMeilleure.Instructions Operand zf = context.AddIntrinsicInt(Intrinsic.X86Comisseq, n, m); Operand nf = context.AddIntrinsicInt(Intrinsic.X86Comisslt, n, m); - EmitSetFPSCRFlags(context, nf, zf, cf, Const(0)); + SetFpFlag(context, FPState.VFlag, Const(0)); + SetFpFlag(context, FPState.CFlag, cf); + SetFpFlag(context, FPState.ZFlag, zf); + SetFpFlag(context, FPState.NFlag, nf); } else { @@ -321,14 +324,20 @@ namespace ARMeilleure.Instructions Operand zf = context.AddIntrinsicInt(Intrinsic.X86Comisdeq, n, m); Operand nf = context.AddIntrinsicInt(Intrinsic.X86Comisdlt, n, m); - EmitSetFPSCRFlags(context, nf, zf, cf, Const(0)); + SetFpFlag(context, FPState.VFlag, Const(0)); + SetFpFlag(context, FPState.CFlag, cf); + SetFpFlag(context, FPState.ZFlag, zf); + SetFpFlag(context, FPState.NFlag, nf); } context.Branch(lblEnd); context.MarkLabel(lblNaN); - EmitSetFPSCRFlags(context, Const(3)); + SetFpFlag(context, FPState.VFlag, Const(1)); + SetFpFlag(context, FPState.CFlag, Const(1)); + SetFpFlag(context, FPState.ZFlag, Const(0)); + SetFpFlag(context, FPState.NFlag, Const(0)); context.MarkLabel(lblEnd); } @@ -354,11 +363,11 @@ namespace ARMeilleure.Instructions Operand nzcv = context.Call(info, ne, me, Const(signalNaNs)); - EmitSetFPSCRFlags(context, nzcv); + EmitSetFpscrNzcv(context, nzcv); } } - private static void EmitSetFPSCRFlags(ArmEmitterContext context, Operand nzcv) + private static void EmitSetFpscrNzcv(ArmEmitterContext context, Operand nzcv) { Operand Extract(Operand value, int bit) { @@ -378,14 +387,6 @@ namespace ARMeilleure.Instructions SetFpFlag(context, FPState.NFlag, Extract(nzcv, 3)); } - private static void EmitSetFPSCRFlags(ArmEmitterContext context, Operand n, Operand z, Operand c, Operand v) - { - SetFpFlag(context, FPState.VFlag, v); - SetFpFlag(context, FPState.CFlag, c); - SetFpFlag(context, FPState.ZFlag, z); - SetFpFlag(context, FPState.NFlag, n); - } - private static void EmitSse2OrAvxCmpOpF32(ArmEmitterContext context, CmpCondition cond, bool zero) { OpCode32Simd op = (OpCode32Simd)context.CurrOp; |
