Statistics
| Branch: | Revision:

root / target-mips / op_helper_mem.c @ c570fd16

History | View | Annotate | Download (6.3 kB)

1
#ifdef TARGET_WORDS_BIGENDIAN
2
#define GET_LMASK(v) ((v) & 3)
3
#else
4
#define GET_LMASK(v) (((v) & 3) ^ 3)
5
#endif
6

    
7
void glue(do_lwl, MEMSUFFIX) (uint32_t tmp)
8
{
9
#if defined (DEBUG_OP)
10
    target_ulong sav = T0;
11
#endif
12

    
13
    switch (GET_LMASK(T0)) {
14
    case 0:
15
        T0 = tmp;
16
        break;
17
    case 1:
18
        T0 = (tmp << 8) | (T1 & 0x000000FF);
19
        break;
20
    case 2:
21
        T0 = (tmp << 16) | (T1 & 0x0000FFFF);
22
        break;
23
    case 3:
24
        T0 = (tmp << 24) | (T1 & 0x00FFFFFF);
25
        break;
26
    }
27
#if defined (DEBUG_OP)
28
    if (logfile) {
29
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
30
                __func__, sav, tmp, T1, T0);
31
    }
32
#endif
33
    RETURN();
34
}
35

    
36
void glue(do_lwr, MEMSUFFIX) (uint32_t tmp)
37
{
38
#if defined (DEBUG_OP)
39
    target_ulong sav = T0;
40
#endif
41

    
42
    switch (GET_LMASK(T0)) {
43
    case 0:
44
        T0 = (tmp >> 24) | (T1 & 0xFFFFFF00);
45
        break;
46
    case 1:
47
        T0 = (tmp >> 16) | (T1 & 0xFFFF0000);
48
        break;
49
    case 2:
50
        T0 = (tmp >> 8) | (T1 & 0xFF000000);
51
        break;
52
    case 3:
53
        T0 = tmp;
54
        break;
55
    }
56
#if defined (DEBUG_OP)
57
    if (logfile) {
58
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
59
                __func__, sav, tmp, T1, T0);
60
    }
61
#endif
62
    RETURN();
63
}
64

    
65
uint32_t glue(do_swl, MEMSUFFIX) (uint32_t tmp)
66
{
67
#if defined (DEBUG_OP)
68
    target_ulong sav = tmp;
69
#endif
70

    
71
    switch (GET_LMASK(T0)) {
72
    case 0:
73
        tmp = T1;
74
        break;
75
    case 1:
76
        tmp = (tmp & 0xFF000000) | (T1 >> 8);
77
        break;
78
    case 2:
79
        tmp = (tmp & 0xFFFF0000) | (T1 >> 16);
80
        break;
81
    case 3:
82
        tmp = (tmp & 0xFFFFFF00) | (T1 >> 24);
83
        break;
84
    }
85
#if defined (DEBUG_OP)
86
    if (logfile) {
87
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
88
                __func__, T0, sav, T1, tmp);
89
    }
90
#endif
91
    RETURN();
92
    return tmp;
93
}
94

    
95
uint32_t glue(do_swr, MEMSUFFIX) (uint32_t tmp)
96
{
97
#if defined (DEBUG_OP)
98
    target_ulong sav = tmp;
99
#endif
100

    
101
    switch (GET_LMASK(T0)) {
102
    case 0:
103
        tmp = (tmp & 0x00FFFFFF) | (T1 << 24);
104
        break;
105
    case 1:
106
        tmp = (tmp & 0x0000FFFF) | (T1 << 16);
107
        break;
108
    case 2:
109
        tmp = (tmp & 0x000000FF) | (T1 << 8);
110
        break;
111
    case 3:
112
        tmp = T1;
113
        break;
114
    }
115
#if defined (DEBUG_OP)
116
    if (logfile) {
117
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
118
                __func__, T0, sav, T1, tmp);
119
    }
120
#endif
121
    RETURN();
122
    return tmp;
123
}
124

    
125
#ifdef MIPS_HAS_MIPS64
126

    
127
# ifdef TARGET_WORDS_BIGENDIAN
128
#define GET_LMASK64(v) ((v) & 4)
129
#else
130
#define GET_LMASK64(v) (((v) & 4) ^ 4)
131
#endif
132

    
133
void glue(do_ldl, MEMSUFFIX) (uint64_t tmp)
134
{
135
#if defined (DEBUG_OP)
136
    target_ulong sav = T0;
137
#endif
138

    
139
    switch (GET_LMASK64(T0)) {
140
    case 0:
141
        T0 = tmp;
142
        break;
143
    case 1:
144
        T0 = (tmp << 8) | (T1 & 0x00000000000000FFULL);
145
        break;
146
    case 2:
147
        T0 = (tmp << 16) | (T1 & 0x000000000000FFFFULL);
148
        break;
149
    case 3:
150
        T0 = (tmp << 24) | (T1 & 0x0000000000FFFFFFULL);
151
        break;
152
    case 4:
153
        T0 = (tmp << 32) | (T1 & 0x00000000FFFFFFFFULL);
154
        break;
155
    case 5:
156
        T0 = (tmp << 40) | (T1 & 0x000000FFFFFFFFFFULL);
157
        break;
158
    case 6:
159
        T0 = (tmp << 48) | (T1 & 0x0000FFFFFFFFFFFFULL);
160
        break;
161
    case 7:
162
        T0 = (tmp << 56) | (T1 & 0x00FFFFFFFFFFFFFFULL);
163
        break;
164
    }
165
#if defined (DEBUG_OP)
166
    if (logfile) {
167
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
168
                __func__, sav, tmp, T1, T0);
169
    }
