Statistics
| Branch: | Revision:

root / target-mips / op_helper_mem.c @ c570fd16

History | View | Annotate | Download (6.3 kB)

1 9f25f11f bellard
#ifdef TARGET_WORDS_BIGENDIAN
2 9f25f11f bellard
#define GET_LMASK(v) ((v) & 3)
3 9f25f11f bellard
#else
4 9f25f11f bellard
#define GET_LMASK(v) (((v) & 3) ^ 3)
5 9f25f11f bellard
#endif
6 9f25f11f bellard
7 4ad40f36 bellard
void glue(do_lwl, MEMSUFFIX) (uint32_t tmp)
8 6af0bf9c bellard
{
9 6af0bf9c bellard
#if defined (DEBUG_OP)
10 6af0bf9c bellard
    target_ulong sav = T0;
11 6af0bf9c bellard
#endif
12 6af0bf9c bellard
13 9f25f11f bellard
    switch (GET_LMASK(T0)) {
14 6af0bf9c bellard
    case 0:
15 6af0bf9c bellard
        T0 = tmp;
16 6af0bf9c bellard
        break;
17 6af0bf9c bellard
    case 1:
18 6af0bf9c bellard
        T0 = (tmp << 8) | (T1 & 0x000000FF);
19 6af0bf9c bellard
        break;
20 6af0bf9c bellard
    case 2:
21 6af0bf9c bellard
        T0 = (tmp << 16) | (T1 & 0x0000FFFF);
22 6af0bf9c bellard
        break;
23 6af0bf9c bellard
    case 3:
24 6af0bf9c bellard
        T0 = (tmp << 24) | (T1 & 0x00FFFFFF);
25 6af0bf9c bellard
        break;
26 6af0bf9c bellard
    }
27 6af0bf9c bellard
#if defined (DEBUG_OP)
28 6af0bf9c bellard
    if (logfile) {
29 6af0bf9c bellard
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
30 6af0bf9c bellard
                __func__, sav, tmp, T1, T0);
31 6af0bf9c bellard
    }
32 6af0bf9c bellard
#endif
33 6af0bf9c bellard
    RETURN();
34 6af0bf9c bellard
}
35 6af0bf9c bellard
36 4ad40f36 bellard
void glue(do_lwr, MEMSUFFIX) (uint32_t tmp)
37 6af0bf9c bellard
{
38 6af0bf9c bellard
#if defined (DEBUG_OP)
39 6af0bf9c bellard
    target_ulong sav = T0;
40 6af0bf9c bellard
#endif
41 6af0bf9c bellard
42 9f25f11f bellard
    switch (GET_LMASK(T0)) {
43 6af0bf9c bellard
    case 0:
44 6af0bf9c bellard
        T0 = (tmp >> 24) | (T1 & 0xFFFFFF00);
45 6af0bf9c bellard
        break;
46 6af0bf9c bellard
    case 1:
47 6af0bf9c bellard
        T0 = (tmp >> 16) | (T1 & 0xFFFF0000);
48 6af0bf9c bellard
        break;
49 6af0bf9c bellard
    case 2:
50 6af0bf9c bellard
        T0 = (tmp >> 8) | (T1 & 0xFF000000);
51 6af0bf9c bellard
        break;
52 6af0bf9c bellard
    case 3:
53 6af0bf9c bellard
        T0 = tmp;
54 6af0bf9c bellard
        break;
55 6af0bf9c bellard
    }
56 6af0bf9c bellard
#if defined (DEBUG_OP)
57 6af0bf9c bellard
    if (logfile) {
58 6af0bf9c bellard
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
59 6af0bf9c bellard
                __func__, sav, tmp, T1, T0);
60 6af0bf9c bellard
    }
61 6af0bf9c bellard
#endif
62 6af0bf9c bellard
    RETURN();
