public static void Ext_V(ILEmitterCtx context) { OpCodeSimdExt64 op = (OpCodeSimdExt64)context.CurrOp; context.EmitLdvec(op.Rd); context.EmitStvectmp(); int bytes = op.GetBitsCount() >> 3; int position = op.Imm4; for (int index = 0; index < bytes; index++) { int reg = op.Imm4 + index < bytes ? op.Rn : op.Rm; if (position == bytes) { position = 0; } EmitVectorExtractZx(context, reg, position++, 0); EmitVectorInsertTmp(context, index, 0); } context.EmitLdvectmp(); context.EmitStvec(op.Rd); if (op.RegisterSize == RegisterSize.Simd64) { EmitVectorZeroUpper(context, op.Rd); } }
public static void Ext_V(ILEmitterCtx context) { OpCodeSimdExt64 op = (OpCodeSimdExt64)context.CurrOp; if (Optimizations.UseSse2) { Type[] typesShs = new Type[] { typeof(Vector128 <byte>), typeof(byte) }; Type[] typesOr = new Type[] { typeof(Vector128 <byte>), typeof(Vector128 <byte>) }; context.EmitLdvec(op.Rn); if (op.RegisterSize == RegisterSize.Simd64) { VectorHelper.EmitCall(context, nameof(VectorHelper.VectorSingleZero)); context.EmitCall(typeof(Sse).GetMethod(nameof(Sse.MoveLowToHigh))); } context.EmitLdc_I4(op.Imm4); context.EmitCall(typeof(Sse2).GetMethod(nameof(Sse2.ShiftRightLogical128BitLane), typesShs)); context.EmitLdvec(op.Rm); context.EmitLdc_I4((op.RegisterSize == RegisterSize.Simd64 ? 8 : 16) - op.Imm4); context.EmitCall(typeof(Sse2).GetMethod(nameof(Sse2.ShiftLeftLogical128BitLane), typesShs)); if (op.RegisterSize == RegisterSize.Simd64) { VectorHelper.EmitCall(context, nameof(VectorHelper.VectorSingleZero)); context.EmitCall(typeof(Sse).GetMethod(nameof(Sse.MoveLowToHigh))); } context.EmitCall(typeof(Sse2).GetMethod(nameof(Sse2.Or), typesOr)); context.EmitStvec(op.Rd); } else { int bytes = op.GetBitsCount() >> 3; int position = op.Imm4; for (int index = 0; index < bytes; index++) { int reg = op.Imm4 + index < bytes ? op.Rn : op.Rm; if (position == bytes) { position = 0; } EmitVectorExtractZx(context, reg, position++, 0); EmitVectorInsertTmp(context, index, 0); } context.EmitLdvectmp(); context.EmitStvec(op.Rd); if (op.RegisterSize == RegisterSize.Simd64) { EmitVectorZeroUpper(context, op.Rd); } } }