diff options
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, |