private static void EmitWriteVectorFallback( ArmEmitterContext context, Operand address, int rt, int elem, int size) { Delegate fallbackMethodDlg = null; switch (size) { case 0: fallbackMethodDlg = new _Void_U64_U8(NativeInterface.WriteByte); break; case 1: fallbackMethodDlg = new _Void_U64_U16(NativeInterface.WriteUInt16); break; case 2: fallbackMethodDlg = new _Void_U64_U32(NativeInterface.WriteUInt32); break; case 3: fallbackMethodDlg = new _Void_U64_U64(NativeInterface.WriteUInt64); break; case 4: fallbackMethodDlg = new _Void_U64_V128(NativeInterface.WriteVector128); break; } Operand value = null; if (size < 4) { switch (size) { case 0: value = context.VectorExtract8(GetVec(rt), elem); break; case 1: value = context.VectorExtract16(GetVec(rt), elem); break; case 2: value = context.VectorExtract(OperandType.I32, GetVec(rt), elem); break; case 3: value = context.VectorExtract(OperandType.I64, GetVec(rt), elem); break; } } else { value = GetVec(rt); } context.Call(fallbackMethodDlg, address, value); }
public static Operand EmitStoreExclusive( ArmEmitterContext context, Operand address, Operand value, bool exclusive, int size) { if (size < 3) { value = context.ConvertI64ToI32(value); } Delegate fallbackMethodDlg = null; if (exclusive) { switch (size) { case 0: fallbackMethodDlg = new _S32_U64_U8(NativeInterface.WriteByteExclusive); break; case 1: fallbackMethodDlg = new _S32_U64_U16(NativeInterface.WriteUInt16Exclusive); break; case 2: fallbackMethodDlg = new _S32_U64_U32(NativeInterface.WriteUInt32Exclusive); break; case 3: fallbackMethodDlg = new _S32_U64_U64(NativeInterface.WriteUInt64Exclusive); break; case 4: fallbackMethodDlg = new _S32_U64_V128(NativeInterface.WriteVector128Exclusive); break; } return(context.Call(fallbackMethodDlg, address, value)); } else { switch (size) { case 0: fallbackMethodDlg = new _Void_U64_U8(NativeInterface.WriteByte); break; case 1: fallbackMethodDlg = new _Void_U64_U16(NativeInterface.WriteUInt16); break; case 2: fallbackMethodDlg = new _Void_U64_U32(NativeInterface.WriteUInt32); break; case 3: fallbackMethodDlg = new _Void_U64_U64(NativeInterface.WriteUInt64); break; case 4: fallbackMethodDlg = new _Void_U64_V128(NativeInterface.WriteVector128); break; } context.Call(fallbackMethodDlg, address, value); return(null); } }