示例#1
0
        public OpCodeSimdImm64(Inst inst, long position, int opCode) : base(inst, position, opCode)
        {
            Rd = opCode & 0x1f;

            int cMode = (opCode >> 12) & 0xf;
            int op    = (opCode >> 29) & 0x1;

            int modeLow  = cMode & 1;
            int modeHigh = cMode >> 1;

            long imm;

            imm  = ((uint)opCode >> 5) & 0x1f;
            imm |= ((uint)opCode >> 11) & 0xe0;

            if (modeHigh == 0b111)
            {
                Size = modeLow != 0 ? op : 3;

                switch (op | (modeLow << 1))
                {
                case 0:
                    // 64-bits Immediate.
                    // Transform abcd efgh into abcd efgh abcd efgh ...
                    imm = (long)((ulong)imm * 0x0101010101010101);
                    break;

                case 1:
                    // 64-bits Immediate.
                    // Transform abcd efgh into aaaa aaaa bbbb bbbb ...
                    imm = (imm & 0xf0) >> 4 | (imm & 0x0f) << 4;
                    imm = (imm & 0xcc) >> 2 | (imm & 0x33) << 2;
                    imm = (imm & 0xaa) >> 1 | (imm & 0x55) << 1;

                    imm = (long)((ulong)imm * 0x8040201008040201);
                    imm = (long)((ulong)imm & 0x8080808080808080);

                    imm |= imm >> 4;
                    imm |= imm >> 2;
                    imm |= imm >> 1;
                    break;

                case 2:
                case 3:
                    // Floating point Immediate.
                    imm = DecoderHelper.DecodeImm8Float(imm, Size);
                    break;
                }
            }
            else if ((modeHigh & 0b110) == 0b100)
            {
                // 16-bits shifted Immediate.
                Size = 1; imm <<= (modeHigh & 1) << 3;
            }
示例#2
0
        public OpCodeSimdFmov64(Inst inst, long position, int opCode) : base(inst, position, opCode)
        {
            int imm5 = (opCode >> 5) & 0x1f;
            int type = (opCode >> 22) & 0x3;

            if (imm5 != 0b00000 || type > 1)
            {
                Emitter = InstEmit.Und;

                return;
            }

            Size = type;

            long imm;

            Rd  = (opCode >> 0) & 0x1f;
            imm = (opCode >> 13) & 0xff;

            Imm = DecoderHelper.DecodeImm8Float(imm, type);
        }