diff options
author | buzbee <buzbee@google.com> | 2010-08-05 11:01:12 -0700 |
---|---|---|
committer | buzbee <buzbee@google.com> | 2010-08-05 11:01:12 -0700 |
commit | 14f711ba6ffea52d6000e7d442d01b684bbe7f97 (patch) | |
tree | 05886643392ca9caeb4e1336b944e7247608ab17 /vm/compiler/codegen/arm | |
parent | bff121aa3e5d3c34caf837227cb00a46bf3f1966 (diff) | |
download | android_dalvik-14f711ba6ffea52d6000e7d442d01b684bbe7f97.tar.gz android_dalvik-14f711ba6ffea52d6000e7d442d01b684bbe7f97.tar.bz2 android_dalvik-14f711ba6ffea52d6000e7d442d01b684bbe7f97.zip |
JIT: Support for shift field in disassembler [issue 2465170]
Many Thumb2 instructions allow for an optional shift to be applied to
operand 2. This cl enhances the disassembler to show a non-zero shift
in the dump output.
Change-Id: I6cbfec46cd45e3f2acc9553f880e80764a1eb65d
Diffstat (limited to 'vm/compiler/codegen/arm')
-rw-r--r-- | vm/compiler/codegen/arm/ArchUtility.c | 14 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/Assemble.c | 17 |
2 files changed, 23 insertions, 8 deletions
diff --git a/vm/compiler/codegen/arm/ArchUtility.c b/vm/compiler/codegen/arm/ArchUtility.c index d5acd13ef..2e6845968 100644 --- a/vm/compiler/codegen/arm/ArchUtility.c +++ b/vm/compiler/codegen/arm/ArchUtility.c @@ -18,6 +18,12 @@ #include "libdex/OpCodeNames.h" #include "ArmLIR.h" +static char *shiftNames[4] = { + "lsl", + "lsr", + "asr", + "ror"}; + /* Decode and print a ARM register name */ static char * decodeRegList(int vector, char *buf) { @@ -83,6 +89,14 @@ static void buildInsnString(char *fmt, ArmLIR *lir, char* buf, assert((unsigned)(nc-'0') < 4); operand = lir->operands[nc-'0']; switch(*fmt++) { + case 'H': + if (operand != 0) { + sprintf(tbuf, ", %s %d",shiftNames[operand & 0x3], + operand >> 2); + } else { + strcpy(tbuf,""); + } + break; case 'B': switch (operand) { case kSY: diff --git a/vm/compiler/codegen/arm/Assemble.c b/vm/compiler/codegen/arm/Assemble.c index 4f975b363..5f54ebe0d 100644 --- a/vm/compiler/codegen/arm/Assemble.c +++ b/vm/compiler/codegen/arm/Assemble.c @@ -74,6 +74,7 @@ * M -> Thumb2 16-bit zero-extended immediate * b -> 4-digit binary * B -> dmb option string (sy, st, ish, ishst, nsh, hshst) + * H -> operand shift * * [!] escape. To insert "!", use "!!" */ @@ -543,17 +544,17 @@ ArmEncodingMap EncodingMap[kArmLast] = { kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES, - "adds", "r!0d, r!1d, r!2d", 2), + "adds", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2SubRRR, 0xebb00000, /* setflags enconding */ kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES, - "subs", "r!0d, r!1d, r!2d", 2), + "subs", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2SbcRRR, 0xeb700000, /* setflags encoding */ kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12 | USES_CCODES | SETS_CCODES, - "sbcs", "r!0d, r!1d, r!2d", 2), + "sbcs", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2CmpRR, 0xebb00f00, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, kFmtUnused, -1, -1, @@ -656,15 +657,15 @@ ArmEncodingMap EncodingMap[kArmLast] = { kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12 | SETS_CCODES, - "adcs", "r!0d, r!1d, r!2d, shift !3d", 2), + "adcs", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2AndRRR, 0xea000000, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12, - "and", "r!0d, r!1d, r!2d, shift !3d", 2), + "and", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2BicRRR, 0xea200000, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12, - "bic", "r!0d, r!1d, r!2d, shift !3d", 2), + "bic", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2CmnRR, 0xeb000000, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, kFmtUnused, -1, -1, @@ -673,7 +674,7 @@ ArmEncodingMap EncodingMap[kArmLast] = { ENCODING_MAP(kThumb2EorRRR, 0xea800000, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12, - "eor", "r!0d, r!1d, r!2d, shift !3d", 2), + "eor", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2MulRRR, 0xfb00f000, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtUnused, -1, -1, IS_TERTIARY_OP | REG_DEF0_USE12, @@ -695,7 +696,7 @@ ArmEncodingMap EncodingMap[kArmLast] = { ENCODING_MAP(kThumb2OrrRRR, 0xea400000, kFmtBitBlt, 11, 8, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, IS_QUAD_OP | REG_DEF0_USE12, - "orr", "r!0d, r!1d, r!2d, shift !3d", 2), + "orr", "r!0d, r!1d, r!2d!3H", 2), ENCODING_MAP(kThumb2TstRR, 0xea100f00, kFmtBitBlt, 19, 16, kFmtBitBlt, 3, 0, kFmtShift, -1, -1, kFmtUnused, -1, -1, |