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);
        }
Exemplo n.º 2
0
        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);
            }
        }
        private static void EmitWriteIntFallback(ArmEmitterContext context, Operand address, int rt, 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;
            }

            Operand value = GetInt(context, rt);

            if (size < 3 && value.Type == OperandType.I64)
            {
                value = context.ConvertI64ToI32(value);
            }

            context.Call(fallbackMethodDlg, address, value);
        }