63 6af0bf9c bellard
}
64 6af0bf9c bellard
65 4ad40f36 bellard
uint32_t glue(do_swl, MEMSUFFIX) (uint32_t tmp)
66 6af0bf9c bellard
{
67 6af0bf9c bellard
#if defined (DEBUG_OP)
68 c570fd16 ths
    target_ulong sav = tmp;
69 6af0bf9c bellard
#endif
70 6af0bf9c bellard
71 9f25f11f bellard
    switch (GET_LMASK(T0)) {
72 6af0bf9c bellard
    case 0:
73 6af0bf9c bellard
        tmp = T1;
74 6af0bf9c bellard
        break;
75 6af0bf9c bellard
    case 1:
76 6af0bf9c bellard
        tmp = (tmp & 0xFF000000) | (T1 >> 8);
77 6af0bf9c bellard
        break;
78 6af0bf9c bellard
    case 2:
79 6af0bf9c bellard
        tmp = (tmp & 0xFFFF0000) | (T1 >> 16);
80 6af0bf9c bellard
        break;
81 6af0bf9c bellard
    case 3:
82 6af0bf9c bellard
        tmp = (tmp & 0xFFFFFF00) | (T1 >> 24);
83 6af0bf9c bellard
        break;
84 6af0bf9c bellard
    }
85 6af0bf9c bellard
#if defined (DEBUG_OP)
86 6af0bf9c bellard
    if (logfile) {
87 6af0bf9c bellard
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
88 6af0bf9c bellard
                __func__, T0, sav, T1, tmp);
89 6af0bf9c bellard
    }
90 6af0bf9c bellard
#endif
91 6af0bf9c bellard
    RETURN();
92 4ad40f36 bellard
    return tmp;
93 6af0bf9c bellard
}
94 6af0bf9c bellard
95 4ad40f36 bellard
uint32_t glue(do_swr, MEMSUFFIX) (uint32_t tmp)
96 6af0bf9c bellard
{
97 6af0bf9c bellard
#if defined (DEBUG_OP)
98 c570fd16 ths
    target_ulong sav = tmp;
99 6af0bf9c bellard
#endif
100 6af0bf9c bellard
101 9f25f11f bellard
    switch (GET_LMASK(T0)) {
102 6af0bf9c bellard
    case 0:
103 6af0bf9c bellard
        tmp = (tmp & 0x00FFFFFF) | (T1 << 24);
104 6af0bf9c bellard
        break;
105 6af0bf9c bellard
    case 1:
106 6af0bf9c bellard
        tmp = (tmp & 0x0000FFFF) | (T1 << 16);
107 6af0bf9c bellard
        break;
108 6af0bf9c bellard
    case 2:
109 6af0bf9c bellard
        tmp = (tmp & 0x000000FF) | (T1 << 8);
110 6af0bf9c bellard
        break;
111 6af0bf9c bellard
    case 3:
112 6af0bf9c bellard
        tmp = T1;
113 6af0bf9c bellard
        break;
114 6af0bf9c bellard
    }
115 6af0bf9c bellard
#if defined (DEBUG_OP)
116 6af0bf9c bellard
    if (logfile) {
117 6af0bf9c bellard
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
118 6af0bf9c bellard
                __func__, T0, sav, T1, tmp);
119 6af0bf9c bellard
    }
120 6af0bf9c bellard
#endif
121 6af0bf9c bellard
    RETURN();
122 4ad40f36 bellard
    return tmp;
123 6af0bf9c bellard
}
124 c570fd16 ths
125 c570fd16 ths
#ifdef MIPS_HAS_MIPS64
126 c570fd16 ths
127 c570fd16 ths
# ifdef TARGET_WORDS_BIGENDIAN
128 c570fd16 ths
#define GET_LMASK64(v) ((v) & 4)
129 c570fd16 ths
#else
130 c570fd16 ths
#define GET_LMASK64(v) (((v) & 4) ^ 4)
131 c570fd16 ths
#endif
132 c570fd16 ths
133 c570fd16 ths
void glue(do_ldl, MEMSUFFIX) (uint64_t tmp)
134 c570fd16 ths
{
135 c570fd16 ths
#if defined (DEBUG_OP)
136 c570fd16 ths
    target_ulong sav = T0;
137 c570fd16 ths
#endif
138 c570fd16 ths
139 c570fd16 ths
    switch (GET_LMASK64(T0)) {
140 c570fd16 ths
    case 0:
141 c570fd16 ths
        T0 = tmp;
142 c570fd16 ths
        break;
143 c570fd16 ths
    case 1:
144 c570fd16 ths
        T0 = (tmp << 8) | (T1 & 0x00000000000000FFULL);
145 c570fd16 ths
        break;
146 c570fd16 ths
    case 2:
147 c570fd16 ths
        T0 = (tmp << 16) | (T1 & 0x000000000000FFFFULL);
148 c570fd16 ths
        break;
149 c570fd16 ths
    case 3:
150 c570fd16 ths
        T0 = (tmp << 24) | (T1 & 0x0000000000FFFFFFULL);
151 c570fd16 ths
        break;
152 c570fd16 ths
    case 4:
153 c570fd16 ths
        T0 = (tmp << 32) | (T1 & 0x00000000FFFFFFFFULL);
154 c570fd16 ths
        break;
155 c570fd16 ths
    case 5:
156 c570fd16 ths
        T0 = (tmp << 40) | (T1 & 0x000000FFFFFFFFFFULL);
157 c570fd16 ths
        break;
158 c570fd16 ths
    case 6:
159 c570fd16 ths
        T0 = (tmp << 48) | (T1 & 0x0000FFFFFFFFFFFFULL);
160 c570fd16 ths
        break;
161 c570fd16 ths
    case 7:
162 c570fd16 ths
        T0 = (tmp << 56) | (T1 & 0x00FFFFFFFFFFFFFFULL);
163 c570fd16 ths
        break;
164 c570fd16 ths
    }
165 c570fd16 ths
#if defined (DEBUG_OP)
166 c570fd16 ths
    if (logfile) {
167 c570fd16 ths
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
168 c570fd16 ths
                __func__, sav, tmp, T1, T0);
169 c570fd16 ths
    }
