aboutsummaryrefslogtreecommitdiff
path: root/vm/compiler/codegen/arm/ArchUtility.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vm/compiler/codegen/arm/ArchUtility.cpp')
-rw-r--r--vm/compiler/codegen/arm/ArchUtility.cpp44
1 files changed, 34 insertions, 10 deletions
diff --git a/vm/compiler/codegen/arm/ArchUtility.cpp b/vm/compiler/codegen/arm/ArchUtility.cpp
index 9f87b7ff4..db1281ff1 100644
--- a/vm/compiler/codegen/arm/ArchUtility.cpp
+++ b/vm/compiler/codegen/arm/ArchUtility.cpp
@@ -144,11 +144,14 @@ static void buildInsnString(const char *fmt, ArmLIR *lir, char* buf,
operand = expandImmediate(operand);
sprintf(tbuf,"%d [%#x]", operand, operand);
break;
+ case 'q':
+ sprintf(tbuf,"q%d",(operand - 128 - FP_REG_OFFSET) >> 2);
+ break;
case 's':
sprintf(tbuf,"s%d",operand & FP_REG_MASK);
break;
case 'S':
- sprintf(tbuf,"d%d",(operand & FP_REG_MASK) >> 1);
+ sprintf(tbuf,"d%d",(operand - FP_DOUBLE - FP_REG_OFFSET) >> 1);
break;
case 'h':
sprintf(tbuf,"%04x", operand);
@@ -189,6 +192,15 @@ static void buildInsnString(const char *fmt, ArmLIR *lir, char* buf,
case kArmCondMi:
strcpy(tbuf, "mi");
break;
+ case kArmCondPl:
+ strcpy(tbuf, "pl");
+ break;
+ case kArmCondHi:
+ strcpy(tbuf, "hi");
+ break;
+ case kArmCondLs:
+ strcpy(tbuf, "ls");
+ break;
default:
strcpy(tbuf, "");
break;
@@ -291,12 +303,26 @@ void dvmDumpResourceMask(LIR *lir, u8 mask, const char *prefix)
#define DUMP_RESOURCE_MASK(X)
#define DUMP_SSA_REP(X)
+/*
+ * Decodes generic ARM opcodes
+ */
+static void printDefaultInstr(ArmLIR *lir, unsigned char *baseAddr)
+{
+ char buf[256];
+ char opName[256];
+ int offset = lir->generic.offset;
+
+ buildInsnString(getEncoding(lir->opcode)->name, lir, opName, baseAddr, 256);
+ buildInsnString(getEncoding(lir->opcode)->fmt, lir, buf, baseAddr, 256);
+ ALOGD("%p (%04x): %-12s%s%s",
+ baseAddr + offset, offset, opName, buf,
+ lir->flags.isNop ? "(nop)" : "");
+}
+
/* Pretty-print a LIR instruction */
void dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr)
{
ArmLIR *lir = (ArmLIR *) arg;
- char buf[256];
- char opName[256];
int offset = lir->generic.offset;
int dest = lir->operands[0];
const bool dumpNop = false;
@@ -358,6 +384,10 @@ void dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr)
ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x", dest,
lir->operands[1]);
break;
+ case kArmPseudoPCReconstructionCellExtended:
+ ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x (extended)\n", dest,
+ lir->operands[1]);
+ break;
case kArmPseudoPCReconstructionBlockLabel:
/* Do nothing */
break;
@@ -372,13 +402,7 @@ void dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr)
if (lir->flags.isNop && !dumpNop) {
break;
}
- buildInsnString(EncodingMap[lir->opcode].name, lir, opName,
- baseAddr, 256);
- buildInsnString(EncodingMap[lir->opcode].fmt, lir, buf, baseAddr,
- 256);
- ALOGD("%p (%04x): %-8s%s%s",
- baseAddr + offset, offset, opName, buf,
- lir->flags.isNop ? "(nop)" : "");
+ printDefaultInstr(lir, baseAddr);
break;
}