1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/*
2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Copyright (C) 2009 The Android Open Source Project
3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *
4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Licensed under the Apache License, Version 2.0 (the "License");
5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * you may not use this file except in compliance with the License.
6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * You may obtain a copy of the License at
7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *
8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *      http://www.apache.org/licenses/LICENSE-2.0
9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *
10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Unless required by applicable law or agreed to in writing, software
11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * distributed under the License is distributed on an "AS IS" BASIS,
12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * See the License for the specific language governing permissions and
14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * limitations under the License.
15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */
16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "../../CompilerInternals.h"
18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "libdex/DexOpcodes.h"
19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "MipsLIR.h"
20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* For dumping instructions */
22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define MIPS_REG_COUNT 32
23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic const char *mipsRegName[MIPS_REG_COUNT] = {
24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"
28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham};
29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/*
31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Interpret a format string and build a string no longer than size
32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * See format key in Assemble.c.
33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */
34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void buildInsnString(const char *fmt, MipsLIR *lir, char* buf,
35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                            unsigned char *baseAddr, int size)
36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    int i;
38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char *bufEnd = &buf[size-1];
39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    const char *fmtEnd = &fmt[strlen(fmt)];
40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char tbuf[256];
41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char nc;
42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    while (fmt < fmtEnd) {
43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        int operand;
44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (*fmt == '!') {
45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            fmt++;
46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            assert(fmt < fmtEnd);
47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            nc = *fmt++;
48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            if (nc=='!') {
49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                strcpy(tbuf, "!");
50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            } else {
51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               assert(fmt < fmtEnd);
52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               assert((unsigned)(nc-'0') < 4);
53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               operand = lir->operands[nc-'0'];
54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               switch(*fmt++) {
55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'b':
56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       strcpy(tbuf,"0000");
57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       for (i=3; i>= 0; i--) {
58a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           tbuf[i] += operand & 1;
59a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           operand >>= 1;
60a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       }
61a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
62a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 's':
63a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"$f%d",operand & FP_REG_MASK);
64a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
65a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'S':
66a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham		       assert(((operand & FP_REG_MASK) & 1) == 0);
67a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"$f%d",operand & FP_REG_MASK);
68a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
69a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'h':
70a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"%04x", operand);
71a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
72a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'M':
73a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'd':
74a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"%d", operand);
75a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
76a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'D':
77a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"%d", operand+1);
78a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
79a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'E':
80a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"%d", operand*4);
81a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
82a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'F':
83a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"%d", operand*2);
84a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
85a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'c':
86a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       switch (operand) {
87a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondEq:
88a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "eq");
89a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
90a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondNe:
91a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "ne");
92a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
93a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondLt:
94a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "lt");
95a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
96a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondGe:
97a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "ge");
98a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
99a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondGt:
100a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "gt");
101a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
102a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondLe:
103a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "le");
104a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
105a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondCs:
106a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "cs");
107a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
108a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           case kMipsCondMi:
109a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "mi");
110a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
111a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           default:
112a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               strcpy(tbuf, "");
113a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               break;
114a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       }
115a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
116a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 't':
117a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"0x%08x (L%p)",
118a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               (int) baseAddr + lir->generic.offset + 4 +
119a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               (operand << 2),
120a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               lir->generic.target);
121a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
122a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'T':
123a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf,"0x%08x",
124a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                               (int) (operand << 2));
125a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
126a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'u': {
127a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       int offset_1 = lir->operands[0];
128a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       int offset_2 = NEXT_LIR(lir)->operands[0];
129a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       intptr_t target =
130a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           ((((intptr_t) baseAddr + lir->generic.offset + 4) &
131a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                            ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) &
132a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                           0xfffffffc;
133a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       sprintf(tbuf, "%p", (void *) target);
134a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
135a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                    }
136a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
137a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   /* Nothing to print for BLX_2 */
138a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'v':
139a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       strcpy(tbuf, "see above");
140a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
141a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   case 'r':
142a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       assert(operand >= 0 && operand < MIPS_REG_COUNT);
143a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       strcpy(tbuf, mipsRegName[operand]);
144a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
145a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   default:
146a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       strcpy(tbuf,"DecodeError");
147a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                       break;
148a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               }
149a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               if (buf+strlen(tbuf) <= bufEnd) {
150a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   strcpy(buf, tbuf);
151a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   buf += strlen(tbuf);
152a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               } else {
153a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                   break;
154a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham               }
155a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            }
156a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        } else {
157a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham           *buf++ = *fmt++;
158a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
159a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (buf == bufEnd)
160a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
161a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
162a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    *buf = 0;
163a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
164a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
165a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmDumpResourceMask(LIR *lir, u8 mask, const char *prefix)
166a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
167a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char buf[256];
168a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    buf[0] = 0;
169a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    MipsLIR *mipsLIR = (MipsLIR *) lir;
170a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
171a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    if (mask == ENCODE_ALL) {
172a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        strcpy(buf, "all");
173a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    } else {
174a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        char num[8];
175a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        int i;
176a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
177a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        for (i = 0; i < kRegEnd; i++) {
178a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            if (mask & (1ULL << i)) {
179a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                sprintf(num, "%d ", i);
180a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                strcat(buf, num);
181a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            }
182a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
183a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
184a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mask & ENCODE_CCODE) {
185a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            strcat(buf, "cc ");
186a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
187a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mask & ENCODE_FP_STATUS) {
188a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            strcat(buf, "fpcc ");
189a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
190a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        /* Memory bits */
191a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mipsLIR && (mask & ENCODE_DALVIK_REG)) {
192a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            sprintf(buf + strlen(buf), "dr%d%s", mipsLIR->aliasInfo & 0xffff,
193a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                    (mipsLIR->aliasInfo & 0x80000000) ? "(+1)" : "");
194a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
195a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mask & ENCODE_LITERAL) {
196a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            strcat(buf, "lit ");
197a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
198a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
199a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mask & ENCODE_HEAP_REF) {
200a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            strcat(buf, "heap ");
201a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
202a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        if (mask & ENCODE_MUST_NOT_ALIAS) {
203a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            strcat(buf, "noalias ");
204a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        }
205a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
206a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    if (buf[0]) {
207fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham        ALOGD("%s: %s", prefix, buf);
208a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
209a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
210a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
211a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/*
212a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Debugging macros
213a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */
214a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define DUMP_RESOURCE_MASK(X)
215a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define DUMP_SSA_REP(X)
216a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
217a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Pretty-print a LIR instruction */
218a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr)
219a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
220a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    MipsLIR *lir = (MipsLIR *) arg;
221a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char buf[256];
222a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    char opName[256];
223a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    int offset = lir->generic.offset;
224a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    int dest = lir->operands[0];
225a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    const bool dumpNop = false;
226a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
227a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /* Handle pseudo-ops individually, and all regular insns as a group */
228a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    switch(lir->opcode) {
229a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsChainingCellBottom:
230fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- end of chaining cells (0x%04x)", offset);
231a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
232a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoBarrier:
233fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- BARRIER");
234a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
235a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoExtended:
236a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            /* intentional fallthrough */
237a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoSSARep:
238fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            DUMP_SSA_REP(ALOGD("-------- %s", (char *) dest));
239a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
240a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoChainingCellBackwardBranch:
241fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
242fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- chaining cell (backward branch): 0x%04x", dest);
243a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
244a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoChainingCellNormal:
245fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
246fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- chaining cell (normal): 0x%04x", dest);
247a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
248a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoChainingCellHot:
249fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
250fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- chaining cell (hot): 0x%04x", dest);
251a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
252a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoChainingCellInvokePredicted:
253fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
254fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- chaining cell (predicted): %s%s",
255a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 dest ? ((Method *) dest)->clazz->descriptor : "",
256a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 dest ? ((Method *) dest)->name : "N/A");
257a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
258a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoChainingCellInvokeSingleton:
259fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
260fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- chaining cell (invoke singleton): %s%s/%p",
261a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 ((Method *)dest)->clazz->descriptor,
262a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 ((Method *)dest)->name,
263a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 ((Method *)dest)->insns);
264a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
265a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoEntryBlock:
266fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- entry offset: 0x%04x", dest);
267a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
268a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoDalvikByteCodeBoundary:
269fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- dalvik offset: 0x%04x @ %s", dest,
270a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 (char *) lir->operands[1]);
271a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
272a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoExitBlock:
273fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- exit offset: 0x%04x", dest);
274a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
275a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoPseudoAlign4:
276fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("%p (%04x): .align4", baseAddr + offset, offset);
277a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
278a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoPCReconstructionCell:
279fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
280fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x", dest,
281a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 lir->operands[1]);
282a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
283a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoPCReconstructionBlockLabel:
284a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            /* Do nothing */
285a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
286a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoEHBlockLabel:
287fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("Exception_Handling:");
288a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
289a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoTargetLabel:
290a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        case kMipsPseudoNormalBlockLabel:
291fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("L%p:", lir);
292a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
293a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        default:
294a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            if (lir->flags.isNop && !dumpNop) {
295a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                break;
296a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            }
297a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            buildInsnString(EncodingMap[lir->opcode].name, lir, opName,
298a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                            baseAddr, 256);
299a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            buildInsnString(EncodingMap[lir->opcode].fmt, lir, buf, baseAddr,
300a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                            256);
301fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham            ALOGD("%p (%04x): %08x %-9s%s%s",
302a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 baseAddr + offset, offset, *(u4 *)(baseAddr + offset), opName, buf,
303a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                 lir->flags.isNop ? "(nop)" : "");
304a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham            break;
305a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
306a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
307a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    if (lir->useMask && (!lir->flags.isNop || dumpNop)) {
308a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir,
309a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                                               lir->useMask, "use"));
310a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
311a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    if (lir->defMask && (!lir->flags.isNop || dumpNop)) {
312a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir,
313a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham                                               lir->defMask, "def"));
314a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
315a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
316a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
317a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Dump instructions and constant pool contents */
318a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCodegenDump(CompilationUnit *cUnit)
319a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
320fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham    ALOGD("Dumping LIR insns");
321a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    LIR *lirInsn;
322a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    MipsLIR *mipsLIR;
323a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
324fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham    ALOGD("installed code is at %p", cUnit->baseAddr);
325fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham    ALOGD("total size is %d bytes", cUnit->totalSize);
326a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) {
327a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        dvmDumpLIRInsn(lirInsn, (unsigned char *) cUnit->baseAddr);
328a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
329a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    for (lirInsn = cUnit->classPointerList; lirInsn; lirInsn = lirInsn->next) {
330a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        mipsLIR = (MipsLIR *) lirInsn;
331fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham        ALOGD("%p (%04x): .class (%s)",
332a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             (char*)cUnit->baseAddr + mipsLIR->generic.offset,
333a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             mipsLIR->generic.offset,
334a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             ((CallsiteInfo *) mipsLIR->operands[0])->classDescriptor);
335a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
336a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    for (lirInsn = cUnit->literalList; lirInsn; lirInsn = lirInsn->next) {
337a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham        mipsLIR = (MipsLIR *) lirInsn;
338fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham        ALOGD("%p (%04x): .word (%#x)",
339a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             (char*)cUnit->baseAddr + mipsLIR->generic.offset,
340a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             mipsLIR->generic.offset,
341a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham             mipsLIR->operands[0]);
342a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    }
343a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
344a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
345a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache flushing */
3460c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenvoid dvmCompilerCacheFlush(long start, long end, long flags)
347a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
3480c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    cacheflush(start, end, flags);
349a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
350a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham
351a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache clearing */
352a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCacheClear(char *start, size_t size)
353a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{
354a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    /* 0x66 is an invalid opcode for mips. */
355a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham    memset(start, 0x66, size);
356a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}
357