Update AInstEmitSimdArithmetic.cs

This commit is contained in:
LDj3SNuD 2018-04-29 12:38:05 +02:00 committed by GitHub
commit d7664f8f40
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -215,53 +215,50 @@ namespace ChocolArm64.Instruction
int TMaxValue = (Signed ? (1 << (ESize - 1)) - 1 : (int)((1L << ESize) - 1L)); int TMaxValue = (Signed ? (1 << (ESize - 1)) - 1 : (int)((1L << ESize) - 1L));
int TMinValue = (Signed ? -((1 << (ESize - 1))) : 0); int TMinValue = (Signed ? -((1 << (ESize - 1))) : 0);
int Part = !Scalar & (Op.RegisterSize == ARegisterSize.SIMD128) ? Elems : 0; int Part = (!Scalar & (Op.RegisterSize == ARegisterSize.SIMD128) ? Elems : 0);
Context.Emit(OpCodes.Ldc_I4_0);
Context.EmitStint(2); // Sat.
for (int Index = 0; Index < Elems; Index++) for (int Index = 0; Index < Elems; Index++)
{ {
AILLabel Lbl1 = new AILLabel(); AILLabel LblLe = new AILLabel();
AILLabel Lbl2 = new AILLabel(); AILLabel LblGeEnd = new AILLabel();
AILLabel Lbl3 = new AILLabel();
EmitVectorExtract(Context, Op.Rn, Index, Op.Size + 1, Signed); EmitVectorExtract(Context, Op.Rn, Index, Op.Size + 1, Signed);
Context.EmitStint(0); // In.
Context.EmitLdint(0); // In. Context.Emit(OpCodes.Dup);
Context.EmitLdc_I4(TMaxValue); Context.EmitLdc_I4(TMaxValue);
Context.Emit(OpCodes.Conv_U8); Context.Emit(OpCodes.Conv_U8);
Context.Emit(Signed ? OpCodes.Ble_S : OpCodes.Ble_Un_S, Lbl1);
Context.EmitLdc_I4(TMaxValue);
Context.EmitStint(1); // Out.
Context.EmitLdc_I4(0x8000000);
Context.EmitStint(2); // Sat.
Context.Emit(OpCodes.Br_S, Lbl3);
Context.MarkLabel(Lbl1); Context.Emit(Signed ? OpCodes.Ble_S : OpCodes.Ble_Un_S, LblLe);
Context.EmitLdint(0); // In.
Context.Emit(OpCodes.Pop);
Context.EmitLdc_I4(TMaxValue);
SetQCFlag();
Context.Emit(OpCodes.Br_S, LblGeEnd);
Context.MarkLabel(LblLe);
Context.Emit(OpCodes.Dup);
Context.EmitLdc_I4(TMinValue); Context.EmitLdc_I4(TMinValue);
Context.Emit(OpCodes.Conv_I8); Context.Emit(OpCodes.Conv_I8);
Context.Emit(Signed ? OpCodes.Bge_S : OpCodes.Bge_Un_S, Lbl2);
Context.Emit(Signed ? OpCodes.Bge_S : OpCodes.Bge_Un_S, LblGeEnd);
Context.Emit(OpCodes.Pop);
Context.EmitLdc_I4(TMinValue); Context.EmitLdc_I4(TMinValue);
Context.EmitStint(1); // Out. SetQCFlag();
Context.EmitLdc_I4(0x8000000);
Context.EmitStint(2); // Sat.
Context.Emit(OpCodes.Br_S, Lbl3);
Context.MarkLabel(Lbl2); Context.MarkLabel(LblGeEnd);
Context.EmitLdint(0); // In.
Context.EmitStint(1); // Out.
Context.MarkLabel(Lbl3);
if (Scalar) if (Scalar)
{ {
EmitVectorZeroLower(Context, Op.Rd); EmitVectorZeroLower(Context, Op.Rd);
} }
Context.EmitLdint(1); // Out.
EmitVectorInsert(Context, Op.Rd, Part + Index, Op.Size); EmitVectorInsert(Context, Op.Rd, Part + Index, Op.Size);
} }
@ -270,12 +267,15 @@ namespace ChocolArm64.Instruction
EmitVectorZeroUpper(Context, Op.Rd); EmitVectorZeroUpper(Context, Op.Rd);
} }
Context.EmitLdarg(ATranslatedSub.StateArgIdx); void SetQCFlag()
Context.EmitLdarg(ATranslatedSub.StateArgIdx); {
Context.EmitCallPropGet(typeof(AThreadState), nameof(AThreadState.Fpsr)); Context.EmitLdarg(ATranslatedSub.StateArgIdx);
Context.EmitLdint(2); // Sat. Context.EmitLdarg(ATranslatedSub.StateArgIdx);
Context.Emit(OpCodes.Or); Context.EmitCallPropGet(typeof(AThreadState), nameof(AThreadState.Fpsr));
Context.EmitCallPropSet(typeof(AThreadState), nameof(AThreadState.Fpsr)); Context.EmitLdc_I4(0x8000000);
Context.Emit(OpCodes.Or);
Context.EmitCallPropSet(typeof(AThreadState), nameof(AThreadState.Fpsr));
}
} }
public static void Fabd_S(AILEmitterCtx Context) public static void Fabd_S(AILEmitterCtx Context)