170 c570fd16 ths
#endif
171 c570fd16 ths
    RETURN();
172 c570fd16 ths
}
173 c570fd16 ths
174 c570fd16 ths
void glue(do_ldr, MEMSUFFIX) (uint64_t tmp)
175 c570fd16 ths
{
176 c570fd16 ths
#if defined (DEBUG_OP)
177 c570fd16 ths
    target_ulong sav = T0;
178 c570fd16 ths
#endif
179 c570fd16 ths
180 c570fd16 ths
    switch (GET_LMASK64(T0)) {
181 c570fd16 ths
    case 0:
182 c570fd16 ths
        T0 = (tmp >> 56) | (T1 & 0xFFFFFFFFFFFFFF00ULL);
183 c570fd16 ths
        break;
184 c570fd16 ths
    case 1:
185 c570fd16 ths
        T0 = (tmp >> 48) | (T1 & 0xFFFFFFFFFFFF0000ULL);
186 c570fd16 ths
        break;
187 c570fd16 ths
    case 2:
188 c570fd16 ths
        T0 = (tmp >> 40) | (T1 & 0xFFFFFFFFFF000000ULL);
189 c570fd16 ths
        break;
190 c570fd16 ths
    case 3:
191 c570fd16 ths
        T0 = (tmp >> 32) | (T1 & 0xFFFFFFFF00000000ULL);
192 c570fd16 ths
        break;
193 c570fd16 ths
    case 4:
194 c570fd16 ths
        T0 = (tmp >> 24) | (T1 & 0xFFFFFF0000000000ULL);
195 c570fd16 ths
        break;
196 c570fd16 ths
    case 5:
197 c570fd16 ths
        T0 = (tmp >> 16) | (T1 & 0xFFFF000000000000ULL);
198 c570fd16 ths
        break;
199 c570fd16 ths
    case 6:
200 c570fd16 ths
        T0 = (tmp >> 8) | (T1 & 0xFF00000000000000ULL);
201 c570fd16 ths
        break;
202 c570fd16 ths
    case 7:
203 c570fd16 ths
        T0 = tmp;
204 c570fd16 ths
        break;
205 c570fd16 ths
    }
206 c570fd16 ths
#if defined (DEBUG_OP)
207 c570fd16 ths
    if (logfile) {
208 c570fd16 ths
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
209 c570fd16 ths
                __func__, sav, tmp, T1, T0);
210 c570fd16 ths
    }
211 c570fd16 ths
#endif
212 c570fd16 ths
    RETURN();
