public static void Vmov_GD(ArmEmitterContext context) { OpCode32SimdMovGpDouble op = (OpCode32SimdMovGpDouble)context.CurrOp; Operand vec = GetVecA32(op.Vm >> 1); if (op.Op == 1) { // To general purpose. Operand value = context.VectorExtract(OperandType.I64, vec, op.Vm & 1); SetIntA32(context, op.Rt, context.ConvertI64ToI32(value)); SetIntA32(context, op.Rt2, context.ConvertI64ToI32(context.ShiftRightUI(value, Const(32)))); } else { // From general purpose. Operand lowValue = GetIntA32(context, op.Rt); Operand highValue = GetIntA32(context, op.Rt2); Operand value = context.BitwiseOr( context.ZeroExtend32(OperandType.I64, lowValue), context.ShiftLeft(context.ZeroExtend32(OperandType.I64, highValue), Const(32))); context.Copy(vec, context.VectorInsert(vec, value, op.Vm & 1)); } }
public static void Vmov_G2(ArmEmitterContext context) { OpCode32SimdMovGpDouble op = (OpCode32SimdMovGpDouble)context.CurrOp; Operand vec = GetVecA32(op.Vm >> 2); int vm1 = op.Vm + 1; bool sameOwnerVec = (op.Vm >> 2) == (vm1 >> 2); Operand vec2 = sameOwnerVec ? vec : GetVecA32(vm1 >> 2); if (op.Op == 1) { // To general purpose. Operand lowValue = context.VectorExtract(OperandType.I32, vec, op.Vm & 3); SetIntA32(context, op.Rt, lowValue); Operand highValue = context.VectorExtract(OperandType.I32, vec2, vm1 & 3); SetIntA32(context, op.Rt2, highValue); } else { // From general purpose. Operand lowValue = GetIntA32(context, op.Rt); Operand resultVec = context.VectorInsert(vec, lowValue, op.Vm & 3); Operand highValue = GetIntA32(context, op.Rt2); if (sameOwnerVec) { context.Copy(vec, context.VectorInsert(resultVec, highValue, vm1 & 3)); } else { context.Copy(vec, resultVec); context.Copy(vec2, context.VectorInsert(vec2, highValue, vm1 & 3)); } } }