1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project
3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License.
6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at
7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software
11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and
14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License.
15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "../../CompilerInternals.h"
18df4daaf8f41e3dcaa8221f54273338160dd43138Dan Bornstein#include "libdex/DexOpcodes.h"
1989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee#include "ArmLIR.h"
20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
215d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapirostatic const char *shiftNames[4] = {
2214f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee    "lsl",
2314f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee    "lsr",
2414f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee    "asr",
2514f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee    "ror"};
2614f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee
27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Decode and print a ARM register name */
2818c990ebab4475335a5b94ac6077d3482b6875b9Ben Chengstatic char * decodeRegList(ArmOpcode opcode, int vector, char *buf)
29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{
30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int i;
31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bool printed = false;
32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    buf[0] = 0;
3318c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng    for (i = 0; i < 16; i++, vector >>= 1) {
34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        if (vector & 0x1) {
3518c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng            int regId = i;
3618c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng            if (opcode == kThumbPush && i == 8) {
3720d7e6c67af128d5bf7cc003564a8122c4101c84Ben Cheng                regId = r14lr;
3818c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng            } else if (opcode == kThumbPop && i == 8) {
3920d7e6c67af128d5bf7cc003564a8122c4101c84Ben Cheng                regId = r15pc;
4018c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng            }
41ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            if (printed) {
4218c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng                sprintf(buf + strlen(buf), ", r%d", regId);
43ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            } else {
44ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                printed = true;
4518c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng                sprintf(buf, "r%d", regId);
46ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            }
47ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        }
48ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    }
49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    return buf;
50ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng}
51ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
527ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbeestatic int expandImmediate(int value)
537ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee{
547ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    int mode = (value & 0xf00) >> 8;
557ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    u4 bits = value & 0xff;
567ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    switch(mode) {
577ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee        case 0:
587ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee            return bits;
597ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee       case 1:
607ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee            return (bits << 16) | bits;
617ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee       case 2:
627ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee            return (bits << 24) | (bits << 8);
637ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee       case 3:
647ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee            return (bits << 24) | (bits << 16) | (bits << 8) | bits;
657ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee      default:
667ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee            break;
677ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    }
687ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    bits = (bits | 0x80) << 24;
697ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee    return bits >> (((value & 0xf80) >> 7) - 8);
707ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee}
717ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee
72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
73ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Interpret a format string and build a string no longer than size
74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See format key in Assemble.c.
75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
765d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapirostatic void buildInsnString(const char *fmt, ArmLIR *lir, char* buf,
77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                            unsigned char *baseAddr, int size)
78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{
79ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int i;
80ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    char *bufEnd = &buf[size-1];
815d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapiro    const char *fmtEnd = &fmt[strlen(fmt)];
82ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    char tbuf[256];
835d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapiro    const char *name;
84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    char nc;
85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    while (fmt < fmtEnd) {
86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        int operand;
87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        if (*fmt == '!') {
88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            fmt++;
89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            assert(fmt < fmtEnd);
90ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            nc = *fmt++;
91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            if (nc=='!') {
92ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                strcpy(tbuf, "!");
93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            } else {
94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               assert(fmt < fmtEnd);
95270c1d64a192341be842f46734054c692bac061eBill Buzbee               assert((unsigned)(nc-'0') < 4);
96ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               operand = lir->operands[nc-'0'];
97ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               switch(*fmt++) {
9814f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                   case 'H':
9914f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                       if (operand != 0) {
10014f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                           sprintf(tbuf, ", %s %d",shiftNames[operand & 0x3],
10114f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                                   operand >> 2);
10214f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                       } else {
10314f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                           strcpy(tbuf,"");
10414f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                       }
10514f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee                       break;
106ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                   case 'B':
107ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                       switch (operand) {
108ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kSY:
109ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "sy";
110ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
111ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kST:
112ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "st";
113ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
114ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kISH:
115ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "ish";
116ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
117ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kISHST:
118ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "ishst";
119ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
120ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kNSH:
121ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "nsh";
122ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
123ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           case kNSHST:
124ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "shst";
125ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
126ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                           default:
127ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               name = "DecodeError";
128ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                               break;
129ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                       }
130ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                       strcpy(tbuf, name);
131ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee                       break;
132a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                   case 'b':
133a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                       strcpy(tbuf,"0000");
134a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                       for (i=3; i>= 0; i--) {
135a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                           tbuf[i] += operand & 1;
136a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                           operand >>= 1;
137a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                       }
138a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                       break;
139270c1d64a192341be842f46734054c692bac061eBill Buzbee                   case 'n':
140270c1d64a192341be842f46734054c692bac061eBill Buzbee                       operand = ~expandImmediate(operand);
141291c84f60853d30e1c0d79dd08c5e5164f588e26Dan Bornstein                       sprintf(tbuf,"%d [%#x]", operand, operand);
142270c1d64a192341be842f46734054c692bac061eBill Buzbee                       break;
1437ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee                   case 'm':
1447ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee                       operand = expandImmediate(operand);
145291c84f60853d30e1c0d79dd08c5e5164f588e26Dan Bornstein                       sprintf(tbuf,"%d [%#x]", operand, operand);
1467ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee                       break;
1479727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                   case 's':
1489727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                       sprintf(tbuf,"s%d",operand & FP_REG_MASK);
1499727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                       break;
1509727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                   case 'S':
1519727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                       sprintf(tbuf,"d%d",(operand & FP_REG_MASK) >> 1);
1529727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee                       break;
153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'h':
154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       sprintf(tbuf,"%04x", operand);
155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
1567ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee                   case 'M':
157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'd':
158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       sprintf(tbuf,"%d", operand);
159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'E':
161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       sprintf(tbuf,"%d", operand*4);
162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'F':
164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       sprintf(tbuf,"%d", operand*2);
165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'c':
167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       switch (operand) {
1681465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondEq:
169a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "eq");
170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1711465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondNe:
172a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "ne");
173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1741465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondLt:
175a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "lt");
176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1771465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondGe:
178a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "ge");
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1801465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondGt:
181a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "gt");
182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1831465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondLe:
184a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "le");
185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1861465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondCs:
187a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "cs");
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
1891465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee                           case kArmCondMi:
190a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee                               strcpy(tbuf, "mi");
1917ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee                               break;
192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                           default:
193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               strcpy(tbuf, "");
194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               break;
195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       }
196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 't':
198cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng                       sprintf(tbuf,"0x%08x (L%p)",
199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                               (int) baseAddr + lir->generic.offset + 4 +
200cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng                               (operand << 1),
201cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng                               lir->generic.target);
202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'u': {
204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       int offset_1 = lir->operands[0];
205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       int offset_2 = NEXT_LIR(lir)->operands[0];
206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       intptr_t target =
207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                           ((((intptr_t) baseAddr + lir->generic.offset + 4) &
208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                            ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) &
209ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                           0xfffffffc;
210ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       sprintf(tbuf, "%p", (void *) target);
211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                    }
213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   /* Nothing to print for BLX_2 */
215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'v':
216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       strcpy(tbuf, "see above");
217ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   case 'R':
21918c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng                       decodeRegList(lir->opcode, operand, tbuf);
220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   default:
222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       strcpy(tbuf,"DecodeError");
223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                       break;
224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               }
225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               if (buf+strlen(tbuf) <= bufEnd) {
226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   strcpy(buf, tbuf);
227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   buf += strlen(tbuf);
228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               } else {
229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                   break;
230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng               }
231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            }
232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        } else {
233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng           *buf++ = *fmt++;
234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        }
235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        if (buf == bufEnd)
236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    }
238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    *buf = 0;
239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng}
240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
241d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Chengvoid dvmDumpResourceMask(LIR *lir, u8 mask, const char *prefix)
242d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng{
243d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    char buf[256];
244d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    buf[0] = 0;
245d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    ArmLIR *armLIR = (ArmLIR *) lir;
246d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
247d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    if (mask == ENCODE_ALL) {
248d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        strcpy(buf, "all");
249d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    } else {
250d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        char num[8];
251d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        int i;
252d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
253d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        for (i = 0; i < kRegEnd; i++) {
254d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng            if (mask & (1ULL << i)) {
255d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                sprintf(num, "%d ", i);
256d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                strcat(buf, num);
257d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng            }
258d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        }
259d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
260d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        if (mask & ENCODE_CCODE) {
261d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng            strcat(buf, "cc ");
262d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        }
263d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        if (mask & ENCODE_FP_STATUS) {
264d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng            strcat(buf, "fpcc ");
265d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        }
2667ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng
2677ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        /* Memory bits */
268d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        if (armLIR && (mask & ENCODE_DALVIK_REG)) {
269d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng            sprintf(buf + strlen(buf), "dr%d%s", armLIR->aliasInfo & 0xffff,
270d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                    (armLIR->aliasInfo & 0x80000000) ? "(+1)" : "");
271d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        }
2727ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        if (mask & ENCODE_LITERAL) {
2737ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng            strcat(buf, "lit ");
2747ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        }
2757ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng
2767ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        if (mask & ENCODE_HEAP_REF) {
2777ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng            strcat(buf, "heap ");
2787ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        }
2797ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        if (mask & ENCODE_MUST_NOT_ALIAS) {
2807ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng            strcat(buf, "noalias ");
2817ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng        }
282d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    }
283d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    if (buf[0]) {
284062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block        ALOGD("%s: %s", prefix, buf);
285d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    }
286d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng}
287d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
288d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng/*
289d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng * Debugging macros
290d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng */
291d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng#define DUMP_RESOURCE_MASK(X)
292d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng#define DUMP_SSA_REP(X)
293d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Pretty-print a LIR instruction */
295d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Chengvoid dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr)
296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{
29789efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee    ArmLIR *lir = (ArmLIR *) arg;
298ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    char buf[256];
299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    char opName[256];
300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int offset = lir->generic.offset;
301ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    int dest = lir->operands[0];
302d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    const bool dumpNop = false;
303d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Handle pseudo-ops individually, and all regular insns as a group */
3059a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein    switch(lir->opcode) {
306cec26f6ae3347d5ab3d60de02caca2e47151c6b2Ben Cheng        case kArmChainingCellBottom:
307062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- end of chaining cells (0x%04x)", offset);
308cec26f6ae3347d5ab3d60de02caca2e47151c6b2Ben Cheng            break;
3091465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoBarrier:
310062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- BARRIER");
311dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng            break;
3121465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoExtended:
313062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- %s", (char *) dest);
3147a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng            break;
3151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoSSARep:
31660fc806b679a3655c228b4093058c59941a49cfeDan Bornstein            DUMP_SSA_REP(LOGD("-------- %s", (char *) dest));
3174238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng            break;
318a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoChainingCellBackwardBranch:
319062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
320062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- chaining cell (backward branch): 0x%04x", dest);
3214238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng            break;
322a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoChainingCellNormal:
323062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
324062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- chaining cell (normal): 0x%04x", dest);
325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
326a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoChainingCellHot:
327062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
328062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- chaining cell (hot): 0x%04x", dest);
329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
330a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoChainingCellInvokePredicted:
331062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
332062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- chaining cell (predicted): %s%s",
3330451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng                 dest ? ((Method *) dest)->clazz->descriptor : "",
3340451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng                 dest ? ((Method *) dest)->name : "N/A");
33538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng            break;
336a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoChainingCellInvokeSingleton:
337062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
338062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- chaining cell (invoke singleton): %s%s/%p",
3390451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng                 ((Method *)dest)->clazz->descriptor,
340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                 ((Method *)dest)->name,
341ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                 ((Method *)dest)->insns);
342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
343a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoEntryBlock:
344062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- entry offset: 0x%04x", dest);
34597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao            break;
346a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoDalvikByteCodeBoundary:
347062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- dalvik offset: 0x%04x @ %s", dest,
348ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng                 (char *) lir->operands[1]);
349ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
350a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoExitBlock:
351062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- exit offset: 0x%04x", dest);
3524238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng            break;
3531465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoPseudoAlign4:
354062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("%p (%04x): .align4", baseAddr + offset, offset);
355ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
356a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoPCReconstructionCell:
357062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
358062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x", dest,
359ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                 lir->operands[1]);
360ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
361a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng        case kArmPseudoPCReconstructionBlockLabel:
362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            /* Do nothing */
363ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
3641465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoEHBlockLabel:
365062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("Exception_Handling:");
366ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
367cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng        case kArmPseudoTargetLabel:
3681465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee        case kArmPseudoNormalBlockLabel:
369062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("L%p:", lir);
370ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
371ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng        default:
372d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng            if (lir->flags.isNop && !dumpNop) {
373e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng                break;
374e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng            }
3759a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein            buildInsnString(EncodingMap[lir->opcode].name, lir, opName,
376ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                            baseAddr, 256);
3779a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein            buildInsnString(EncodingMap[lir->opcode].fmt, lir, buf, baseAddr,
378ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                            256);
379062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block            ALOGD("%p (%04x): %-8s%s%s",
380d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                 baseAddr + offset, offset, opName, buf,
381d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng                 lir->flags.isNop ? "(nop)" : "");
382ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng            break;
383ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    }
384d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng
385d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng    if (lir->useMask && (!lir->flags.isNop || dumpNop)) {
386d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir,
387d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                                               lir->useMask, "use"));
388d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    }
389d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng    if (lir->defMask && (!lir->flags.isNop || dumpNop)) {
390d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng        DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir,
391d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng                                               lir->defMask, "def"));
392d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng    }
393ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng}
394ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
395ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */
396ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit)
397ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{
398062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block    ALOGD("Dumping LIR insns");
399ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LIR *lirInsn;
40089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee    ArmLIR *armLIR;
401ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
402062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block    ALOGD("installed code is at %p", cUnit->baseAddr);
403062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block    ALOGD("total size is %d bytes", cUnit->totalSize);
404ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) {
405fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro        dvmDumpLIRInsn(lirInsn, (unsigned char *) cUnit->baseAddr);
406ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    }
407385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng    for (lirInsn = cUnit->classPointerList; lirInsn; lirInsn = lirInsn->next) {
408385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng        armLIR = (ArmLIR *) lirInsn;
409062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block        ALOGD("%p (%04x): .class (%s)",
410385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng             (char*)cUnit->baseAddr + armLIR->generic.offset,
411385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng             armLIR->generic.offset,
412385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng             ((CallsiteInfo *) armLIR->operands[0])->classDescriptor);
413385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng    }
414385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng    for (lirInsn = cUnit->literalList; lirInsn; lirInsn = lirInsn->next) {
41589efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee        armLIR = (ArmLIR *) lirInsn;
416062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block        ALOGD("%p (%04x): .word (%#x)",
417dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng             (char*)cUnit->baseAddr + armLIR->generic.offset,
418dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng             armLIR->generic.offset,
419ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng             armLIR->operands[0]);
420ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    }
421ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng}
42213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee
42313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee/* Target-specific cache flushing */
4240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenvoid dvmCompilerCacheFlush(long start, long end, long flags)
42513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee{
4260c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    cacheflush(start, end, flags);
42713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee}
428a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
429a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache clearing */
430a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCacheClear(char *start, size_t size)
431a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
43260497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng    /*
43360497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng     * de is an invalid opcode for arm.
43460497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng     * From gdb disassembly:  <UNDEFINED> instruction: 0xdede
43560497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng     */
43660497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng
43760497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng    memset(start, 0xde, size);
438a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
439