14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*	$NetBSD: disassem.c,v 1.14 2003/03/27 16:58:36 mycroft Exp $	*/
24f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
34f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*-
44f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Copyright (c) 1996 Mark Brinicombe.
54f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Copyright (c) 1996 Brini.
64f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
74f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * All rights reserved.
84f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
94f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Redistribution and use in source and binary forms, with or without
104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * modification, are permitted provided that the following conditions
114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * are met:
124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    documentation and/or other materials provided with the distribution.
174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    must display the following acknowledgement:
194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *	This product includes software developed by Brini.
204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 4. The name of the company nor the name of the author may be used to
214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    endorse or promote products derived from this software without specific
224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *    prior written permission.
234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * SUCH DAMAGE.
354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * RiscBSD kernel project
374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * db_disasm.c
394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Kernel disassembler
414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Created      : 10/02/96
434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Structured after the sparc/sparc/db_disasm.c by David S. Miller &
454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Paul Kranenburg
464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * This code is not complete. Not all instructions are disassembled.
484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/cdefs.h>
514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/arm/arm/disassem.c,v 1.2 2005/01/05 21:58:47 imp Exp $");
524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/param.h>
534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <stdio.h>
544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include "disassem.h"
564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include "armreg.h"
574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//#include <ddb/ddb.h>
584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * General instruction format
614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *	insn[cc][mod]	[operands]
634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Those fields with an uppercase format code indicate that the field
654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * follows directly after the instruction before the separator i.e.
664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * they modify the instruction rather than just being an operand to
674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * the instruction. The only exception is the writeback flag which
684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * follows a operand.
694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 2 - print Operand 2 of a data processing instruction
724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * d - destination register (bits 12-15)
734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * n - n register (bits 16-19)
744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * s - s register (bits 8-11)
754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * o - indirect register rn (bits 16-19) (used by swap)
764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * m - m register (bits 0-3)
774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * a - address operand of ldr/str instruction
784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * e - address operand of ldrh/strh instruction
794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * l - register list for ldm/stm instruction
804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * f - 1st fp operand (register) (bits 12-14)
814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * g - 2nd fp operand (register) (bits 16-18)
824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * h - 3rd fp operand (register/immediate) (bits 0-4)
8396dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell * j - xtb rotate literal (bits 10-11)
844dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell * i - bfx lsb literal (bits 7-11)
854dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell * w - bfx width literal (bits 16-20)
864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * b - branch address
874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * t - thumb branch address (bits 24, 0-23)
884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * k - breakpoint comment (bits 0-3, 8-19)
894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * X - block transfer type
904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Y - block transfer type (r13 base)
914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * c - comment field bits(0-23)
924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * p - saved or current status register
934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * F - PSR transfer fields
944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * D - destination-is-r15 (P) flag on TST, TEQ, CMP, CMN
954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * L - co-processor transfer size
964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * S - set status flag
974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * P - fp precision
984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Q - fp precision (for ldf/stf)
994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * R - fp rounding
1004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * v - co-processor data transfer registers + addressing mode
1014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * W - writeback flag
1024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * x - instruction in hex
1034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * # - co-processor number
1044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * y - co-processor data processing registers
1054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * z - co-processor register transfer registers
1064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
1074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstruct arm32_insn {
1094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	u_int mask;
1104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	u_int pattern;
1114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	char* name;
1124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	char* format;
1134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
1144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic const struct arm32_insn arm32_i[] = {
1164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fffffff, 0x0ff00000, "imb",	"c" },		/* Before swi */
1174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fffffff, 0x0ff00001, "imbrange",	"c" },	/* Before swi */
1184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f000000, 0x0f000000, "swi",	"c" },
1194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xfe000000, 0xfa000000, "blx",	"t" },		/* Before b and bl */
1204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f000000, 0x0a000000, "b",	"b" },
1214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f000000, 0x0b000000, "bl",	"b" },
1224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00000090, "mul",	"Snms" },
1234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00200090, "mla",	"Snmsd" },
1244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00800090, "umull",	"Sdnms" },
1254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00c00090, "smull",	"Sdnms" },
1264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00a00090, "umlal",	"Sdnms" },
1274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fe000f0, 0x00e00090, "smlal",	"Sdnms" },
12896dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell    { 0x0fff03f0, 0x06cf0070, "uxtb16", "dmj" },
1294dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell    { 0x0fe00070, 0x07e00050, "ubfx",   "dmiw" },
1304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0d700000, 0x04200000, "strt",	"daW" },
1314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0d700000, 0x04300000, "ldrt",	"daW" },
1324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0d700000, 0x04600000, "strbt",	"daW" },
1334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0d700000, 0x04700000, "ldrbt",	"daW" },
1344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0c500000, 0x04000000, "str",	"daW" },
1354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0c500000, 0x04100000, "ldr",	"daW" },
1364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0c500000, 0x04400000, "strb",	"daW" },
1374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0c500000, 0x04500000, "ldrb",	"daW" },
1384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1f0000, 0x080d0000, "stm",	"YnWl" },/* separate out r13 base */
1394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1f0000, 0x081d0000, "ldm",	"YnWl" },/* separate out r13 base */
1404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100000, 0x08000000, "stm",	"XnWl" },
1414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100000, 0x08100000, "ldm",	"XnWl" },
1424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x00100090, "ldrb",	"deW" },
1434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x00000090, "strb",	"deW" },
1444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x001000d0, "ldrsb",	"deW" },
1454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x001000b0, "ldrh",	"deW" },
1464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x000000b0, "strh",	"deW" },
1474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000f0, 0x001000f0, "ldrsh",	"deW" },
1484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f200090, 0x00200090, "und",	"x" },	/* Before data processing */
1494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e1000d0, 0x000000d0, "und",	"x" },	/* Before data processing */
1504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01000090, "swp",	"dmo" },
1514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01400090, "swpb",	"dmo" },
1524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fbf0fff, 0x010f0000, "mrs",	"dp" },	/* Before data processing */
1534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fb0fff0, 0x0120f000, "msr",	"pFm" },/* Before data processing */
1544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fb0f000, 0x0320f000, "msr",	"pF2" },/* Before data processing */
1554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ffffff0, 0x012fff10, "bx",     "m" },
1564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0fff0ff0, 0x016f0f10, "clz",	"dm" },
1574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ffffff0, 0x012fff30, "blx",	"m" },
1584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xfff000f0, 0xe1200070, "bkpt",	"k" },
1594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00000000, "and",	"Sdn2" },
1604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00200000, "eor",	"Sdn2" },
1614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00400000, "sub",	"Sdn2" },
1624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00600000, "rsb",	"Sdn2" },
1634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00800000, "add",	"Sdn2" },
1644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00a00000, "adc",	"Sdn2" },
1654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00c00000, "sbc",	"Sdn2" },
1664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x00e00000, "rsc",	"Sdn2" },
1674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0df00000, 0x01100000, "tst",	"Dn2" },
1684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0df00000, 0x01300000, "teq",	"Dn2" },
1694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0df00000, 0x01500000, "cmp",	"Dn2" },
1704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0df00000, 0x01700000, "cmn",	"Dn2" },
1714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x01800000, "orr",	"Sdn2" },
1724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x01a00000, "mov",	"Sd2" },
1734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x01c00000, "bic",	"Sdn2" },
1744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0de00000, 0x01e00000, "mvn",	"Sd2" },
1754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e000100, "adf",	"PRfgh" },
1764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e100100, "muf",	"PRfgh" },
1774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e200100, "suf",	"PRfgh" },
1784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e300100, "rsf",	"PRfgh" },
1794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e400100, "dvf",	"PRfgh" },
1804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e500100, "rdf",	"PRfgh" },
1814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e600100, "pow",	"PRfgh" },
1824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e700100, "rpw",	"PRfgh" },
1834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e800100, "rmf",	"PRfgh" },
1844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e900100, "fml",	"PRfgh" },
1854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0ea00100, "fdv",	"PRfgh" },
1864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0eb00100, "frd",	"PRfgh" },
1874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0ec00100, "pol",	"PRfgh" },
1884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f008f10, 0x0e000100, "fpbop",	"PRfgh" },
1894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e008100, "mvf",	"PRfh" },
1904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e108100, "mnf",	"PRfh" },
1914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e208100, "abs",	"PRfh" },
1924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e308100, "rnd",	"PRfh" },
1934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e408100, "sqt",	"PRfh" },
1944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e508100, "log",	"PRfh" },
1954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e608100, "lgn",	"PRfh" },
1964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e708100, "exp",	"PRfh" },
1974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e808100, "sin",	"PRfh" },
1984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0e908100, "cos",	"PRfh" },
1994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0ea08100, "tan",	"PRfh" },
2004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0eb08100, "asn",	"PRfh" },
2014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0ec08100, "acs",	"PRfh" },
2024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff08f10, 0x0ed08100, "atn",	"PRfh" },
2034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f008f10, 0x0e008100, "fpuop",	"PRfh" },
2044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100f00, 0x0c000100, "stf",	"QLv" },
2054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100f00, 0x0c100100, "ldf",	"QLv" },
2064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e000110, "flt",	"PRgd" },
2074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e100110, "fix",	"PRdh" },
2084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e200110, "wfs",	"d" },
2094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e300110, "rfs",	"d" },
2104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e400110, "wfc",	"d" },
2114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00f10, 0x0e500110, "rfc",	"d" },
2124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0ff10, 0x0e90f110, "cmf",	"PRgh" },
2134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0ff10, 0x0eb0f110, "cnf",	"PRgh" },
2144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0ff10, 0x0ed0f110, "cmfe",	"PRgh" },
2154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0ff10, 0x0ef0f110, "cnfe",	"PRgh" },
2164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xff100010, 0xfe000010, "mcr2",	"#z" },
2174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f100010, 0x0e000010, "mcr",	"#z" },
2184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xff100010, 0xfe100010, "mrc2",	"#z" },
2194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f100010, 0x0e100010, "mrc",	"#z" },
2204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xff000010, 0xfe000000, "cdp2",	"#y" },
2214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0f000010, 0x0e000000, "cdp",	"#y" },
2224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xfe100090, 0xfc100000, "ldc2",	"L#v" },
2234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100090, 0x0c100000, "ldc",	"L#v" },
2244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xfe100090, 0xfc000000, "stc2",	"L#v" },
2254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0e100090, 0x0c000000, "stc",	"L#v" },
2264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0xf550f000, 0xf550f000, "pld",	"ne" },
2274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01000050, "qaad",	"dmn" },
2284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01400050, "qdaad",	"dmn" },
2294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01600050, "qdsub",	"dmn" },
2304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff00ff0, 0x01200050, "dsub",	"dmn" },
2314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x01000080, "smlabb",	"nmsd" },   // d & n inverted!!
2324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x010000a0, "smlatb",	"nmsd" },   // d & n inverted!!
2334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x010000c0, "smlabt",	"nmsd" },   // d & n inverted!!
2344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x010000e0, "smlatt",	"nmsd" },   // d & n inverted!!
2354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x01400080, "smlalbb","ndms" },   // d & n inverted!!
2364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x014000a0, "smlaltb","ndms" },   // d & n inverted!!
2374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x014000c0, "smlalbt","ndms" },   // d & n inverted!!
2384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x014000e0, "smlaltt","ndms" },   // d & n inverted!!
2394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x01200080, "smlawb", "nmsd" },   // d & n inverted!!
2404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x012000a0, "smulwb","nms" },   // d & n inverted!!
2414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff000f0, 0x012000c0, "smlawt", "nmsd" },   // d & n inverted!!
2424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x012000e0, "smulwt","nms" },   // d & n inverted!!
2434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x01600080, "smulbb","nms" },   // d & n inverted!!
2444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x016000a0, "smultb","nms" },   // d & n inverted!!
2454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x016000c0, "smulbt","nms" },   // d & n inverted!!
2464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x0ff0f0f0, 0x016000e0, "smultt","nms" },   // d & n inverted!!
2474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    { 0x00000000, 0x00000000, NULL,	NULL }
2484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const arm32_insn_conditions[][4] = {
2514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"eq", "ne", "cs", "cc",
2524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"mi", "pl", "vs", "vc",
2534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"hi", "ls", "ge", "lt",
2544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"gt", "le", "",   "nv"
2554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const insn_block_transfers[][4] = {
2584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"da", "ia", "db", "ib"
2594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const insn_stack_block_transfers[][4] = {
2624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"ed", "ea", "fd", "fa"
2634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const op_shifts[][4] = {
2664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"lsl", "lsr", "asr", "ror"
2674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const insn_fpa_rounding[][2] = {
2704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"", "p", "m", "z"
2714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const insn_fpa_precision[][2] = {
2744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"s", "d", "e", "p"
2754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic char const insn_fpaconstants[][8] = {
2784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"0.0", "1.0", "2.0", "3.0",
2794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	"4.0", "5.0", "0.5", "10.0"
2804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
2814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_condition(x)	arm32_insn_conditions[(x >> 28) & 0x0f]
2834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_blktrans(x)	insn_block_transfers[(x >> 23) & 3]
284f42d2fac2b09547295e353ddffb281aa7932403fMartyn Capewell#define insn_stkblktrans(x)	insn_stack_block_transfers[(3*((x >> 20)&1))^((x >> 23)&3)]
2854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define op2_shift(x)		op_shifts[(x >> 5) & 3]
2864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_fparnd(x)		insn_fpa_rounding[(x >> 5) & 0x03]
2874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_fpaprec(x)		insn_fpa_precision[(((x >> 18) & 2)|(x >> 7)) & 1]
2884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_fpaprect(x)	insn_fpa_precision[(((x >> 21) & 2)|(x >> 15)) & 1]
2894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define insn_fpaimm(x)		insn_fpaconstants[x & 0x07]
2904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* Local prototypes */
2924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disasm_register_shift(const disasm_interface_t *di, u_int insn);
2934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disasm_print_reglist(const disasm_interface_t *di, u_int insn);
2944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disasm_insn_ldrstr(const disasm_interface_t *di, u_int insn,
2954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    u_int loc);
2964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disasm_insn_ldrhstrh(const disasm_interface_t *di, u_int insn,
2974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    u_int loc);
2984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disasm_insn_ldcstc(const disasm_interface_t *di, u_int insn,
2994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    u_int loc);
3004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic u_int disassemble_readword(u_int address);
3014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void disassemble_printaddr(u_int address);
3024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectu_int
3044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm(const disasm_interface_t *di, u_int loc, int altfmt)
3054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
3064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	const struct arm32_insn *i_ptr = &arm32_i[0];
3074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	u_int insn;
3094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int matchp;
3104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int branch;
3114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	char* f_ptr;
3124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int fmt;
3134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	fmt = 0;
3154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	matchp = 0;
3164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	insn = di->di_readword(loc);
3174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*	di->di_printf("loc=%08x insn=%08x : ", loc, insn);*/
3194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	while (i_ptr->name) {
3214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if ((insn & i_ptr->mask) ==  i_ptr->pattern) {
3224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			matchp = 1;
3234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		}
3254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		i_ptr++;
3264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
3274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (!matchp) {
3294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("und%s\t%08x\n", insn_condition(insn), insn);
3304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		return(loc + INSN_SIZE);
3314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
3324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	/* If instruction forces condition code, don't print it. */
3344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if ((i_ptr->mask & 0xf0000000) == 0xf0000000)
3354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("%s", i_ptr->name);
3364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	else
3374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("%s%s", i_ptr->name, insn_condition(insn));
3384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	f_ptr = i_ptr->format;
3404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	/* Insert tab if there are no instruction modifiers */
3424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (*(f_ptr) < 'A' || *(f_ptr) > 'Z') {
3444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		++fmt;
3454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("\t");
3464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
3474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	while (*f_ptr) {
3494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		switch (*f_ptr) {
3504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* 2 - print Operand 2 of a data processing instruction */
3514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case '2':
3524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & 0x02000000) {
3534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				int rotate= ((insn >> 7) & 0x1e);
3544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("#0x%08x",
3564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project					      (insn & 0xff) << (32 - rotate) |
3574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project					      (insn & 0xff) >> rotate);
3584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			} else {
3594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				disasm_register_shift(di, insn);
3604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			}
3614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* d - destination register (bits 12-15) */
3634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'd':
3644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("r%d", ((insn >> 12) & 0x0f));
3654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* D - insert 'p' if Rd is R15 */
3674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'D':
3684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (((insn >> 12) & 0x0f) == 15)
3694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("p");
3704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* n - n register (bits 16-19) */
3724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'n':
3734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("r%d", ((insn >> 16) & 0x0f));
3744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* s - s register (bits 8-11) */
3764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 's':
3774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("r%d", ((insn >> 8) & 0x0f));
3784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* o - indirect register rn (bits 16-19) (used by swap) */
3804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'o':
3814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("[r%d]", ((insn >> 16) & 0x0f));
3824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* m - m register (bits 0-4) */
3844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'm':
3854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("r%d", ((insn >> 0) & 0x0f));
3864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* a - address operand of ldr/str instruction */
3884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'a':
3894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			disasm_insn_ldrstr(di, insn, loc);
3904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* e - address operand of ldrh/strh instruction */
3924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'e':
3934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			disasm_insn_ldrhstrh(di, insn, loc);
3944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* l - register list for ldm/stm instruction */
3964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'l':
3974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			disasm_print_reglist(di, insn);
3984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
3994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* f - 1st fp operand (register) (bits 12-14) */
4004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'f':
4014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("f%d", (insn >> 12) & 7);
4024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* g - 2nd fp operand (register) (bits 16-18) */
4044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'g':
4054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("f%d", (insn >> 16) & 7);
4064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* h - 3rd fp operand (register/immediate) (bits 0-4) */
4084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'h':
4094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 3))
4104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("#%s", insn_fpaimm(insn));
4114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			else
4124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("f%d", insn & 7);
4134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
41496dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell		/* j - xtb rotate literal (bits 10-11) */
41596dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell		case 'j':
41696dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell			di->di_printf("ror #%d", ((insn >> 10) & 3) << 3);
41796dbb4fc58fe2dcf4390e073dbb42cc77ef2f0b5Martyn Capewell			break;
4184dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell        /* i - bfx lsb literal (bits 7-11) */
4194dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell        case 'i':
4204dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell            di->di_printf("#%d", (insn >> 7) & 31);
4214dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell            break;
4224dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell        /* w - bfx width literal (bits 16-20) */
4234dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell        case 'w':
4244dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell            di->di_printf("#%d", 1 + ((insn >> 16) & 31));
4254dc1fa8e8d1f14868ab8bba93a8cbb87f847c4e3Martyn Capewell            break;
4264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* b - branch address */
4274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'b':
4284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			branch = ((insn << 2) & 0x03ffffff);
4294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (branch & 0x02000000)
4304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				branch |= 0xfc000000;
4314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printaddr(loc + 8 + branch);
4324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* t - blx address */
4344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 't':
4354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			branch = ((insn << 2) & 0x03ffffff) |
4364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn >> 23 & 0x00000002);
4374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (branch & 0x02000000)
4384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				branch |= 0xfc000000;
4394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printaddr(loc + 8 + branch);
4404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* X - block transfer type */
4424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'X':
4434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s", insn_blktrans(insn));
4444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* Y - block transfer type (r13 base) */
4464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'Y':
4474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s", insn_stkblktrans(insn));
4484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* c - comment field bits(0-23) */
4504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'c':
4514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("0x%08x", (insn & 0x00ffffff));
4524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* k - breakpoint comment (bits 0-3, 8-19) */
4544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'k':
4554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("0x%04x",
4564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn & 0x000fff00) >> 4 | (insn & 0x0000000f));
4574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* p - saved or current status register */
4594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'p':
4604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & 0x00400000)
4614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("spsr");
4624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			else
4634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("cpsr");
4644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* F - PSR transfer fields */
4664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'F':
4674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("_");
4684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 16))
4694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("c");
4704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 17))
4714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("x");
4724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 18))
4734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("s");
4744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 19))
4754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("f");
4764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* B - byte transfer flag */
4784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'B':
4794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & 0x00400000)
4804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("b");
4814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* L - co-processor transfer size */
4834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'L':
4844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 22))
4854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("l");
4864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* S - set status flag */
4884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'S':
4894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & 0x00100000)
4904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("s");
4914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* P - fp precision */
4934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'P':
4944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s", insn_fpaprec(insn));
4954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* Q - fp precision (for ldf/stf) */
4974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'Q':
4984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
4994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* R - fp rounding */
5004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'R':
5014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s", insn_fparnd(insn));
5024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* W - writeback flag */
5044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'W':
5054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 21))
5064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("!");
5074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* # - co-processor number */
5094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case '#':
5104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("p%d", (insn >> 8) & 0x0f);
5114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* v - co-processor data transfer registers+addressing mode */
5134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'v':
5144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			disasm_insn_ldcstc(di, insn, loc);
5154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* x - instruction in hex */
5174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'x':
5184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("0x%08x", insn);
5194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* y - co-processor data processing registers */
5214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'y':
5224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%d, ", (insn >> 20) & 0x0f);
5234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("c%d, c%d, c%d", (insn >> 12) & 0x0f,
5254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn >> 16) & 0x0f, insn & 0x0f);
5264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf(", %d", (insn >> 5) & 0x07);
5284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* z - co-processor register transfer registers */
5304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		case 'z':
5314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%d, ", (insn >> 21) & 0x07);
5324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("r%d, c%d, c%d, %d",
5334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn >> 12) & 0x0f, (insn >> 16) & 0x0f,
5344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    insn & 0x0f, (insn >> 5) & 0x07);
5354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*			if (((insn >> 5) & 0x07) != 0)
5374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf(", %d", (insn >> 5) & 0x07);*/
5384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		default:
5404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("[%c - unknown]", *f_ptr);
5414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			break;
5424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		}
5434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (*(f_ptr+1) >= 'A' && *(f_ptr+1) <= 'Z')
5444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			++f_ptr;
5454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		else if (*(++f_ptr)) {
5464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			++fmt;
5474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (fmt == 1)
5484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("\t");
5494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			else
5504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf(", ");
5514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		}
5524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	};
5534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("\n");
5554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	return(loc + INSN_SIZE);
5574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
5584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
5614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm_register_shift(const disasm_interface_t *di, u_int insn)
5624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
5634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("r%d", (insn & 0x0f));
5644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if ((insn & 0x00000ff0) == 0)
5654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		;
5664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	else if ((insn & 0x00000ff0) == 0x00000060)
5674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf(", rrx");
5684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	else {
5694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (insn & 0x10)
5704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf(", %s r%d", op2_shift(insn),
5714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn >> 8) & 0x0f);
5724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		else
5734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf(", %s #%d", op2_shift(insn),
5744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			    (insn >> 7) & 0x1f);
5754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
5764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
5774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
5804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm_print_reglist(const disasm_interface_t *di, u_int insn)
5814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
5824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int loop;
5834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int start;
5844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int comma;
5854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("{");
5874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	start = -1;
5884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	comma = 0;
5894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
5904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	for (loop = 0; loop < 17; ++loop) {
5914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (start != -1) {
5924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (loop == 16 || !(insn & (1 << loop))) {
5934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				if (comma)
5944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project					di->di_printf(", ");
5954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				else
5964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project					comma = 1;
5974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        			if (start == loop - 1)
5984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        				di->di_printf("r%d", start);
5994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        			else
6004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        				di->di_printf("r%d-r%d", start, loop - 1);
6014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        			start = -1;
6024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        		}
6034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        	} else {
6044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        		if (insn & (1 << loop))
6054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        			start = loop;
6064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        	}
6074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        }
6084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("}");
6094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (insn & (1 << 22))
6114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("^");
6124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
6134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
6154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm_insn_ldrstr(const disasm_interface_t *di, u_int insn, u_int loc)
6164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
6174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int offset;
6184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	offset = insn & 0xfff;
6204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if ((insn & 0x032f0000) == 0x010f0000) {
6214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* rA = pc, immediate index */
6224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (insn & 0x00800000)
6234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			loc += offset;
6244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		else
6254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			loc -= offset;
6264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printaddr(loc + 8);
6274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 	} else {
6284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("[r%d", (insn >> 16) & 0x0f);
6294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if ((insn & 0x03000fff) != 0x01000000) {
6304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]");
6314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (!(insn & 0x00800000))
6324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("-");
6334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 25))
6344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				disasm_register_shift(di, insn);
6354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			else
6364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("#0x%03x", offset);
6374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		}
6384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (insn & (1 << 24))
6394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("]");
6404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
6414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
6424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
6444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm_insn_ldrhstrh(const disasm_interface_t *di, u_int insn, u_int loc)
6454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
6464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	int offset;
6474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	offset = ((insn & 0xf00) >> 4) | (insn & 0xf);
6494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if ((insn & 0x004f0000) == 0x004f0000) {
6504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		/* rA = pc, immediate index */
6514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (insn & 0x00800000)
6524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			loc += offset;
6534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		else
6544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			loc -= offset;
6554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printaddr(loc + 8);
6564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 	} else {
6574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("[r%d", (insn >> 16) & 0x0f);
6584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if ((insn & 0x01400f0f) != 0x01400000) {
6594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]");
6604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (!(insn & 0x00800000))
6614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("-");
6624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			if (insn & (1 << 22))
6634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("#0x%02x", offset);
6644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			else
6654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project				di->di_printf("r%d", (insn & 0x0f));
6664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		}
6674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		if (insn & (1 << 24))
6684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project			di->di_printf("]");
6694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	}
6704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
6714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
6734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisasm_insn_ldcstc(const disasm_interface_t *di, u_int insn, u_int loc)
6744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
6754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (((insn >> 8) & 0xf) == 1)
6764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("f%d, ", (insn >> 12) & 0x07);
6774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	else
6784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("c%d, ", (insn >> 12) & 0x0f);
6794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("[r%d", (insn >> 16) & 0x0f);
6814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]");
6834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (!(insn & (1 << 23)))
6854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("-");
6864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	di->di_printf("#0x%03x", (insn & 0xff) << 2);
6884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (insn & (1 << 24))
6904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("]");
6914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	if (insn & (1 << 21))
6934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project		di->di_printf("!");
6944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
6954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
6964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic u_int
6974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisassemble_readword(u_int address)
6984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
6994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	return(*((u_int *)address));
7004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
7014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
7024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void
7034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisassemble_printaddr(u_int address)
7044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
7054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	printf("0x%08x", address);
7064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
7074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
7084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic const disasm_interface_t disassemble_di = {
7094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	disassemble_readword, disassemble_printaddr, printf
7104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project};
7114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
7124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectvoid
7134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectdisassemble(u_int address)
7144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project{
7154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
7164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project	(void)disasm(&disassemble_di, address, 0);
7174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
7184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
7194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* End of disassem.c */
720