213 c570fd16 ths
}
214 c570fd16 ths
215 c570fd16 ths
uint64_t glue(do_sdl, MEMSUFFIX) (uint64_t tmp)
216 c570fd16 ths
{
217 c570fd16 ths
#if defined (DEBUG_OP)
218 c570fd16 ths
    target_ulong sav = tmp;
219 c570fd16 ths
#endif
220 c570fd16 ths
221 c570fd16 ths
    switch (GET_LMASK64(T0)) {
222 c570fd16 ths
    case 0:
223 c570fd16 ths
        tmp = T1;
224 c570fd16 ths
        break;
225 c570fd16 ths
    case 1:
226 c570fd16 ths
        tmp = (tmp & 0xFF00000000000000ULL) | (T1 >> 8);
227 c570fd16 ths
        break;
228 c570fd16 ths
    case 2:
229 c570fd16 ths
        tmp = (tmp & 0xFFFF000000000000ULL) | (T1 >> 16);
230 c570fd16 ths
        break;
231 c570fd16 ths
    case 3:
232 c570fd16 ths
        tmp = (tmp & 0xFFFFFF0000000000ULL) | (T1 >> 24);
233 c570fd16 ths
        break;
234 c570fd16 ths
    case 4:
235 c570fd16 ths
        tmp = (tmp & 0xFFFFFFFF00000000ULL) | (T1 >> 32);
236 c570fd16 ths
        break;
237 c570fd16 ths
    case 5:
238 c570fd16 ths
        tmp = (tmp & 0xFFFFFFFFFF000000ULL) | (T1 >> 40);
239 c570fd16 ths
        break;
240 c570fd16 ths
    case 6:
241 c570fd16 ths
        tmp = (tmp & 0xFFFFFFFFFFFF0000ULL) | (T1 >> 48);
242 c570fd16 ths
        break;
243 c570fd16 ths
    case 7:
244 c570fd16 ths
        tmp = (tmp & 0xFFFFFFFFFFFFFF00ULL) | (T1 >> 56);
245 c570fd16 ths
        break;
246 c570fd16 ths
    }
247 c570fd16 ths
#if defined (DEBUG_OP)
248 c570fd16 ths
    if (logfile) {
249 c570fd16 ths
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
250 c570fd16 ths
                __func__, T0, sav, T1, tmp);
251 c570fd16 ths
    }
252 c570fd16 ths
#endif
253 c570fd16 ths
    RETURN();
254 c570fd16 ths
    return tmp;
255 c570fd16 ths
}
256 c570fd16 ths
257 c570fd16 ths
uint64_t glue(do_sdr, MEMSUFFIX) (uint64_t tmp)
258 c570fd16 ths
{
259 c570fd16 ths
#if defined (DEBUG_OP)
260 c570fd16 ths
    target_ulong sav = tmp;
261 c570fd16 ths
#endif
262 c570fd16 ths
263 c570fd16 ths
    switch (GET_LMASK64(T0)) {
264 c570fd16 ths
    case 0:
265 c570fd16 ths
        tmp = (tmp & 0x00FFFFFFFFFFFFFFULL) | (T1 << 56);
266 c570fd16 ths
        break;
267 c570fd16 ths
    case 1:
268 c570fd16 ths
        tmp = (tmp & 0x0000FFFFFFFFFFFFULL) | (T1 << 48);
269 c570fd16 ths
        break;
270 c570fd16 ths
    case 2:
271 c570fd16 ths
        tmp = (tmp & 0x000000FFFFFFFFFFULL) | (T1 << 40);
272 c570fd16 ths
        break;
273 c570fd16 ths
    case 3:
274 c570fd16 ths
        tmp = (tmp & 0x00000000FFFFFFFFULL) | (T1 << 32);
275 c570fd16 ths
        break;
276 c570fd16 ths
    case 4:
277 c570fd16 ths
        tmp = (tmp & 0x0000000000FFFFFFULL) | (T1 << 24);
278 c570fd16 ths
        break;
279 c570fd16 ths
    case 5:
280 c570fd16 ths
        tmp = (tmp & 0x000000000000FFFFULL) | (T1 << 16);
281 c570fd16 ths
        break;
282 c570fd16 ths
    case 6:
283 c570fd16 ths
        tmp = (tmp & 0x00000000000000FFULL) | (T1 << 8);
284 c570fd16 ths
        break;
285 c570fd16 ths
    case 7:
286 c570fd16 ths
        tmp = T1;
287 c570fd16 ths
        break;
288 c570fd16 ths
    }
289 c570fd16 ths
#if defined (DEBUG_OP)
290 c570fd16 ths
    if (logfile) {
291 c570fd16 ths
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
292 c570fd16 ths
                __func__, T0, sav, T1, tmp);
293 c570fd16 ths
    }
294 c570fd16 ths
#endif
295 c570fd16 ths
    RETURN();
296 c570fd16 ths
    return tmp;
297 c570fd16 ths
}
298 c570fd16 ths
299 c570fd16 ths
#endif /* MIPS_HAS_MIPS64 */