167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/*
267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Copyright (C) 2011 The Android Open Source Project
367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Licensed under the Apache License, Version 2.0 (the "License");
567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * you may not use this file except in compliance with the License.
667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * You may obtain a copy of the License at
767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *      http://www.apache.org/licenses/LICENSE-2.0
967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
1067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Unless required by applicable law or agreed to in writing, software
1167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * distributed under the License is distributed on an "AS IS" BASIS,
1267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * See the License for the specific language governing permissions and
1467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * limitations under the License.
1567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
1667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
17efc6369224b036a1fb77849f7ae65b3492c832c0buzbee#include "arm_lir.h"
1802031b185b4653e6c72e21f7a51238b903f6d638buzbee#include "codegen_arm.h"
197940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/quick/mir_to_lir-inl.h"
2067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
2111d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughesnamespace art {
2211d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes
2367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/*
2467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * opcode: ArmOpcode enum
2567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * skeleton: pre-designated bit-pattern for this opcode
2667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * k0: key to applying ds/de
2767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * ds: dest start bit position
2867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * de: dest end bit position
2967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * k1: key to applying s1s/s1e
3067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * s1s: src1 start bit position
3167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * s1e: src1 end bit position
3267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * k2: key to applying s2s/s2e
3367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * s2s: src2 start bit position
3467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * s2e: src2 end bit position
3567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * operands: number of operands (for sanity check purposes)
3667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * name: mnemonic name
3767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * fmt: for pretty-printing
3867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
3967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define ENCODING_MAP(opcode, skeleton, k0, ds, de, k1, s1s, s1e, k2, s2s, s2e, \
4067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                     k3, k3s, k3e, flags, name, fmt, size) \
4167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee        {skeleton, {{k0, ds, de}, {k1, s1s, s1e}, {k2, s2s, s2e}, \
4267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                    {k3, k3s, k3e}}, opcode, flags, name, fmt, size}
4367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
4467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* Instruction dump string format keys: !pf, where "!" is the start
4567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * of the key, "p" is which numeric operand to use and "f" is the
4667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * print format.
4767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
4867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * [p]ositions:
4967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     0 -> operands[0] (dest)
5067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     1 -> operands[1] (src1)
5167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     2 -> operands[2] (src2)
5267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     3 -> operands[3] (extra)
5367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
5467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * [f]ormats:
5567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     h -> 4-digit hex
5667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     d -> decimal
5767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     E -> decimal*4
5867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     F -> decimal*2
5967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     c -> branch condition (beq, bne, etc.)
6067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     t -> pc-relative target
6167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     u -> 1st half of bl[x] target
6267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     v -> 2nd half ob bl[x] target
6367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     R -> register list
6467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     s -> single precision floating point register
6567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     S -> double precision floating point register
6667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     m -> Thumb2 modified immediate
6767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     n -> complimented Thumb2 modified immediate
6867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     M -> Thumb2 16-bit zero-extended immediate
6967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     b -> 4-digit binary
7067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     B -> dmb option string (sy, st, ish, ishst, nsh, hshst)
7167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     H -> operand shift
7267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     C -> core register name
7367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     P -> fp cs register list (base of s16)
7467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *     Q -> fp cs register list (base of s0)
7567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
7667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *  [!] escape.  To insert "!", use "!!"
7767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
7831a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee/* NOTE: must be kept in sync with enum ArmOpcode from LIR.h */
791fd3346740dfb7f47be9922312b68a4227fada96buzbeeconst ArmEncodingMap ArmMir2Lir::EncodingMap[kArmLast] = {
8067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kArm16BitData,    0x0000,
8167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
8271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP, "data", "0x!0h(!0d)", 2),
8367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAdcRR,        0x4140,
8467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
8567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
8667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES | USES_CCODES,
8771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adcs", "!0C, !1C", 2),
8867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRRI3,      0x1c00,
8967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
9067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
9167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
9271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adds", "!0C, !1C, #!2d", 2),
9367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRI8,       0x3000,
9467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
9567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
9667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | SETS_CCODES,
9771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adds", "!0C, !0C, #!1d", 2),
9867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRRR,       0x1800,
9967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
10067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
10167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE12 | SETS_CCODES,
10271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adds", "!0C, !1C, !2C", 2),
10367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRRLH,     0x4440,
10467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
10567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE01,
10671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C, !1C", 2),
10767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRRHL,     0x4480,
10867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
10967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE01,
11071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C, !1C", 2),
11167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddRRHH,     0x44c0,
11267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
11367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE01,
11471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C, !1C", 2),
11567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddPcRel,    0xa000,
11667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
1175abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | IS_BRANCH | NEEDS_FIXUP,
11871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C, pc, #!1E", 2),
11967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddSpRel,    0xa800,
12067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtUnused, -1, -1, kFmtBitBlt, 7, 0,
12167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF_SP | REG_USE_SP,
12271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C, sp, #!2E", 2),
12367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAddSpI7,      0xb000,
12467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 6, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
12567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | REG_DEF_SP | REG_USE_SP,
12671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "sp, #!0d*4", 2),
12767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAndRR,        0x4000,
12867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
12967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
13067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
13171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ands", "!0C, !1C", 2),
13267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAsrRRI5,      0x1000,
13367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
13467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
13567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
13671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "asrs", "!0C, !1C, #!2d", 2),
13767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbAsrRR,        0x4100,
13867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
13967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
14067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
14171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "asrs", "!0C, !1C", 2),
14267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBCond,        0xd000,
14367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 0, kFmtBitBlt, 11, 8, kFmtUnused, -1, -1,
1445abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | IS_BRANCH | USES_CCODES |
14571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 NEEDS_FIXUP, "b!1c", "!0t", 2),
14667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBUncond,      0xe000,
14767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
148680b1bdd7e5d112ba4b95d6c81a43b65119b3b9cIan Rogers                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH | NEEDS_FIXUP,
14971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "b", "!0t", 2),
15067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBicRR,        0x4380,
15167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
15267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
15367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
15471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bics", "!0C, !1C", 2),
15567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBkpt,          0xbe00,
15667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
15767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH,
15871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bkpt", "!0d", 2),
15967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBlx1,         0xf000,
16067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
1615abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | IS_BRANCH | REG_DEF_LR |
16271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 NEEDS_FIXUP, "blx_1", "!0u", 2),
16367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBlx2,         0xe800,
16467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
1655abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | IS_BRANCH | REG_DEF_LR |
16671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 NEEDS_FIXUP, "blx_2", "!0v", 2),
16767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBl1,          0xf000,
16867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
16967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH | REG_DEF_LR,
17071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bl_1", "!0u", 2),
17167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBl2,          0xf800,
17267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
17367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH | REG_DEF_LR,
17471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bl_2", "!0v", 2),
17567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBlxR,         0x4780,
17667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 6, 3, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
17767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
17867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_USE0 | IS_BRANCH | REG_DEF_LR,
17971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "blx", "!0C", 2),
18067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbBx,            0x4700,
18167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 6, 3, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
18267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH,
18371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bx", "!0C", 2),
18467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmnRR,        0x42c0,
18567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
18667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01 | SETS_CCODES,
18771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmn", "!0C, !1C", 2),
18867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmpRI8,       0x2800,
18967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
19067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE0 | SETS_CCODES,
19171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, #!1d", 2),
19267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmpRR,        0x4280,
19367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
19467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01 | SETS_CCODES,
19571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, !1C", 2),
19667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmpLH,        0x4540,
19767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
19867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01 | SETS_CCODES,
19971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, !1C", 2),
20067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmpHL,        0x4580,
20167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
20267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01 | SETS_CCODES,
20371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, !1C", 2),
20467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbCmpHH,        0x45c0,
20567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
20667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01 | SETS_CCODES,
20771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, !1C", 2),
20867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbEorRR,        0x4040,
20967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
21067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
21167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
21271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "eors", "!0C, !1C", 2),
21367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdmia,         0xc800,
21467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
21567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
21667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | REG_DEF_LIST1 | IS_LOAD,
21771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldmia", "!0C!!, <!1R>", 2),
21867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrRRI5,      0x6800,
21967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
22067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
22171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [!1C, #!2E]", 2),
22267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrRRR,       0x5800,
22367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
22467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12 | IS_LOAD,
22571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [!1C, !2C]", 2),
22667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrPcRel,    0x4800,
22767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
22867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0 | REG_USE_PC
22971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD | NEEDS_FIXUP, "ldr", "!0C, [pc, #!1E]", 2),
23067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrSpRel,    0x9800,
23167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtUnused, -1, -1, kFmtBitBlt, 7, 0,
23267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0 | REG_USE_SP
23371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD, "ldr", "!0C, [sp, #!2E]", 2),
23467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrbRRI5,     0x7800,
23567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
23667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
23771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrb", "!0C, [!1C, #2d]", 2),
23867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrbRRR,      0x5c00,
23967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
24067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12 | IS_LOAD,
24171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrb", "!0C, [!1C, !2C]", 2),
24267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrhRRI5,     0x8800,
24367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
24467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
24571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrh", "!0C, [!1C, #!2F]", 2),
24667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrhRRR,      0x5a00,
24767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
24867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12 | IS_LOAD,
24971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrh", "!0C, [!1C, !2C]", 2),
25067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrsbRRR,     0x5600,
25167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
25267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12 | IS_LOAD,
25371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsb", "!0C, [!1C, !2C]", 2),
25467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLdrshRRR,     0x5e00,
25567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
25667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12 | IS_LOAD,
25771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsh", "!0C, [!1C, !2C]", 2),
25867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLslRRI5,      0x0000,
25967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
26067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
26167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
26271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsls", "!0C, !1C, #!2d", 2),
26367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLslRR,        0x4080,
26467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
26567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
26667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
26771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsls", "!0C, !1C", 2),
26867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLsrRRI5,      0x0800,
26967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
27067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
27167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
27271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsrs", "!0C, !1C, #!2d", 2),
27367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbLsrRR,        0x40c0,
27467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
27567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
27667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
27771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsrs", "!0C, !1C", 2),
27867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMovImm,       0x2000,
27967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
28067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
28167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0 | SETS_CCODES,
28271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "movs", "!0C, #!1d", 2),
28367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMovRR,        0x1c00,
28467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
28567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
28667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE1 | SETS_CCODES,
28771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "movs", "!0C, !1C", 2),
28867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMovRR_H2H,    0x46c0,
28967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
29067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
29171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, !1C", 2),
29267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMovRR_H2L,    0x4640,
29367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
29467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
29571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, !1C", 2),
29667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMovRR_L2H,    0x4680,
29767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
29867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
29971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, !1C", 2),
30067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMul,           0x4340,
30167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
30267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
30367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
30471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "muls", "!0C, !1C", 2),
30567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbMvn,           0x43c0,
30667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
30767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
30867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE1 | SETS_CCODES,
30971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mvns", "!0C, !1C", 2),
31067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbNeg,           0x4240,
31167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
31267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
31367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE1 | SETS_CCODES,
31471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "negs", "!0C, !1C", 2),
31567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbOrr,           0x4300,
31667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
31767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
31867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
31971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "orrs", "!0C, !1C", 2),
32067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbPop,           0xbc00,
32167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 8, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
32267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
32367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_DEF_LIST0
32471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD, "pop", "<!0R>", 2),
32567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbPush,          0xb400,
32667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 8, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
32767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
32867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_USE_LIST0
32971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE, "push", "<!0R>", 2),
33067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbRorRR,        0x41c0,
33167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
33267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
33367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | SETS_CCODES,
33471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "rors", "!0C, !1C", 2),
33567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSbc,           0x4180,
33667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
33767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
33867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE01 | USES_CCODES | SETS_CCODES,
33971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sbcs", "!0C, !1C", 2),
34067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStmia,         0xc000,
34167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
34267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
34367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0 | REG_USE0 | REG_USE_LIST1 | IS_STORE,
34471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "stmia", "!0C!!, <!1R>", 2),
34567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrRRI5,      0x6000,
34667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
34767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
34871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "str", "!0C, [!1C, #!2E]", 2),
34967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrRRR,       0x5000,
35067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
35167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE012 | IS_STORE,
35271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "str", "!0C, [!1C, !2C]", 2),
35367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrSpRel,    0x9000,
35467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtUnused, -1, -1, kFmtBitBlt, 7, 0,
35567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE0 | REG_USE_SP
35671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE, "str", "!0C, [sp, #!2E]", 2),
35767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrbRRI5,     0x7000,
35867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
35967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
36071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strb", "!0C, [!1C, #!2d]", 2),
36167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrbRRR,      0x5400,
36267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
36367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE012 | IS_STORE,
36471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strb", "!0C, [!1C, !2C]", 2),
36567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrhRRI5,     0x8000,
36667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 10, 6,
36767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
36871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strh", "!0C, [!1C, #!2F]", 2),
36967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbStrhRRR,      0x5200,
37067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
37167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE012 | IS_STORE,
37271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strh", "!0C, [!1C, !2C]", 2),
37367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSubRRI3,      0x1e00,
37467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
37567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
37667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
37771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C, !1C, #!2d", 2),
37867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSubRI8,       0x3800,
37967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 10, 8, kFmtBitBlt, 7, 0, kFmtUnused, -1, -1,
38067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
38167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | SETS_CCODES,
38271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C, #!1d", 2),
38367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSubRRR,       0x1a00,
38467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtBitBlt, 8, 6,
38567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
38667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE12 | SETS_CCODES,
38771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C, !1C, !2C", 2),
38867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSubSpI7,      0xb080,
38967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 6, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
39067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
39167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP,
39271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sub", "sp, #!0d*4", 2),
39367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbSwi,           0xdf00,
394408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers                 kFmtBitBlt, 7, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
395408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers                 kFmtUnused, -1, -1, IS_UNARY_OP | IS_BRANCH,
39671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "swi", "!0d", 2),
39767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbTst,           0x4200,
39867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtBitBlt, 5, 3, kFmtUnused, -1, -1,
39967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP | REG_USE01 | SETS_CCODES,
40071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "tst", "!0C, !1C", 2),
40167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vldrs,       0xed900a00,
40267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 7, 0,
4034965b661a6edc7f263b6fef1439b03ca8c95da49buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD |
40471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 REG_DEF_LR | NEEDS_FIXUP, "vldr", "!0s, [!1C, #!2E]", 4),
40567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vldrd,       0xed900b00,
40667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 7, 0,
4074965b661a6edc7f263b6fef1439b03ca8c95da49buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD |
40871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 REG_DEF_LR | NEEDS_FIXUP, "vldr", "!0S, [!1C, #!2E]", 4),
40967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmuls,        0xee200a00,
41067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 7, 16, kFmtSfp, 5, 0,
41167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
41267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE12,
41371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmuls", "!0s, !1s, !2s", 4),
41467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmuld,        0xee200b00,
41567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 7, 16, kFmtDfp, 5, 0,
41667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
41771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmuld", "!0S, !1S, !2S", 4),
41867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vstrs,       0xed800a00,
41967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 7, 0,
42067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
42171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vstr", "!0s, [!1C, #!2E]", 4),
42267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vstrd,       0xed800b00,
42367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 7, 0,
42467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
42571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vstr", "!0S, [!1C, #!2E]", 4),
42667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vsubs,        0xee300a40,
42767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 7, 16, kFmtSfp, 5, 0,
42867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
42971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vsub", "!0s, !1s, !2s", 4),
43067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vsubd,        0xee300b40,
43167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 7, 16, kFmtDfp, 5, 0,
43267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
43371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vsub", "!0S, !1S, !2S", 4),
43467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vadds,        0xee300a00,
43567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 7, 16, kFmtSfp, 5, 0,
43667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
43771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vadd", "!0s, !1s, !2s", 4),
43867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vaddd,        0xee300b00,
43967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 7, 16, kFmtDfp, 5, 0,
44067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
44171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vadd", "!0S, !1S, !2S", 4),
44267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vdivs,        0xee800a00,
44367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 7, 16, kFmtSfp, 5, 0,
44467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
44571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vdivs", "!0s, !1s, !2s", 4),
44667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vdivd,        0xee800b00,
44767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 7, 16, kFmtDfp, 5, 0,
44867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
44971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vdivd", "!0S, !1S, !2S", 4),
45067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtIF,       0xeeb80ac0,
45167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
45267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
45371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.f32", "!0s, !1s", 4),
45467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtID,       0xeeb80bc0,
45567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
45667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
45771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.f64", "!0S, !1s", 4),
45867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtFI,       0xeebd0ac0,
45967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
46067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
46171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.s32.f32 ", "!0s, !1s", 4),
46267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtDI,       0xeebd0bc0,
46367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
46467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
46571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.s32.f64 ", "!0s, !1S", 4),
46667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtFd,       0xeeb70ac0,
46767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
46867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
46971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.f64.f32 ", "!0S, !1s", 4),
47067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VcvtDF,       0xeeb70bc0,
47167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
47267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
47371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcvt.f32.f64 ", "!0s, !1S", 4),
47467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vsqrts,       0xeeb10ac0,
47567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
47667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
47771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vsqrt.f32 ", "!0s, !1s", 4),
47867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vsqrtd,       0xeeb10bc0,
47967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
48067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
48171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vsqrt.f64 ", "!0S, !1S", 4),
48267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovImmShift, 0xf04f0000, /* no setflags encoding */
48367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtModImm, -1, -1, kFmtUnused, -1, -1,
48467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0,
48571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, #!1m", 4),
48667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovImm16,       0xf2400000,
48767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtImm16, -1, -1, kFmtUnused, -1, -1,
48867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0,
48971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, #!1M", 4),
49067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrRRI12,       0xf8c00000,
49167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
49267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
49371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "str", "!0C, [!1C, #!2d]", 4),
49467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrRRI12,       0xf8d00000,
49567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
49667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
49771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [!1C, #!2d]", 4),
49867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrRRI8Predec,       0xf8400c00,
49967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 8, 0,
50067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
50171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "str", "!0C, [!1C, #-!2d]", 4),
50267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrRRI8Predec,       0xf8500c00,
50367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 8, 0,
50467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
50571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [!1C, #-!2d]", 4),
50667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Cbnz,       0xb900, /* Note: does not affect flags */
50767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtImm6, -1, -1, kFmtUnused, -1, -1,
5085abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE0 | IS_BRANCH |
50971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 NEEDS_FIXUP, "cbnz", "!0C,!1t", 2),
51067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Cbz,       0xb100, /* Note: does not affect flags */
51167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 2, 0, kFmtImm6, -1, -1, kFmtUnused, -1, -1,
5125abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE0 | IS_BRANCH |
51371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 NEEDS_FIXUP, "cbz", "!0C,!1t", 2),
51467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AddRRI12,       0xf2000000,
51567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtImm12, -1, -1,
51667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
51767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1,/* Note: doesn't affect flags */
51871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "!0C,!1C,#!2d", 4),
51967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovRR,       0xea4f0000, /* no setflags encoding */
52067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtUnused, -1, -1,
52167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
52271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, !1C", 4),
52367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovs,       0xeeb00a40,
52467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
52567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
52671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f32 ", " !0s, !1s", 4),
52767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovd,       0xeeb00b40,
52867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
52967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
53071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f64 ", " !0S, !1S", 4),
53167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Ldmia,         0xe8900000,
53267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 15, 0, kFmtUnused, -1, -1,
53367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
53467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | REG_DEF_LIST1 | IS_LOAD,
53571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldmia", "!0C!!, <!1R>", 4),
53667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Stmia,         0xe8800000,
53767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 15, 0, kFmtUnused, -1, -1,
53867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
53967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | REG_USE_LIST1 | IS_STORE,
54071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "stmia", "!0C!!, <!1R>", 4),
54167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AddRRR,  0xeb100000, /* setflags encoding */
54267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
54367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1,
54467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES,
54571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adds", "!0C, !1C, !2C!3H", 4),
54667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SubRRR,       0xebb00000, /* setflags enconding */
54767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
54867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1,
54967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES,
55071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C, !1C, !2C!3H", 4),
55167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SbcRRR,       0xeb700000, /* setflags encoding */
55267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
55367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1,
55467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0_USE12 | USES_CCODES | SETS_CCODES,
55571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sbcs", "!0C, !1C, !2C!3H", 4),
55667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2CmpRR,       0xebb00f00,
55767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1,
55867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
55967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_USE01 | SETS_CCODES,
56071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, !1C", 4),
56167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SubRRI12,       0xf2a00000,
56267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtImm12, -1, -1,
56367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
56467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1,/* Note: doesn't affect flags */
56571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sub", "!0C,!1C,#!2d", 4),
56658f9274efe66535255a70327022b8f586d334843buzbee    ENCODING_MAP(kThumb2MvnImm12,  0xf06f0000, /* no setflags encoding */
56758f9274efe66535255a70327022b8f586d334843buzbee                 kFmtBitBlt, 11, 8, kFmtImm12, -1, -1, kFmtUnused, -1, -1,
56867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0,
56971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mvn", "!0C, #!1n", 4),
57067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Sel,       0xfaa0f080,
57167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
57267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
57367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE12 | USES_CCODES,
57471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sel", "!0C, !1C, !2C", 4),
57567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Ubfx,       0xf3c00000,
57667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtLsb, -1, -1,
57767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBWidth, 4, 0, IS_QUAD_OP | REG_DEF0_USE1,
57871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ubfx", "!0C, !1C, #!2d, #!3d", 4),
57967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Sbfx,       0xf3400000,
58067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtLsb, -1, -1,
58167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBWidth, 4, 0, IS_QUAD_OP | REG_DEF0_USE1,
58271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sbfx", "!0C, !1C, #!2d, #!3d", 4),
58367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrRRR,    0xf8500000,
58467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
58567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_DEF0_USE12 | IS_LOAD,
58671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [!1C, !2C, LSL #!3d]", 4),
58767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrhRRR,    0xf8300000,
58867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
58967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_DEF0_USE12 | IS_LOAD,
59071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrh", "!0C, [!1C, !2C, LSL #!3d]", 4),
59167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrshRRR,    0xf9300000,
59267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
59367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_DEF0_USE12 | IS_LOAD,
59471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsh", "!0C, [!1C, !2C, LSL #!3d]", 4),
59567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrbRRR,    0xf8100000,
59667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
59767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_DEF0_USE12 | IS_LOAD,
59871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrb", "!0C, [!1C, !2C, LSL #!3d]", 4),
59967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrsbRRR,    0xf9100000,
60067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
60167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_DEF0_USE12 | IS_LOAD,
60271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsb", "!0C, [!1C, !2C, LSL #!3d]", 4),
60367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrRRR,    0xf8400000,
60467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
60567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_USE012 | IS_STORE,
60671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "str", "!0C, [!1C, !2C, LSL #!3d]", 4),
60767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrhRRR,    0xf8200000,
60867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
60967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_USE012 | IS_STORE,
61071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strh", "!0C, [!1C, !2C, LSL #!3d]", 4),
61167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrbRRR,    0xf8000000,
61267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
61367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 5, 4, IS_QUAD_OP | REG_USE012 | IS_STORE,
61471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strb", "!0C, [!1C, !2C, LSL #!3d]", 4),
61567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrhRRI12,       0xf8b00000,
61667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
61767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
61871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrh", "!0C, [!1C, #!2d]", 4),
61967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrshRRI12,       0xf9b00000,
62067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
62167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
62271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsh", "!0C, [!1C, #!2d]", 4),
62367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrbRRI12,       0xf8900000,
62467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
62567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
62671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrb", "!0C, [!1C, #!2d]", 4),
62767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrsbRRI12,       0xf9900000,
62867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
62967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
63071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrsb", "!0C, [!1C, #!2d]", 4),
63167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrhRRI12,       0xf8a00000,
63267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
63367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
63471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strh", "!0C, [!1C, #!2d]", 4),
63567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2StrbRRI12,       0xf8800000,
63667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 11, 0,
63767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_USE01 | IS_STORE,
63871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strb", "!0C, [!1C, #!2d]", 4),
63967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Pop,           0xe8bd0000,
64067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
64167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
64267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_DEF_LIST0
64371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD | NEEDS_FIXUP, "pop", "<!0R>", 4),
64467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Push,          0xe92d0000,
64567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
64667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
64767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_USE_LIST0
64871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE | NEEDS_FIXUP, "push", "<!0R>", 4),
6494ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    ENCODING_MAP(kThumb2CmpRI12, 0xf1b00f00,
65067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtModImm, -1, -1, kFmtUnused, -1, -1,
65167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
65267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_USE0 | SETS_CCODES,
65371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmp", "!0C, #!1m", 4),
65467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AdcRRR,  0xeb500000, /* setflags encoding */
65567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
65667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1,
65767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES,
65871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adcs", "!0C, !1C, !2C!3H", 4),
65967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AndRRR,  0xea000000,
66067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
66167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12,
66271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "and", "!0C, !1C, !2C!3H", 4),
66367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2BicRRR,  0xea200000,
66467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
66567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12,
66671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bic", "!0C, !1C, !2C!3H", 4),
66767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2CmnRR,  0xeb000000,
66867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1,
66967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
67067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
67171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "cmn", "!0C, !1C, shift !2d", 4),
67267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2EorRRR,  0xea800000,
67367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
67467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12,
67571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "eor", "!0C, !1C, !2C!3H", 4),
67667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MulRRR,  0xfb00f000,
67767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
67867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
67971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mul", "!0C, !1C, !2C", 4),
68067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MnvRR,  0xea6f0000,
68167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtShift, -1, -1,
68267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
68371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mvn", "!0C, !1C, shift !2d", 4),
68467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2RsubRRI8,       0xf1d00000,
68567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
68667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
68767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
68871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "rsb", "!0C,!1C,#!2m", 4),
68967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2NegRR,       0xf1d00000, /* instance of rsub */
69067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtUnused, -1, -1,
69167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
69267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE1 | SETS_CCODES,
69371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "neg", "!0C,!1C", 4),
69467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2OrrRRR,  0xea400000,
69567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
69667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12,
69771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "orr", "!0C, !1C, !2C!3H", 4),
69867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2TstRR,       0xea100f00,
69967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1,
70067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
70167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_USE01 | SETS_CCODES,
70271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "tst", "!0C, !1C, shift !2d", 4),
70367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LslRRR,  0xfa00f000,
70467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
70567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
70671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsl", "!0C, !1C, !2C", 4),
70767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LsrRRR,  0xfa20f000,
70867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
70967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
71071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsr", "!0C, !1C, !2C", 4),
71167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AsrRRR,  0xfa40f000,
71267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
71367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
71471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "asr", "!0C, !1C, !2C", 4),
71567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2RorRRR,  0xfa60f000,
71667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
71767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
71871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ror", "!0C, !1C, !2C", 4),
71967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LslRRI5,  0xea4f0000,
72067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtShift5, -1, -1,
72167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
72271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsl", "!0C, !1C, #!2d", 4),
72367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LsrRRI5,  0xea4f0010,
72467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtShift5, -1, -1,
72567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
72671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "lsr", "!0C, !1C, #!2d", 4),
72767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AsrRRI5,  0xea4f0020,
72867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtShift5, -1, -1,
72967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
73071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "asr", "!0C, !1C, #!2d", 4),
73167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2RorRRI5,  0xea4f0030,
73267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 3, 0, kFmtShift5, -1, -1,
73367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
73471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ror", "!0C, !1C, #!2d", 4),
73567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2BicRRI8,  0xf0200000,
73667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
73767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
73871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bic", "!0C, !1C, #!2m", 4),
73967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AndRRI8,  0xf0000000,
74067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
74167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
74271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "and", "!0C, !1C, #!2m", 4),
74367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2OrrRRI8,  0xf0400000,
74467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
74567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
74671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "orr", "!0C, !1C, #!2m", 4),
74767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2EorRRI8,  0xf0800000,
74867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
74967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1,
75071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "eor", "!0C, !1C, #!2m", 4),
75167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AddRRI8,  0xf1100000,
75267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
75367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
75467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
75571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adds", "!0C, !1C, #!2m", 4),
75667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AdcRRI8,  0xf1500000,
75767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
75867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
75967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES | USES_CCODES,
76071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adcs", "!0C, !1C, #!2m", 4),
76167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SubRRI8,  0xf1b00000,
76267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
76367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
76467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
76571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C, !1C, #!2m", 4),
76667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SbcRRI8,  0xf1700000,
76767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtModImm, -1, -1,
76867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
76967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES | USES_CCODES,
77071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "sbcs", "!0C, !1C, #!2m", 4),
77167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2It,  0xbf00,
77267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 4, kFmtBitBlt, 3, 0, kFmtModImm, -1, -1,
77367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | IS_IT | USES_CCODES,
77471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "it:!1b", "!0c", 2),
77567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Fmstat,  0xeef1fa10,
77667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
77767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, NO_OPERAND | SETS_CCODES,
77871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "fmstat", "", 4),
77967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vcmpd,        0xeeb40b40,
78067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
78167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01,
78271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcmp.f64", "!0S, !1S", 4),
78367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vcmps,        0xeeb40a40,
78467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
78567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_USE01,
78671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vcmp.f32", "!0s, !1s", 4),
78767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrPcRel12,       0xf8df0000,
78867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 0, kFmtUnused, -1, -1,
78967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
7905abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 IS_TERTIARY_OP | REG_DEF0 | REG_USE_PC | IS_LOAD | NEEDS_FIXUP,
79171ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [r15pc, #!1d]", 4),
79267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2BCond,        0xf0008000,
79367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBrOffset, -1, -1, kFmtBitBlt, 25, 22, kFmtUnused, -1, -1,
79467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
7955abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 IS_BINARY_OP | IS_BRANCH | USES_CCODES | NEEDS_FIXUP,
79671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "b!1c", "!0t", 4),
79767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovd_RR,       0xeeb00b40,
79867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
79967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
80071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f64", "!0S, !1S", 4),
80167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovs_RR,       0xeeb00a40,
80267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
80367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
80471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f32", "!0s, !1s", 4),
80567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Fmrs,       0xee100a10,
80667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtSfp, 7, 16, kFmtUnused, -1, -1,
80767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
80871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "fmrs", "!0C, !1s", 4),
80967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Fmsr,       0xee000a10,
81067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 7, 16, kFmtBitBlt, 15, 12, kFmtUnused, -1, -1,
81167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
81271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "fmsr", "!0s, !1C", 4),
81367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Fmrrd,       0xec500b10,
81467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtDfp, 5, 0,
81567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF01_USE2,
81671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "fmrrd", "!0C, !1C, !2S", 4),
81767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Fmdrr,       0xec400b10,
81867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 5, 0, kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16,
81967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12,
82071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "fmdrr", "!0S, !1C, !2C", 4),
82167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vabsd,       0xeeb00bc0,
82267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
82367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
82471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vabs.f64", "!0S, !1S", 4),
82567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vabss,       0xeeb00ac0,
82667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
82767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
82871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vabs.f32", "!0s, !1s", 4),
82967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vnegd,       0xeeb10b40,
83067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtDfp, 5, 0, kFmtUnused, -1, -1,
83167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
83271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vneg.f64", "!0S, !1S", 4),
83367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vnegs,       0xeeb10a40,
83467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtSfp, 5, 0, kFmtUnused, -1, -1,
83567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
83671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vneg.f32", "!0s, !1s", 4),
83767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovs_IMM8,       0xeeb00a00,
83867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtSfp, 22, 12, kFmtFPImm, 16, 0, kFmtUnused, -1, -1,
83967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0,
84071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f32", "!0s, #0x!1h", 4),
84167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vmovd_IMM8,       0xeeb00b00,
84267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtDfp, 22, 12, kFmtFPImm, 16, 0, kFmtUnused, -1, -1,
84367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0,
84471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "vmov.f64", "!0S, #0x!1h", 4),
84567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Mla,  0xfb000000,
84667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
84767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12,
84867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0 | REG_USE1 | REG_USE2 | REG_USE3,
84971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mla", "!0C, !1C, !2C, !3C", 4),
85067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Umull,  0xfba00000,
85167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16,
85267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 3, 0,
85367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_QUAD_OP | REG_DEF0 | REG_DEF1 | REG_USE2 | REG_USE3,
85471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "umull", "!0C, !1C, !2C, !3C", 4),
85567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Ldrex,       0xe8500f00,
85667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16, kFmtBitBlt, 7, 0,
85767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE1 | IS_LOAD,
85871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldrex", "!0C, [!1C, #!2E]", 4),
85967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Strex,       0xe8400000,
86067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 15, 12, kFmtBitBlt, 19, 16,
86167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 0, IS_QUAD_OP | REG_DEF0_USE12 | IS_STORE,
86271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "strex", "!0C,!1C, [!2C, #!2E]", 4),
86367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Clrex,       0xf3bf8f2f,
86467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
86567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, NO_OPERAND,
86671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "clrex", "", 4),
86767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Bfi,         0xf3600000,
86867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtShift5, -1, -1,
86967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 4, 0, IS_QUAD_OP | REG_DEF0_USE1,
87071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bfi", "!0C,!1C,#!2d,#!3d", 4),
87167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Bfc,         0xf36f0000,
87267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtShift5, -1, -1, kFmtBitBlt, 4, 0,
87367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0,
87471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "bfc", "!0C,#!1d,#!2d", 4),
87567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Dmb,         0xf3bf8f50,
87667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 3, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
87767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, IS_UNARY_OP,
878b1eba213afaf7fa6445de863ddc9680ab99762eaBrian Carlstrom                 "dmb", "#!0B", 4),
87967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdrPcReln12,       0xf85f0000,
88067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 0, kFmtUnused, -1, -1,
88167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
88267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0 | REG_USE_PC | IS_LOAD,
88371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldr", "!0C, [r15pc, -#!1d]", 4),
88467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Stm,          0xe9000000,
88567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 12, 0, kFmtUnused, -1, -1,
88667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
88767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_USE0 | REG_USE_LIST1 | IS_STORE,
88871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "stm", "!0C, <!1R>", 4),
88967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumbUndefined,       0xde00,
89067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
89167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, NO_OPERAND,
89271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "undefined", "", 2),
89367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    // NOTE: vpop, vpush hard-encoded for s16+ reg list
89467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VPopCS,       0xecbd8a00,
89567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
89667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
89767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_DEF_FPCS_LIST0
89871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD, "vpop", "<!0P>", 4),
89967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2VPushCS,      0xed2d8a00,
90067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 7, 0, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
90167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
90267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_USE_FPCS_LIST0
90371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE, "vpush", "<!0P>", 4),
90467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vldms,        0xec900a00,
90567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtSfp, 22, 12, kFmtBitBlt, 7, 0,
90667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
90767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_USE0 | REG_DEF_FPCS_LIST2
90871ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD, "vldms", "!0C, <!2Q>", 4),
90967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2Vstms,        0xec800a00,
91067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtSfp, 22, 12, kFmtBitBlt, 7, 0,
91167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
91267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_USE0 | REG_USE_FPCS_LIST2
91371ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE, "vstms", "!0C, <!2Q>", 4),
91467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2BUncond,      0xf0009000,
91567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtOff24, -1, -1, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
91667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1, NO_OPERAND | IS_BRANCH,
91771ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "b", "!0t", 4),
91867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovImm16H,       0xf2c00000,
91967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtImm16, -1, -1, kFmtUnused, -1, -1,
9204ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0 | REG_USE0,
9214ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 "movt", "!0C, #!1M", 4),
92267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2AddPCR,      0x4487,
92367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 6, 3, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
92467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
92567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_UNARY_OP | REG_USE0 | IS_BRANCH,
92671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "add", "rPC, !0C", 2),
92703fa263ba90e9f6b11231576c6b9cc434e67141dbuzbee    ENCODING_MAP(kThumb2Adr,         0xf20f0000,
92867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtImm12, -1, -1, kFmtUnused, -1, -1,
92967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
9305abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 /* Note: doesn't affect flags */
9315abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 IS_TERTIARY_OP | REG_DEF0 | NEEDS_FIXUP,
93271ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "adr", "!0C,#!1d", 4),
93367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovImm16LST,     0xf2400000,
93467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtImm16, -1, -1, kFmtUnused, -1, -1,
9355abfa3ea35781464df8fae60aaf03f48a295e965buzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0 | NEEDS_FIXUP,
93671ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "mov", "!0C, #!1M", 4),
93767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2MovImm16HST,     0xf2c00000,
93867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtImm16, -1, -1, kFmtUnused, -1, -1,
9394ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0 | REG_USE0 | NEEDS_FIXUP,
9404ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 "movt", "!0C, #!1M", 4),
94167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2LdmiaWB,         0xe8b00000,
94267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 19, 16, kFmtBitBlt, 15, 0, kFmtUnused, -1, -1,
94367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
94467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_BINARY_OP | REG_DEF0_USE0 | REG_DEF_LIST1 | IS_LOAD,
94571ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "ldmia", "!0C!!, <!1R>", 4),
94667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    ENCODING_MAP(kThumb2SubsRRI12,       0xf1b00000,
94767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtImm12, -1, -1,
94867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 kFmtUnused, -1, -1,
94967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee                 IS_TERTIARY_OP | REG_DEF0_USE1 | SETS_CCODES,
95071ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "subs", "!0C,!1C,#!2d", 4),
95158f9274efe66535255a70327022b8f586d334843buzbee    ENCODING_MAP(kThumb2OrrRRRs,  0xea500000,
95258f9274efe66535255a70327022b8f586d334843buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
95358f9274efe66535255a70327022b8f586d334843buzbee                 kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES,
95471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 "orrs", "!0C, !1C, !2C!3H", 4),
955e70708051e06119c04be33ca49fb16bef8162059buzbee    ENCODING_MAP(kThumb2Push1,    0xf84d0d04,
956e70708051e06119c04be33ca49fb16bef8162059buzbee                 kFmtBitBlt, 15, 12, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
957e70708051e06119c04be33ca49fb16bef8162059buzbee                 kFmtUnused, -1, -1,
958e70708051e06119c04be33ca49fb16bef8162059buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_USE0
95971ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_STORE, "push1", "!0C", 4),
960e70708051e06119c04be33ca49fb16bef8162059buzbee    ENCODING_MAP(kThumb2Pop1,    0xf85d0b04,
961e70708051e06119c04be33ca49fb16bef8162059buzbee                 kFmtBitBlt, 15, 12, kFmtUnused, -1, -1, kFmtUnused, -1, -1,
962e70708051e06119c04be33ca49fb16bef8162059buzbee                 kFmtUnused, -1, -1,
963e70708051e06119c04be33ca49fb16bef8162059buzbee                 IS_UNARY_OP | REG_DEF_SP | REG_USE_SP | REG_DEF0
96471ac99485e79ad7eb1ba3ea2d404d53bb5784c13buzbee                 | IS_LOAD, "pop1", "!0C", 4),
965f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee    ENCODING_MAP(kThumb2RsubRRR,  0xebd00000, /* setflags encoding */
966f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0,
967f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 kFmtShift, -1, -1,
968f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES,
969f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 "rsbs", "!0C, !1C, !2C!3H", 4),
970f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee    ENCODING_MAP(kThumb2Smull,  0xfb800000,
971f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16,
972f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 kFmtBitBlt, 3, 0,
973f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 IS_QUAD_OP | REG_DEF0 | REG_DEF1 | REG_USE2 | REG_USE3,
974f3aac973bb944885a1a4779ba04a97faa88b7ed0buzbee                 "smull", "!0C, !1C, !2C, !3C", 4),
9754ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    ENCODING_MAP(kThumb2LdrdPcRel8,  0xe9df0000,
9764ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 8, kFmtBitBlt, 7, 0,
9774ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtUnused, -1, -1,
9784ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 IS_TERTIARY_OP | REG_DEF0 | REG_DEF1 | REG_USE_PC | IS_LOAD | NEEDS_FIXUP,
9794ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 "ldrd", "!0C, !1C, [pc, #!2E]", 4),
9804ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    ENCODING_MAP(kThumb2LdrdI8, 0xe9d00000,
9814ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16,
9824ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtBitBlt, 7, 0,
9834ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 IS_QUAD_OP | REG_DEF0 | REG_DEF1 | REG_USE2 | IS_LOAD,
9844ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 "ldrd", "!0C, !1C, [!2C, #!3E]", 4),
9854ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    ENCODING_MAP(kThumb2StrdI8, 0xe9c00000,
9864ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtBitBlt, 15, 12, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16,
9874ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 kFmtBitBlt, 7, 0,
9884ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 IS_QUAD_OP | REG_USE0 | REG_USE1 | REG_USE2 | IS_STORE,
9894ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                 "strd", "!0C, !1C, [!2C, #!3E]", 4),
99067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee};
99167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
99267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/*
99367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * The fake NOP of moving r0 to r0 actually will incur data stalls if r0 is
99467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * not ready. Since r5FP is not updated often, it is less likely to
99567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * generate unnecessary stall cycles.
99667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * TUNING: No longer true - find new NOP pattern.
99767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
99867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee#define PADDING_MOV_R5_R5               0x1C2D
99967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
100067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/*
100167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Assemble the LIR into binary instruction format.  Note that we may
100267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * discover that pc-relative displacements may not fit the selected
100367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * instruction.
100467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
10052ce745c06271d5223d57dbf08117b20d5b60694aBrian CarlstromAssemblerStatus ArmMir2Lir::AssembleInstructions(uintptr_t start_addr) {
1006a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  LIR* lir;
1007a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  AssemblerStatus res = kSuccess;  // Assume success
100867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
10091fd3346740dfb7f47be9922312b68a4227fada96buzbee  for (lir = first_lir_insn_; lir != NULL; lir = NEXT_LIR(lir)) {
1010a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    if (lir->opcode < 0) {
1011a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      /* 1 means padding is needed */
1012a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      if ((lir->opcode == kPseudoPseudoAlign4) && (lir->operands[0] == 1)) {
10131fd3346740dfb7f47be9922312b68a4227fada96buzbee        code_buffer_.push_back(PADDING_MOV_R5_R5 & 0xFF);
10141fd3346740dfb7f47be9922312b68a4227fada96buzbee        code_buffer_.push_back((PADDING_MOV_R5_R5 >> 8) & 0xFF);
1015a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
1016a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
1017a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
101867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1019fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (lir->flags.is_nop) {
1020a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
1021a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
102267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1023a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /*
1024a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * For PC-relative displacements we won't know if the
1025a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * selected instruction will work until late (i.e. - now).
1026a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * If something doesn't fit, we must replace the short-form
1027a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * operation with a longer-form one.  Note, though, that this
1028a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * can change code we've already processed, so we'll need to
1029a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * re-calculate offsets and restart.  To limit the number of
1030a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * restarts, the entire list will be scanned and patched.
1031a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Of course, the patching itself may cause new overflows so this
1032a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * is an iterative process.
1033a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
1034a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    if (lir->flags.pcRelFixup) {
1035a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      if (lir->opcode == kThumbLdrPcRel ||
1036a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode == kThumb2LdrPcRel12 ||
1037a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode == kThumbAddPcRel ||
10384ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          lir->opcode == kThumb2LdrdPcRel8 ||
1039a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          ((lir->opcode == kThumb2Vldrd) && (lir->operands[1] == r15pc)) ||
1040a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          ((lir->opcode == kThumb2Vldrs) && (lir->operands[1] == r15pc))) {
104167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee        /*
1042a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee         * PC-relative loads are mostly used to load immediates
1043a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee         * that are too large to materialize directly in one shot.
1044a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee         * However, if the load displacement exceeds the limit,
10454ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee         * we revert to a multiple-instruction materialization sequence.
104667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee         */
1047fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        LIR *lir_target = lir->target;
1048cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t pc = (lir->offset + 4) & ~3;
1049fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t target = lir_target->offset;
1050a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        int delta = target - pc;
1051a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (delta & 0x3) {
1052a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          LOG(FATAL) << "PC-rel offset not multiple of 4: " << delta;
1053a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1054a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        // First, a sanity check for cases we shouldn't see now
1055a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (((lir->opcode == kThumbAddPcRel) && (delta > 1020)) ||
1056a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            ((lir->opcode == kThumbLdrPcRel) && (delta > 1020))) {
1057a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          // Shouldn't happen in current codegen.
1058a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          LOG(FATAL) << "Unexpected pc-rel offset " << delta;
1059a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
10604ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        // Now, check for the difficult cases
1061a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (((lir->opcode == kThumb2LdrPcRel12) && (delta > 4091)) ||
10624ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            ((lir->opcode == kThumb2LdrdPcRel8) && (delta > 1020)) ||
1063a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            ((lir->opcode == kThumb2Vldrs) && (delta > 1020)) ||
1064a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            ((lir->opcode == kThumb2Vldrd) && (delta > 1020))) {
1065a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /*
1066f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee           * Note: because rARM_LR may be used to fix up out-of-range
1067a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * vldrs/vldrd we include REG_DEF_LR in the resource
1068a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * masks for these instructions.
1069a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           */
10704ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          int base_reg = ((lir->opcode == kThumb2LdrdPcRel8) || (lir->opcode == kThumb2LdrPcRel12))
10714ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee              ?  lir->operands[0] : rARM_LR;
107203fa263ba90e9f6b11231576c6b9cc434e67141dbuzbee
10734ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          // Add new Adr to generate the address.
10741fd3346740dfb7f47be9922312b68a4227fada96buzbee          LIR* new_adr = RawLIR(lir->dalvik_offset, kThumb2Adr,
1075fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                     base_reg, 0, 0, 0, 0, lir->target);
1076fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          InsertLIRBefore(lir, new_adr);
107703fa263ba90e9f6b11231576c6b9cc434e67141dbuzbee
10784ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          // Convert to normal load.
1079a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          if (lir->opcode == kThumb2LdrPcRel12) {
1080a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            lir->opcode = kThumb2LdrRRI12;
10814ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          } else if (lir->opcode == kThumb2LdrdPcRel8) {
10824ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            lir->opcode = kThumb2LdrdI8;
10834ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          }
10844ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          // Change the load to be relative to the new Adr base.
10854ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          if (lir->opcode == kThumb2LdrdI8) {
10864ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            lir->operands[3] = 0;
10874ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            lir->operands[2] = base_reg;
10884ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee          } else {
10894ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            lir->operands[2] = 0;
10904ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            lir->operands[1] = base_reg;
1091a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          }
10921fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1093a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1094a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        } else {
1095a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          if ((lir->opcode == kThumb2Vldrs) ||
10964ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee              (lir->opcode == kThumb2Vldrd) ||
10974ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee              (lir->opcode == kThumb2LdrdPcRel8)) {
1098a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            lir->operands[2] = delta >> 2;
1099a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          } else {
1100a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            lir->operands[1] = (lir->opcode == kThumb2LdrPcRel12) ?  delta :
1101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                delta >> 2;
1102a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          }
1103a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2Cbnz || lir->opcode == kThumb2Cbz) {
1105fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        LIR *target_lir = lir->target;
1106cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t pc = lir->offset + 4;
1107fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t target = target_lir->offset;
1108a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        int delta = target - pc;
1109a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (delta > 126 || delta < 0) {
1110a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /*
1111a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * Convert to cmp rx,#0 / b[eq/ne] tgt pair
1112a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * Make new branch instruction and insert after
1113a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           */
1114fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          LIR* new_inst =
11151fd3346740dfb7f47be9922312b68a4227fada96buzbee            RawLIR(lir->dalvik_offset, kThumbBCond, 0,
1116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                   (lir->opcode == kThumb2Cbz) ? kArmCondEq : kArmCondNe,
1117a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                   0, 0, 0, lir->target);
1118fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          InsertLIRAfter(lir, new_inst);
1119a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* Convert the cb[n]z to a cmp rx, #0 ] */
1120a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode = kThumbCmpRI8;
1121a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* operand[0] is src1 in both cb[n]z & CmpRI8 */
1122a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[1] = 0;
1123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->target = 0;
11241fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1125a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1126a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        } else {
1127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[1] = delta >> 1;
1128a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1129a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2Push || lir->opcode == kThumb2Pop) {
1130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (__builtin_popcount(lir->operands[0]) == 1) {
1131a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /*
1132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * The standard push/pop multiple instruction
1133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * requires at least two registers in the list.
1134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * If we've got just one, switch to the single-reg
1135a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           * encoding.
1136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee           */
1137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode = (lir->opcode == kThumb2Push) ? kThumb2Push1 :
1138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee              kThumb2Pop1;
1139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          int reg = 0;
1140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          while (lir->operands[0]) {
1141a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            if (lir->operands[0] & 0x1) {
1142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee              break;
1143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            } else {
1144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee              reg++;
1145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee              lir->operands[0] >>= 1;
1146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            }
1147a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          }
1148a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[0] = reg;
11491fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1150a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1151a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1152a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumbBCond || lir->opcode == kThumb2BCond) {
1153fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        LIR *target_lir = lir->target;
1154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        int delta = 0;
1155fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        DCHECK(target_lir);
1156cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t pc = lir->offset + 4;
1157fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t target = target_lir->offset;
1158a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        delta = target - pc;
1159a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if ((lir->opcode == kThumbBCond) && (delta > 254 || delta < -256)) {
1160a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode = kThumb2BCond;
11611fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1162a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1163a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1164a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        lir->operands[0] = delta >> 1;
1165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2BUncond) {
1166fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        LIR *target_lir = lir->target;
1167cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t pc = lir->offset + 4;
1168fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t target = target_lir->offset;
1169a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        int delta = target - pc;
1170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        lir->operands[0] = delta >> 1;
11711fd3346740dfb7f47be9922312b68a4227fada96buzbee        if (!(cu_->disable_opt & (1 << kSafeOptimizations)) &&
1172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[0] == 0) {  // Useless branch
1173fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          lir->flags.is_nop = true;
1174a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1175a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1176a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumbBUncond) {
1177fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        LIR *target_lir = lir->target;
1178cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t pc = lir->offset + 4;
1179fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t target = target_lir->offset;
1180a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        int delta = target - pc;
1181a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (delta > 2046 || delta < -2048) {
1182a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          // Convert to Thumb2BCond w/ kArmCondAl
1183a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->opcode = kThumb2BUncond;
1184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[0] = 0;
11851fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1186a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
1187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        } else {
1188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[0] = delta >> 1;
11891fd3346740dfb7f47be9922312b68a4227fada96buzbee          if (!(cu_->disable_opt & (1 << kSafeOptimizations)) &&
1190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            lir->operands[0] == -1) {  // Useless branch
1191fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            lir->flags.is_nop = true;
1192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            res = kRetryAll;
1193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          }
1194a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumbBlx1) {
1196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        DCHECK(NEXT_LIR(lir)->opcode == kThumbBlx2);
1197fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        /* cur_pc is Thumb */
1198fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t cur_pc = (start_addr + lir->offset + 4) & ~3;
1199cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t target = lir->operands[1];
120067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        /* Match bit[1] in target with base */
1202fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        if (cur_pc & 0x2) {
1203a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          target |= 0x2;
1204a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
1205fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int delta = target - cur_pc;
1206a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        DCHECK((delta >= -(1<<22)) && (delta <= ((1<<22)-2)));
120767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1208a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        lir->operands[0] = (delta >> 12) & 0x7ff;
1209a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        NEXT_LIR(lir)->operands[0] = (delta>> 1) & 0x7ff;
1210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumbBl1) {
1211a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        DCHECK(NEXT_LIR(lir)->opcode == kThumbBl2);
1212fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        /* Both cur_pc and target are Thumb */
1213fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        uintptr_t cur_pc = start_addr + lir->offset + 4;
1214cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        uintptr_t target = lir->operands[1];
121567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1216fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int delta = target - cur_pc;
1217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        DCHECK((delta >= -(1<<22)) && (delta <= ((1<<22)-2)));
121867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
1219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        lir->operands[0] = (delta >> 12) & 0x7ff;
1220a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        NEXT_LIR(lir)->operands[0] = (delta>> 1) & 0x7ff;
1221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2Adr) {
1222fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        SwitchTable *tab_rec = reinterpret_cast<SwitchTable*>(lir->operands[2]);
1223cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        LIR* target = lir->target;
1224fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int target_disp = tab_rec ? tab_rec->offset
1225a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                    : target->offset;
1226fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int disp = target_disp - ((lir->offset + 4) & ~3);
1227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (disp < 4096) {
1228a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          lir->operands[1] = disp;
1229a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        } else {
1230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          // convert to ldimm16l, ldimm16h, add tgt, pc, operands[0]
123111ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee          // TUNING: if this case fires often, it can be improved.  Not expected to be common.
1232fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          LIR *new_mov16L =
12331fd3346740dfb7f47be9922312b68a4227fada96buzbee              RawLIR(lir->dalvik_offset, kThumb2MovImm16LST,
1234cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee                     lir->operands[0], 0, reinterpret_cast<uintptr_t>(lir),
1235fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                     reinterpret_cast<uintptr_t>(tab_rec), 0, lir->target);
1236fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          InsertLIRBefore(lir, new_mov16L);
1237fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          LIR *new_mov16H =
12381fd3346740dfb7f47be9922312b68a4227fada96buzbee              RawLIR(lir->dalvik_offset, kThumb2MovImm16HST,
1239cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee                     lir->operands[0], 0, reinterpret_cast<uintptr_t>(lir),
1240fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                     reinterpret_cast<uintptr_t>(tab_rec), 0, lir->target);
1241fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          InsertLIRBefore(lir, new_mov16H);
124211ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee          if (ARM_LOWREG(lir->operands[0])) {
124311ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee            lir->opcode = kThumbAddRRLH;
124411ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee          } else {
124511ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee            lir->opcode = kThumbAddRRHH;
124611ba0e9f6744cf1bdb5ebe2011eadadbc088eadebuzbee          }
1247f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee          lir->operands[1] = rARM_PC;
12481fd3346740dfb7f47be9922312b68a4227fada96buzbee          SetupResourceMasks(lir);
1249a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          res = kRetryAll;
125067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee        }
1251a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2MovImm16LST) {
1252fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        // operands[1] should hold disp, [2] has add, [3] has tab_rec
1253cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        LIR *addPCInst = reinterpret_cast<LIR*>(lir->operands[2]);
1254fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        SwitchTable *tab_rec = reinterpret_cast<SwitchTable*>(lir->operands[3]);
1255fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        // If tab_rec is null, this is a literal load. Use target
1256cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        LIR* target = lir->target;
1257fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int target_disp = tab_rec ? tab_rec->offset : target->offset;
1258fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        lir->operands[1] = (target_disp - (addPCInst->offset + 4)) & 0xffff;
1259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else if (lir->opcode == kThumb2MovImm16HST) {
1260fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        // operands[1] should hold disp, [2] has add, [3] has tab_rec
1261cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        LIR *addPCInst = reinterpret_cast<LIR*>(lir->operands[2]);
1262fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        SwitchTable *tab_rec = reinterpret_cast<SwitchTable*>(lir->operands[3]);
1263fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        // If tab_rec is null, this is a literal load. Use target
1264cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        LIR* target = lir->target;
1265fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        int target_disp = tab_rec ? tab_rec->offset : target->offset;
1266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        lir->operands[1] =
1267fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            ((target_disp - (addPCInst->offset + 4)) >> 16) & 0xffff;
1268a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
1269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
1270a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /*
1271a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * If one of the pc-relative instructions expanded we'll have
1272a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * to make another pass.  Don't bother to fully assemble the
1273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * instruction.
1274a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
1275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    if (res != kSuccess) {
1276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
1277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
1278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    const ArmEncodingMap *encoder = &EncodingMap[lir->opcode];
1279eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee    uint32_t bits = encoder->skeleton;
1280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    int i;
1281a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    for (i = 0; i < 4; i++) {
1282eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee      uint32_t operand;
1283eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee      uint32_t value;
1284a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      operand = lir->operands[i];
1285fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      switch (encoder->field_loc[i].kind) {
1286a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtUnused:
1287a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1288a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtFPImm:
1289fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value = ((operand & 0xF0) >> 4) << encoder->field_loc[i].end;
1290fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value |= (operand & 0x0F) << encoder->field_loc[i].start;
1291a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1292a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1293a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtBrOffset:
1294a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand  & 0x80000) >> 19) << 26;
1295a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0x40000) >> 18) << 11;
1296a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0x20000) >> 17) << 13;
1297a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0x1f800) >> 11) << 16;
1298a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= (operand  & 0x007ff);
1299a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1300a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1301a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtShift5:
1302a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x1c) >> 2) << 12;
1303a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= (operand & 0x03) << 6;
1304a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1305a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1306a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtShift:
1307a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x70) >> 4) << 12;
1308a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= (operand & 0x0f) << 4;
1309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1310a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1311a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtBWidth:
1312a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = operand - 1;
1313a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1314a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1315a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtLsb:
1316a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x1c) >> 2) << 12;
1317a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= (operand & 0x03) << 6;
1318a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1319a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1320a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtImm6:
1321a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x20) >> 5) << 9;
1322a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= (operand & 0x1f) << 3;
1323a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1324a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1325a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtBitBlt:
1326fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value = (operand << encoder->field_loc[i].start) &
1327fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee              ((1 << (encoder->field_loc[i].end + 1)) - 1);
1328a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1329a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtDfp: {
1331f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee          DCHECK(ARM_DOUBLEREG(operand));
1332748474146da0c6484fa3dca0a700f612d47550c3Elliott Hughes          DCHECK_EQ((operand & 0x1), 0U);
1333fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          int reg_name = (operand & ARM_FP_REG_MASK) >> 1;
1334a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* Snag the 1-bit slice and position it */
1335fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value = ((reg_name & 0x10) >> 4) << encoder->field_loc[i].end;
1336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* Extract and position the 4-bit slice */
1337fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value |= (reg_name & 0x0f) << encoder->field_loc[i].start;
1338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1339a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
134067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee        }
1341a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtSfp:
1342f0504cdc5b6400edd4b39eea64ac280465042d5bbuzbee          DCHECK(ARM_SINGLEREG(operand));
1343a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* Snag the 1-bit slice and position it */
1344fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value = (operand & 0x1) << encoder->field_loc[i].end;
1345a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          /* Extract and position the 4-bit slice */
1346fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          value |= ((operand & 0x1e) >> 1) << encoder->field_loc[i].start;
1347a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1348a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1349a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtImm12:
1350a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtModImm:
1351a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x800) >> 11) << 26;
1352a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0x700) >> 8) << 12;
1353a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= operand & 0x0ff;
1354a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1355a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1356a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtImm16:
1357a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = ((operand & 0x0800) >> 11) << 26;
1358a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0xf000) >> 12) << 16;
1359a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= ((operand & 0x0700) >> 8) << 12;
1360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value |= operand & 0x0ff;
1361a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1362a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1363a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        case kFmtOff24: {
1364eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t signbit = (operand >> 31) & 0x1;
1365eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t i1 = (operand >> 22) & 0x1;
1366eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t i2 = (operand >> 21) & 0x1;
1367eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t imm10 = (operand >> 11) & 0x03ff;
1368eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t imm11 = operand & 0x07ff;
1369eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t j1 = (i1 ^ signbit) ? 0 : 1;
1370eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee          uint32_t j2 = (i2 ^ signbit) ? 0 : 1;
1371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          value = (signbit << 26) | (j1 << 13) | (j2 << 11) | (imm10 << 16) |
1372a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee              imm11;
1373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          bits |= value;
1374a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          }
1375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee          break;
1376a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        default:
1377fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          LOG(FATAL) << "Bad fmt:" << encoder->field_loc[i].kind;
1378a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
137967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee    }
1380a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    if (encoder->size == 4) {
13811fd3346740dfb7f47be9922312b68a4227fada96buzbee      code_buffer_.push_back((bits >> 16) & 0xff);
13821fd3346740dfb7f47be9922312b68a4227fada96buzbee      code_buffer_.push_back((bits >> 24) & 0xff);
1383a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
13841fd3346740dfb7f47be9922312b68a4227fada96buzbee    code_buffer_.push_back(bits & 0xff);
13851fd3346740dfb7f47be9922312b68a4227fada96buzbee    code_buffer_.push_back((bits >> 8) & 0xff);
1386a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
1387a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return res;
138867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee}
138967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
13902ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromint ArmMir2Lir::GetInsnSize(LIR* lir) {
1391a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return EncodingMap[lir->opcode].size;
1392e88dfbf138bc204b1ce21911f1c34098ea74af7cbuzbee}
1393e88dfbf138bc204b1ce21911f1c34098ea74af7cbuzbee
139411d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes}  // namespace art
1395