summaryrefslogtreecommitdiffstats
path: root/vm/compiler/codegen/arm/ArchUtility.c
diff options
context:
space:
mode:
authorBill Buzbee <buzbee@google.com>2009-08-10 17:06:51 -0700
committerBill Buzbee <buzbee@google.com>2009-08-13 10:46:58 -0700
commit7ea0f64d067cd8a2213c2c04a3291335c34d9602 (patch)
treefbc09d82e2e743085c0dd69b34687bcbbbeea46a /vm/compiler/codegen/arm/ArchUtility.c
parent530e0a50c365bd8451209a014fef4cf293e573c1 (diff)
downloadandroid_dalvik-7ea0f64d067cd8a2213c2c04a3291335c34d9602.tar.gz
android_dalvik-7ea0f64d067cd8a2213c2c04a3291335c34d9602.tar.bz2
android_dalvik-7ea0f64d067cd8a2213c2c04a3291335c34d9602.zip
Continuing evolution of Thumb2 support.
Bug fix for local optimization Enable partial floating point store sinking (with significant perf gain!)
Diffstat (limited to 'vm/compiler/codegen/arm/ArchUtility.c')
-rw-r--r--vm/compiler/codegen/arm/ArchUtility.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/vm/compiler/codegen/arm/ArchUtility.c b/vm/compiler/codegen/arm/ArchUtility.c
index abcb2eb2d..60c5cdb86 100644
--- a/vm/compiler/codegen/arm/ArchUtility.c
+++ b/vm/compiler/codegen/arm/ArchUtility.c
@@ -37,6 +37,26 @@ static char * decodeRegList(int vector, char *buf)
return buf;
}
+static int expandImmediate(int value)
+{
+ int mode = (value & 0xf00) >> 8;
+ u4 bits = value & 0xff;
+ switch(mode) {
+ case 0:
+ return bits;
+ case 1:
+ return (bits << 16) | bits;
+ case 2:
+ return (bits << 24) | (bits << 8);
+ case 3:
+ return (bits << 24) | (bits << 16) | (bits << 8) | bits;
+ default:
+ break;
+ }
+ bits = (bits | 0x80) << 24;
+ return bits >> (((value & 0xf80) >> 7) - 8);
+}
+
/*
* Interpret a format string and build a string no longer than size
* See format key in Assemble.c.
@@ -62,6 +82,10 @@ static void buildInsnString(char *fmt, ArmLIR *lir, char* buf,
assert((unsigned)(nc-'0') < 3);
operand = lir->operands[nc-'0'];
switch(*fmt++) {
+ case 'm':
+ operand = expandImmediate(operand);
+ sprintf(tbuf,"%d [0x%x]", operand, operand);
+ break;
case 's':
sprintf(tbuf,"s%d",operand & FP_REG_MASK);
break;
@@ -71,6 +95,7 @@ static void buildInsnString(char *fmt, ArmLIR *lir, char* buf,
case 'h':
sprintf(tbuf,"%04x", operand);
break;
+ case 'M':
case 'd':
sprintf(tbuf,"%d", operand);
break;
@@ -106,6 +131,9 @@ static void buildInsnString(char *fmt, ArmLIR *lir, char* buf,
case ARM_COND_CS:
strcpy(tbuf, "bcs");
break;
+ case ARM_COND_MI:
+ strcpy(tbuf, "bmi");
+ break;
default:
strcpy(tbuf, "");
break;