aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64
diff options
context:
space:
mode:
authorLDj3SNuD <35856442+LDj3SNuD@users.noreply.github.com>2018-07-15 05:53:26 +0200
committergdkchan <gab.dark.100@gmail.com>2018-07-15 00:53:26 -0300
commit063fae50fe25388d10e9ec1915c561dc0f4d519d (patch)
tree768070410b2594e064a540d1eb5e737aab428df3 /ChocolArm64
parent50b706e2baef0a7a80af94de51fd9e3bd31ae1ff (diff)
Fix EmitHighNarrow(), EmitSaturatingNarrowOp() when Rd == Rn || Rd == Rm (& Part != 0). Optimization of EmitVectorTranspose(), EmitVectorUnzip(), EmitVectorZip() algorithms (reduction of the number of operations and their complexity). Add 12 Tests about Trn1/2, Uzp1/2, Zip1/2 (V) instructions. (#268)
* Update CpuTestSimdArithmetic.cs * Update CpuTestSimd.cs * Update CpuTestSimdReg.cs * Update Instructions.cs * Update AInstEmitSimdArithmetic.cs * Update AInstEmitSimdHelper.cs * Update AInstEmitSimdMove.cs * Delete CpuTestSimdMove.cs
Diffstat (limited to 'ChocolArm64')
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs12
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdHelper.cs12
-rw-r--r--ChocolArm64/Instruction/AInstEmitSimdMove.cs47
3 files changed, 47 insertions, 24 deletions
diff --git a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
index a39ffc09..36bb1cbf 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdArithmetic.cs
@@ -163,12 +163,19 @@ namespace ChocolArm64.Instruction
AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
int Elems = 8 >> Op.Size;
+
int ESize = 8 << Op.Size;
int Part = Op.RegisterSize == ARegisterSize.SIMD128 ? Elems : 0;
long RoundConst = 1L << (ESize - 1);
+ if (Part != 0)
+ {
+ Context.EmitLdvec(Op.Rd);
+ Context.EmitStvectmp();
+ }
+
for (int Index = 0; Index < Elems; Index++)
{
EmitVectorExtractZx(Context, Op.Rn, Index, Op.Size + 1);
@@ -185,9 +192,12 @@ namespace ChocolArm64.Instruction
Context.EmitLsr(ESize);
- EmitVectorInsert(Context, Op.Rd, Part + Index, Op.Size);
+ EmitVectorInsertTmp(Context, Part + Index, Op.Size);
}
+ Context.EmitLdvectmp();
+ Context.EmitStvec(Op.Rd);
+
if (Part == 0)
{
EmitVectorZeroUpper(Context, Op.Rd);
diff --git a/ChocolArm64/Instruction/AInstEmitSimdHelper.cs b/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
index 1f7a2dad..7716e298 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdHelper.cs
@@ -813,6 +813,7 @@ namespace ChocolArm64.Instruction
AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
int Elems = !Scalar ? 8 >> Op.Size : 1;
+
int ESize = 8 << Op.Size;
int Part = !Scalar && (Op.RegisterSize == ARegisterSize.SIMD128) ? Elems : 0;
@@ -823,6 +824,12 @@ namespace ChocolArm64.Instruction
Context.EmitLdc_I8(0L);
Context.EmitSttmp();
+ if (Part != 0)
+ {
+ Context.EmitLdvec(Op.Rd);
+ Context.EmitStvectmp();
+ }
+
for (int Index = 0; Index < Elems; Index++)
{
AILLabel LblLe = new AILLabel();
@@ -867,9 +874,12 @@ namespace ChocolArm64.Instruction
EmitVectorZeroLower(Context, Op.Rd);
}
- EmitVectorInsert(Context, Op.Rd, Part + Index, Op.Size);
+ EmitVectorInsertTmp(Context, Part + Index, Op.Size);
}
+ Context.EmitLdvectmp();
+ Context.EmitStvec(Op.Rd);
+
if (Part == 0)
{
EmitVectorZeroUpper(Context, Op.Rd);
diff --git a/ChocolArm64/Instruction/AInstEmitSimdMove.cs b/ChocolArm64/Instruction/AInstEmitSimdMove.cs
index 739f01c6..592cab73 100644
--- a/ChocolArm64/Instruction/AInstEmitSimdMove.cs
+++ b/ChocolArm64/Instruction/AInstEmitSimdMove.cs
@@ -331,17 +331,18 @@ namespace ChocolArm64.Instruction
{
AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
- int Bytes = Op.GetBitsCount() >> 3;
-
- int Elems = Bytes >> Op.Size;
+ int Words = Op.GetBitsCount() >> 4;
+ int Pairs = Words >> Op.Size;
- for (int Index = 0; Index < Elems; Index++)
+ for (int Index = 0; Index < Pairs; Index++)
{
- int Elem = (Index & ~1) + Part;
+ int Idx = Index << 1;
- EmitVectorExtractZx(Context, (Index & 1) == 0 ? Op.Rn : Op.Rm, Elem, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rn, Idx + Part, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rm, Idx + Part, Op.Size);
- EmitVectorInsertTmp(Context, Index, Op.Size);
+ EmitVectorInsertTmp(Context, Idx + 1, Op.Size);
+ EmitVectorInsertTmp(Context, Idx , Op.Size);
}
Context.EmitLdvectmp();
@@ -357,18 +358,18 @@ namespace ChocolArm64.Instruction
{
AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
- int Bytes = Op.GetBitsCount() >> 3;
+ int Words = Op.GetBitsCount() >> 4;
+ int Pairs = Words >> Op.Size;
- int Elems = Bytes >> Op.Size;
- int Half = Elems >> 1;
-
- for (int Index = 0; Index < Elems; Index++)
+ for (int Index = 0; Index < Pairs; Index++)
{
- int Elem = Part + ((Index & (Half - 1)) << 1);
+ int Idx = Index << 1;
- EmitVectorExtractZx(Context, Index < Half ? Op.Rn : Op.Rm, Elem, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rn, Idx + Part, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rm, Idx + Part, Op.Size);
- EmitVectorInsertTmp(Context, Index, Op.Size);
+ EmitVectorInsertTmp(Context, Pairs + Index, Op.Size);
+ EmitVectorInsertTmp(Context, Index, Op.Size);
}
Context.EmitLdvectmp();
@@ -384,18 +385,20 @@ namespace ChocolArm64.Instruction
{
AOpCodeSimdReg Op = (AOpCodeSimdReg)Context.CurrOp;
- int Bytes = Op.GetBitsCount() >> 3;
+ int Words = Op.GetBitsCount() >> 4;
+ int Pairs = Words >> Op.Size;
- int Elems = Bytes >> Op.Size;
- int Half = Elems >> 1;
+ int Base = Part != 0 ? Pairs : 0;
- for (int Index = 0; Index < Elems; Index++)
+ for (int Index = 0; Index < Pairs; Index++)
{
- int Elem = Part * Half + (Index >> 1);
+ int Idx = Index << 1;
- EmitVectorExtractZx(Context, (Index & 1) == 0 ? Op.Rn : Op.Rm, Elem, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rn, Base + Index, Op.Size);
+ EmitVectorExtractZx(Context, Op.Rm, Base + Index, Op.Size);
- EmitVectorInsertTmp(Context, Index, Op.Size);
+ EmitVectorInsertTmp(Context, Idx + 1, Op.Size);
+ EmitVectorInsertTmp(Context, Idx , Op.Size);
}
Context.EmitLdvectmp();