diff options
Diffstat (limited to 'ChocolArm64/Instructions/InstEmitSimdHelper.cs')
| -rw-r--r-- | ChocolArm64/Instructions/InstEmitSimdHelper.cs | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/ChocolArm64/Instructions/InstEmitSimdHelper.cs b/ChocolArm64/Instructions/InstEmitSimdHelper.cs index cea481a6..5a44e1a1 100644 --- a/ChocolArm64/Instructions/InstEmitSimdHelper.cs +++ b/ChocolArm64/Instructions/InstEmitSimdHelper.cs @@ -642,21 +642,21 @@ namespace ChocolArm64.Instructions { OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; - EmitVectorOpByElem(context, emit, op.Index, false, true); + EmitVectorOpByElem(context, emit, op.Index, ternary: false, signed: true); } public static void EmitVectorBinaryOpByElemZx(ILEmitterCtx context, Action emit) { OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; - EmitVectorOpByElem(context, emit, op.Index, false, false); + EmitVectorOpByElem(context, emit, op.Index, ternary: false, signed: false); } public static void EmitVectorTernaryOpByElemZx(ILEmitterCtx context, Action emit) { OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; - EmitVectorOpByElem(context, emit, op.Index, true, false); + EmitVectorOpByElem(context, emit, op.Index, ternary: true, signed: false); } public static void EmitVectorOpByElem(ILEmitterCtx context, Action emit, int elem, bool ternary, bool signed) @@ -809,6 +809,64 @@ namespace ChocolArm64.Instructions context.EmitStvec(op.Rd); } + public static void EmitVectorWidenBinaryOpByElemSx(ILEmitterCtx context, Action emit) + { + OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; + + EmitVectorWidenOpByElem(context, emit, op.Index, ternary: false, signed: true); + } + + public static void EmitVectorWidenBinaryOpByElemZx(ILEmitterCtx context, Action emit) + { + OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; + + EmitVectorWidenOpByElem(context, emit, op.Index, ternary: false, signed: false); + } + + public static void EmitVectorWidenTernaryOpByElemSx(ILEmitterCtx context, Action emit) + { + OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; + + EmitVectorWidenOpByElem(context, emit, op.Index, ternary: true, signed: true); + } + + public static void EmitVectorWidenTernaryOpByElemZx(ILEmitterCtx context, Action emit) + { + OpCodeSimdRegElem64 op = (OpCodeSimdRegElem64)context.CurrOp; + + EmitVectorWidenOpByElem(context, emit, op.Index, ternary: true, signed: false); + } + + public static void EmitVectorWidenOpByElem(ILEmitterCtx context, Action emit, int elem, bool ternary, bool signed) + { + OpCodeSimdReg64 op = (OpCodeSimdReg64)context.CurrOp; + + int elems = 8 >> op.Size; + + int part = op.RegisterSize == RegisterSize.Simd128 ? elems : 0; + + EmitVectorExtract(context, op.Rm, elem, op.Size, signed); + context.EmitSttmp(); + + for (int index = 0; index < elems; index++) + { + if (ternary) + { + EmitVectorExtract(context, op.Rd, index, op.Size + 1, signed); + } + + EmitVectorExtract(context, op.Rn, part + index, op.Size, signed); + context.EmitLdtmp(); + + emit(); + + EmitVectorInsertTmp(context, index, op.Size + 1); + } + + context.EmitLdvectmp(); + context.EmitStvec(op.Rd); + } + public static void EmitVectorPairwiseOpSx(ILEmitterCtx context, Action emit) { EmitVectorPairwiseOp(context, emit, true); @@ -1416,7 +1474,7 @@ namespace ChocolArm64.Instructions if (Optimizations.UseSse) { //TODO: Use Sse2.MoveScalar once it is fixed, - //as of the time of writing it just crashes the JIT (SDK 2.1.500). + //as of the time of writing it just crashes the JIT (SDK 2.1.503). /*Type[] typesMov = new Type[] { typeof(Vector128<ulong>) }; |
