// Pairwise public static void EmitVectorPairwiseOpF32(ArmEmitterContext context, Func2I emit) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; int sizeF = op.Size & 1; OperandType type = sizeF != 0 ? OperandType.FP64 : OperandType.FP32; int elems = op.GetBytesCount() >> (sizeF + 2); int pairs = elems >> 1; Operand res = GetVecA32(op.Qd); Operand mvec = GetVecA32(op.Qm); Operand nvec = GetVecA32(op.Qn); for (int index = 0; index < pairs; index++) { int pairIndex = index << 1; Operand n1 = context.VectorExtract(type, nvec, op.Fn + pairIndex); Operand n2 = context.VectorExtract(type, nvec, op.Fn + pairIndex + 1); res = context.VectorInsert(res, emit(n1, n2), op.Fd + index); Operand m1 = context.VectorExtract(type, mvec, op.Fm + pairIndex); Operand m2 = context.VectorExtract(type, mvec, op.Fm + pairIndex + 1); res = context.VectorInsert(res, emit(m1, m2), op.Fd + index + pairs); } context.Copy(GetVecA32(op.Qd), res); }
public static void EmitVectorTernaryLongOpI32(ArmEmitterContext context, Func3I emit, bool signed) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; Operand res = context.VectorZero(); int elems = op.GetBytesCount() >> op.Size; for (int index = 0; index < elems; index++) { Operand de = EmitVectorExtract32(context, op.Qd, op.Id + index, op.Size + 1, signed); Operand ne = EmitVectorExtract32(context, op.Qn, op.In + index, op.Size, signed); Operand me = EmitVectorExtract32(context, op.Qm, op.Im + index, op.Size, signed); if (op.Size == 2) { ne = signed ? context.SignExtend32(OperandType.I64, ne) : context.ZeroExtend32(OperandType.I64, ne); me = signed ? context.SignExtend32(OperandType.I64, me) : context.ZeroExtend32(OperandType.I64, me); } res = EmitVectorInsert(context, res, emit(de, ne, me), index, op.Size + 1); } context.Copy(GetVecA32(op.Qd), res); }
public static void EmitVectorPairwiseTernaryLongOpI32(ArmEmitterContext context, Func3I emit, bool signed) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; int elems = op.GetBytesCount() >> op.Size; int pairs = elems >> 1; Operand res = GetVecA32(op.Qd); for (int index = 0; index < pairs; index++) { int pairIndex = index * 2; Operand m1 = EmitVectorExtract32(context, op.Qm, op.Im + pairIndex, op.Size, signed); Operand m2 = EmitVectorExtract32(context, op.Qm, op.Im + pairIndex + 1, op.Size, signed); if (op.Size == 2) { m1 = signed ? context.SignExtend32(OperandType.I64, m1) : context.ZeroExtend32(OperandType.I64, m1); m2 = signed ? context.SignExtend32(OperandType.I64, m2) : context.ZeroExtend32(OperandType.I64, m2); } Operand d1 = EmitVectorExtract32(context, op.Qd, op.Id + index, op.Size + 1, signed); res = EmitVectorInsert(context, res, emit(m1, m2, d1), op.Id + index, op.Size + 1); } context.Copy(GetVecA32(op.Qd), res); }
public static void EmitVectorBinaryOpI32(ArmEmitterContext context, Func2I emit, bool signed) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; Operand res = GetVecA32(op.Qd); int elems = op.GetBytesCount() >> op.Size; for (int index = 0; index < elems; index++) { Operand ne = EmitVectorExtract32(context, op.Qn, op.In + index, op.Size, signed); Operand me = EmitVectorExtract32(context, op.Qm, op.Im + index, op.Size, signed); res = EmitVectorInsert(context, res, emit(ne, me), op.Id + index, op.Size); } context.Copy(GetVecA32(op.Qd), res); }
public static void EmitVectorBinaryOpF32(ArmEmitterContext context, Func2I emit) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; int sizeF = op.Size & 1; OperandType type = sizeF != 0 ? OperandType.FP64 : OperandType.FP32; int elems = op.GetBytesCount() >> (sizeF + 2); Operand res = GetVecA32(op.Qd); for (int index = 0; index < elems; index++) { Operand ne = context.VectorExtract(type, GetVecA32(op.Qn), op.Fn + index); Operand me = context.VectorExtract(type, GetVecA32(op.Qm), op.Fm + index); res = context.VectorInsert(res, emit(ne, me), op.Fd + index); } context.Copy(GetVecA32(op.Qd), res); }
public static void EmitVectorPairwiseOpI32(ArmEmitterContext context, Func2I emit, bool signed) { OpCode32SimdReg op = (OpCode32SimdReg)context.CurrOp; int elems = op.GetBytesCount() >> op.Size; int pairs = elems >> 1; Operand res = GetVecA32(op.Qd); for (int index = 0; index < pairs; index++) { int pairIndex = index << 1; Operand n1 = EmitVectorExtract32(context, op.Qn, op.In + pairIndex, op.Size, signed); Operand n2 = EmitVectorExtract32(context, op.Qn, op.In + pairIndex + 1, op.Size, signed); Operand m1 = EmitVectorExtract32(context, op.Qm, op.Im + pairIndex, op.Size, signed); Operand m2 = EmitVectorExtract32(context, op.Qm, op.Im + pairIndex + 1, op.Size, signed); res = EmitVectorInsert(context, res, emit(n1, n2), op.Id + index, op.Size); res = EmitVectorInsert(context, res, emit(m1, m2), op.Id + index + pairs, op.Size); } context.Copy(GetVecA32(op.Qd), res); }