Update AInstEmitSimdHelper.cs

This commit is contained in:
LDj3SNuD 2018-08-02 20:46:04 +02:00 committed by GitHub
commit 2a043101aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1129,74 +1129,24 @@ namespace ChocolArm64.Instruction
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
AILLabel LblFalse = new AILLabel();
EmitVectorExtract(Context, Op.Rn, Index, 3, Signed); EmitVectorExtract(Context, Op.Rn, Index, 3, Signed);
Context.Emit(OpCodes.Dup);
EmitVectorExtract(Context, Op.Rm, Index, 3, Signed); EmitVectorExtract(Context, Op.Rm, Index, 3, Signed);
ASoftFallback.EmitCall(Context, Signed
? nameof(ASoftFallback.BinarySignedSatQAdd_Sat)
: nameof(ASoftFallback.BinaryUnsignedSatQAdd_Sat));
Context.Emit(OpCodes.Add); Context.Emit(OpCodes.Brfalse_S, LblFalse);
EmitSetSaturatedFlag(Context);
Context.MarkLabel(LblFalse);
if (Signed) EmitVectorExtract(Context, Op.Rm, Index, 3, Signed);
{ ASoftFallback.EmitCall(Context, Signed
long TMaxValue = long.MaxValue; ? nameof(ASoftFallback.BinarySignedSatQAdd_Res)
long TMinValue = long.MinValue; : nameof(ASoftFallback.BinaryUnsignedSatQAdd_Res));
AILLabel LblGeEnd = new AILLabel();
AILLabel LblGe = new AILLabel();
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
EmitVectorExtractSx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Xor);
Context.Emit(OpCodes.Not);
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Dup);
EmitVectorExtractSx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Add);
Context.Emit(OpCodes.Xor);
Context.Emit(OpCodes.And);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Bge_S, LblGeEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Bge_S, LblGe);
Context.EmitLdc_I8(TMinValue);
Context.Emit(OpCodes.Br_S, LblGeEnd);
Context.MarkLabel(LblGe);
Context.EmitLdc_I8(TMaxValue);
Context.MarkLabel(LblGeEnd);
}
else
{
long TMaxValue = ~0L; // ulong.MaxValue
AILLabel LblGeEnd = new AILLabel();
Context.Emit(OpCodes.Dup);
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Bge_Un_S, LblGeEnd);
Context.Emit(OpCodes.Dup);
EmitVectorExtractZx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Bge_Un_S, LblGeEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMaxValue);
Context.MarkLabel(LblGeEnd);
}
} }
// TSrcs (64bit) == TDst (64bit); signed, unsigned. // TSrcs (64bit) == TDst (64bit); signed, unsigned.
@ -1209,69 +1159,24 @@ namespace ChocolArm64.Instruction
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
AILLabel LblFalse = new AILLabel();
EmitVectorExtract(Context, Op.Rn, Index, 3, Signed); EmitVectorExtract(Context, Op.Rn, Index, 3, Signed);
Context.Emit(OpCodes.Dup);
EmitVectorExtract(Context, Op.Rm, Index, 3, Signed); EmitVectorExtract(Context, Op.Rm, Index, 3, Signed);
ASoftFallback.EmitCall(Context, Signed
? nameof(ASoftFallback.BinarySignedSatQSub_Sat)
: nameof(ASoftFallback.BinaryUnsignedSatQSub_Sat));
Context.Emit(OpCodes.Sub); Context.Emit(OpCodes.Brfalse_S, LblFalse);
EmitSetSaturatedFlag(Context);
Context.MarkLabel(LblFalse);
if (Signed) EmitVectorExtract(Context, Op.Rm, Index, 3, Signed);
{ ASoftFallback.EmitCall(Context, Signed
long TMaxValue = long.MaxValue; ? nameof(ASoftFallback.BinarySignedSatQSub_Res)
long TMinValue = long.MinValue; : nameof(ASoftFallback.BinaryUnsignedSatQSub_Res));
AILLabel LblGeEnd = new AILLabel();
AILLabel LblGe = new AILLabel();
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
EmitVectorExtractSx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Xor);
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Dup);
EmitVectorExtractSx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Sub);
Context.Emit(OpCodes.Xor);
Context.Emit(OpCodes.And);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Bge_S, LblGeEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Bge_S, LblGe);
Context.EmitLdc_I8(TMinValue);
Context.Emit(OpCodes.Br_S, LblGeEnd);
Context.MarkLabel(LblGe);
Context.EmitLdc_I8(TMaxValue);
Context.MarkLabel(LblGeEnd);
}
else
{
long TMinValue = 0L; // ulong.MinValue
AILLabel LblTrue = new AILLabel();
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
EmitVectorExtractZx(Context, Op.Rm, Index, 3);
Context.Emit(OpCodes.Bge_Un_S, LblTrue);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMinValue);
Context.MarkLabel(LblTrue);
}
} }
// TSrcs (64bit) == TDst (64bit); signed, unsigned. // TSrcs (64bit) == TDst (64bit); signed, unsigned.
@ -1284,148 +1189,24 @@ namespace ChocolArm64.Instruction
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
if (Signed) AILLabel LblFalse = new AILLabel();
{
long TMaxValue = long.MaxValue;
AILLabel LblGt = new AILLabel(); EmitVectorExtract(Context, Op.Rn, Index, 3, !Signed);
AILLabel LblLt = new AILLabel(); Context.Emit(OpCodes.Dup);
AILLabel LblEnd = new AILLabel();
EmitVectorExtractZx(Context, Op.Rn, Index, 3); EmitVectorExtract(Context, Op.Rd, Index, 3, Signed);
Context.EmitLdc_I8(long.MaxValue); ASoftFallback.EmitCall(Context, Signed
Context.Emit(OpCodes.Bgt_Un_S, LblGt); ? nameof(ASoftFallback.BinarySignedSatQAcc_Sat)
: nameof(ASoftFallback.BinaryUnsignedSatQAcc_Sat));
// op1 from ulong.MinValue to (ulong)long.MaxValue Context.Emit(OpCodes.Brfalse_S, LblFalse);
// op2 from long.MinValue to long.MaxValue EmitSetSaturatedFlag(Context);
Context.MarkLabel(LblFalse);
EmitVectorExtractSx(Context, Op.Rn, Index, 3); EmitVectorExtract(Context, Op.Rd, Index, 3, Signed);
EmitVectorExtractSx(Context, Op.Rd, Index, 3); ASoftFallback.EmitCall(Context, Signed
Context.Emit(OpCodes.Add); ? nameof(ASoftFallback.BinarySignedSatQAcc_Res)
: nameof(ASoftFallback.BinaryUnsignedSatQAcc_Res));
Context.Emit(OpCodes.Dup);
EmitVectorExtractSx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Not);
Context.Emit(OpCodes.And);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Bge_S, LblEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMaxValue);
Context.Emit(OpCodes.Br_S, LblEnd);
Context.MarkLabel(LblGt);
// op1 from (ulong)long.MaxValue + 1UL to ulong.MaxValue
// op2 from (long)ulong.MinValue to long.MaxValue
EmitVectorExtractSx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Blt_S, LblLt);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMaxValue);
Context.Emit(OpCodes.Br_S, LblEnd);
Context.MarkLabel(LblLt);
// op1 from (ulong)long.MaxValue + 1UL to ulong.MaxValue
// op2 from long.MinValue to (long)ulong.MinValue - 1L
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
EmitVectorExtractSx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Add);
Context.Emit(OpCodes.Dup);
Context.EmitLdc_I8(TMaxValue);
Context.Emit(OpCodes.Ble_Un_S, LblEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMaxValue);
Context.MarkLabel(LblEnd);
}
else
{
long TMaxValue = ~0L; // ulong.MaxValue
long TMinValue = 0L; // ulong.MinValue
AILLabel LblLt = new AILLabel();
AILLabel LblLe = new AILLabel();
AILLabel LblEnd = new AILLabel();
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Ldc_I4_0);
Context.Emit(OpCodes.Blt_S, LblLt);
// op1 from (long)ulong.MinValue to long.MaxValue
// op2 from ulong.MinValue to ulong.MaxValue
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
EmitVectorExtractZx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Add);
Context.Emit(OpCodes.Dup);
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
Context.Emit(OpCodes.Bge_Un_S, LblEnd);
Context.Emit(OpCodes.Dup);
EmitVectorExtractZx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Bge_Un_S, LblEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMaxValue);
Context.Emit(OpCodes.Br_S, LblEnd);
Context.MarkLabel(LblLt);
// op1 from long.MinValue to (long)ulong.MinValue - 1L
// op2 from (ulong)long.MaxValue + 1UL to ulong.MaxValue
EmitVectorExtractZx(Context, Op.Rd, Index, 3);
Context.EmitLdc_I8(long.MaxValue);
Context.Emit(OpCodes.Ble_Un_S, LblLe);
EmitVectorExtractZx(Context, Op.Rn, Index, 3);
EmitVectorExtractZx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Add);
Context.Emit(OpCodes.Br_S, LblEnd);
Context.MarkLabel(LblLe);
// op1 from long.MinValue to (long)ulong.MinValue - 1L
// op2 from ulong.MinValue to (ulong)long.MaxValue
EmitVectorExtractSx(Context, Op.Rn, Index, 3);
EmitVectorExtractSx(Context, Op.Rd, Index, 3);
Context.Emit(OpCodes.Add);
Context.Emit(OpCodes.Dup);
Context.EmitLdc_I8(TMinValue);
Context.Emit(OpCodes.Bge_S, LblEnd);
Context.Emit(OpCodes.Pop);
EmitSetSaturatedFlag(Context);
Context.EmitLdc_I8(TMinValue);
Context.MarkLabel(LblEnd);
}
} }
public static void EmitResetSaturatedFlag(AILEmitterCtx Context) public static void EmitResetSaturatedFlag(AILEmitterCtx Context)