170
#endif
171
    RETURN();
172
}
173

    
174
void glue(do_ldr, MEMSUFFIX) (uint64_t tmp)
175
{
176
#if defined (DEBUG_OP)
177
    target_ulong sav = T0;
178
#endif
179

    
180
    switch (GET_LMASK64(T0)) {
181
    case 0:
182
        T0 = (tmp >> 56) | (T1 & 0xFFFFFFFFFFFFFF00ULL);
183
        break;
184
    case 1:
185
        T0 = (tmp >> 48) | (T1 & 0xFFFFFFFFFFFF0000ULL);
186
        break;
187
    case 2:
188
        T0 = (tmp >> 40) | (T1 & 0xFFFFFFFFFF000000ULL);
189
        break;
190
    case 3:
191
        T0 = (tmp >> 32) | (T1 & 0xFFFFFFFF00000000ULL);
192
        break;
193
    case 4:
194
        T0 = (tmp >> 24) | (T1 & 0xFFFFFF0000000000ULL);
195
        break;
196
    case 5:
197
        T0 = (tmp >> 16) | (T1 & 0xFFFF000000000000ULL);
198
        break;
199
    case 6:
200
        T0 = (tmp >> 8) | (T1 & 0xFF00000000000000ULL);
201
        break;
202
    case 7:
203
        T0 = tmp;
204
        break;
205
    }
206
#if defined (DEBUG_OP)
207
    if (logfile) {
208
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
209
                __func__, sav, tmp, T1, T0);
210
    }
211
#endif
212
    RETURN();
213
}
214

    
215
uint64_t glue(do_sdl, MEMSUFFIX) (uint64_t tmp)
216
{
217
#if defined (DEBUG_OP)
218
    target_ulong sav = tmp;
219
#endif
220

    
221
    switch (GET_LMASK64(T0)) {
222
    case 0:
223
        tmp = T1;
224
        break;
225
    case 1:
226
        tmp = (tmp & 0xFF00000000000000ULL) | (T1 >> 8);
227
        break;
228
    case 2:
229
        tmp = (tmp & 0xFFFF000000000000ULL) | (T1 >> 16);
230
        break;
231
    case 3:
232
        tmp = (tmp & 0xFFFFFF0000000000ULL) | (T1 >> 24);
233
        break;
234
    case 4:
235
        tmp = (tmp & 0xFFFFFFFF00000000ULL) | (T1 >> 32);
236
        break;
237
    case 5:
238
        tmp = (tmp & 0xFFFFFFFFFF000000ULL) | (T1 >> 40);
239
        break;
240
    case 6:
241
        tmp = (tmp & 0xFFFFFFFFFFFF0000ULL) | (T1 >> 48);
242
        break;
243
    case 7:
244
        tmp = (tmp & 0xFFFFFFFFFFFFFF00ULL) | (T1 >> 56);
245
        break;
246
    }
247
#if defined (DEBUG_OP)
248
    if (logfile) {
249
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
250
                __func__, T0, sav, T1, tmp);
251
    }
252
#endif
253
    RETURN();
254
    return tmp;
255
}
256

    
257
uint64_t glue(do_sdr, MEMSUFFIX) (uint64_t tmp)
258
{
259
#if defined (DEBUG_OP)
260
    target_ulong sav = tmp;
261
#endif
262

    
263
    switch (GET_LMASK64(T0)) {
264
    case 0:
265
        tmp = (tmp & 0x00FFFFFFFFFFFFFFULL) | (T1 << 56);
266
        break;
267
    case 1:
268
        tmp = (tmp & 0x0000FFFFFFFFFFFFULL) | (T1 << 48);
269
        break;
270
    case 2:
271
        tmp = (tmp & 0x000000FFFFFFFFFFULL) | (T1 << 40);
272
        break;
273
    case 3:
274
        tmp = (tmp & 0x00000000FFFFFFFFULL) | (T1 << 32);
275
        break;
276
    case 4:
277
        tmp = (tmp & 0x0000000000FFFFFFULL) | (T1 << 24);
278
        break;
279
    case 5:
280
        tmp = (tmp & 0x000000000000FFFFULL) | (T1 << 16);
281
        break;
282
    case 6:
283
        tmp = (tmp & 0x00000000000000FFULL) | (T1 << 8);
284
        break;
285
    case 7:
286
        tmp = T1;
287
        break;
288
    }
289
#if defined (DEBUG_OP)
290
    if (logfile) {
291
        fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
292
                __func__, T0, sav, T1, tmp);
293
    }
294
#endif
295
    RETURN();
296
    return tmp;
297
}
298

    
299
#endif /* MIPS_HAS_MIPS64 */