public static void Vdup_1(ArmEmitterContext context) { OpCode32SimdDupElem op = (OpCode32SimdDupElem)context.CurrOp; Operand insert = EmitVectorExtractZx32(context, op.Vm >> 1, ((op.Vm & 1) << (3 - op.Size)) + op.Index, op.Size); // Zero extend into an I64, then replicate. Saves the most time over elementwise inserts. switch (op.Size) { case 2: insert = context.Multiply(context.ZeroExtend32(OperandType.I64, insert), Const(0x0000000100000001u)); break; case 1: insert = context.Multiply(context.ZeroExtend16(OperandType.I64, insert), Const(0x0001000100010001u)); break; case 0: insert = context.Multiply(context.ZeroExtend8(OperandType.I64, insert), Const(0x0101010101010101u)); break; default: throw new InvalidOperationException("Unknown Vdup Size."); } InsertScalar(context, op.Vd, insert); if (op.Q) { InsertScalar(context, op.Vd | 1, insert); } }
public static void Vdup_1(ArmEmitterContext context) { OpCode32SimdDupElem op = (OpCode32SimdDupElem)context.CurrOp; Operand insert = EmitVectorExtractZx32(context, op.Vm >> 1, ((op.Vm & 1) << (3 - op.Size)) + op.Index, op.Size); // Zero extend into an I64, then replicate. Saves the most time over elementwise inserts. insert = op.Size switch { 2 => context.Multiply(context.ZeroExtend32(OperandType.I64, insert), Const(0x0000000100000001u)), 1 => context.Multiply(context.ZeroExtend16(OperandType.I64, insert), Const(0x0001000100010001u)), 0 => context.Multiply(context.ZeroExtend8(OperandType.I64, insert), Const(0x0101010101010101u)), _ => throw new InvalidOperationException($"Invalid Vdup size \"{op.Size}\".") }; InsertScalar(context, op.Vd, insert); if (op.Q) { InsertScalar(context, op.Vd | 1, insert); } }