Revision 4e9f8537 target-mips/op_mem.c

b/target-mips/op_mem.c
75 75

  
76 76
/* "half" load and stores.  We must do the memory access inline,
77 77
   or fault handling won't work.  */
78
/* XXX: This is broken, CP0_BADVADDR has the wrong (aligned) value. */
78

  
79
#ifdef TARGET_WORDS_BIGENDIAN
80
#define GET_LMASK(v) ((v) & 3)
81
#define GET_OFFSET(addr, offset) (addr + (offset))
82
#else
83
#define GET_LMASK(v) (((v) & 3) ^ 3)
84
#define GET_OFFSET(addr, offset) (addr - (offset))
85
#endif
86

  
79 87
void glue(op_lwl, MEMSUFFIX) (void)
80 88
{
81
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
82
    CALL_FROM_TB1(glue(do_lwl, MEMSUFFIX), tmp);
89
    target_ulong tmp;
90

  
91
    tmp = glue(ldub, MEMSUFFIX)(T0);
92
    T1 = (int32_t)((T1 & 0x00FFFFFF) | (tmp << 24));
93

  
94
    if (GET_LMASK(T0) <= 2) {
95
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 1));
96
        T1 = (T1 & 0xFF00FFFF) | (tmp << 16);
97
    }
98

  
99
    if (GET_LMASK(T0) <= 1) {
100
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 2));
101
        T1 = (T1 & 0xFFFF00FF) | (tmp << 8);
102
    }
103

  
104
    if (GET_LMASK(T0) == 0) {
105
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 3));
106
        T1 = (T1 & 0xFFFFFF00) | tmp;
107
    }
83 108
    RETURN();
84 109
}
85 110

  
86 111
void glue(op_lwr, MEMSUFFIX) (void)
87 112
{
88
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
89
    CALL_FROM_TB1(glue(do_lwr, MEMSUFFIX), tmp);
113
    target_ulong tmp;
114

  
115
    tmp = glue(ldub, MEMSUFFIX)(T0);
116
    T1 = (T1 & 0xFFFFFF00) | tmp;
117

  
118
    if (GET_LMASK(T0) >= 1) {
119
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -1));
120
        T1 = (T1 & 0xFFFF00FF) | (tmp << 8);
121
    }
122

  
123
    if (GET_LMASK(T0) >= 2) {
124
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -2));
125
        T1 = (T1 & 0xFF00FFFF) | (tmp << 16);
126
    }
127

  
128
    if (GET_LMASK(T0) == 3) {
129
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -3));
130
        T1 = (T1 & 0x00FFFFFF) | (tmp << 24);
131
    }
90 132
    RETURN();
91 133
}
92 134

  
93 135
void glue(op_swl, MEMSUFFIX) (void)
94 136
{
95
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
96
    tmp = CALL_FROM_TB1(glue(do_swl, MEMSUFFIX), tmp);
97
    glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
137
    glue(stb, MEMSUFFIX)(T0, (uint8_t)(T1 >> 24));
138

  
139
    if (GET_LMASK(T0) <= 2)
140
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 1), (uint8_t)(T1 >> 16));
141

  
142
    if (GET_LMASK(T0) <= 1)
143
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 2), (uint8_t)(T1 >> 8));
144

  
145
    if (GET_LMASK(T0) == 0)
146
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 3), (uint8_t)T1);
147

  
98 148
    RETURN();
99 149
}
100 150

  
101 151
void glue(op_swr, MEMSUFFIX) (void)
102 152
{
103
    uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
104
    tmp = CALL_FROM_TB1(glue(do_swr, MEMSUFFIX), tmp);
105
    glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
153
    glue(stb, MEMSUFFIX)(T0, (uint8_t)T1);
154

  
155
    if (GET_LMASK(T0) >= 1)
156
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -1), (uint8_t)(T1 >> 8));
157

  
158
    if (GET_LMASK(T0) >= 2)
159
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -2), (uint8_t)(T1 >> 16));
160

  
161
    if (GET_LMASK(T0) == 3)
162
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -3), (uint8_t)(T1 >> 24));
163

  
106 164
    RETURN();
107 165
}
108 166

  
......
145 203

  
146 204
/* "half" load and stores.  We must do the memory access inline,
147 205
   or fault handling won't work.  */
206

  
207
#ifdef TARGET_WORDS_BIGENDIAN
208
#define GET_LMASK64(v) ((v) & 7)
209
#else
210
#define GET_LMASK64(v) (((v) & 7) ^ 7)
211
#endif
212

  
148 213
void glue(op_ldl, MEMSUFFIX) (void)
149 214
{
150
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
151
    CALL_FROM_TB1(glue(do_ldl, MEMSUFFIX), tmp);
215
    uint64_t tmp;
216

  
217
    tmp = glue(ldub, MEMSUFFIX)(T0);
218
    T1 = (T1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
219

  
220
    if (GET_LMASK64(T0) <= 6) {
221
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 1));
222
        T1 = (T1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
223
    }
224

  
225
    if (GET_LMASK64(T0) <= 5) {
226
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 2));
227
        T1 = (T1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
228
    }
229

  
230
    if (GET_LMASK64(T0) <= 4) {
231
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 3));
232
        T1 = (T1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
233
    }
234

  
235
    if (GET_LMASK64(T0) <= 3) {
236
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 4));
237
        T1 = (T1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
238
    }
239

  
240
    if (GET_LMASK64(T0) <= 2) {
241
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 5));
242
        T1 = (T1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
243
    }
244

  
245
    if (GET_LMASK64(T0) <= 1) {
246
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 6));
247
        T1 = (T1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8);
248
    }
249

  
250
    if (GET_LMASK64(T0) == 0) {
251
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, 7));
252
        T1 = (T1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
253
    }
254

  
152 255
    RETURN();
153 256
}
154 257

  
155 258
void glue(op_ldr, MEMSUFFIX) (void)
156 259
{
157
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
158
    CALL_FROM_TB1(glue(do_ldr, MEMSUFFIX), tmp);
260
    uint64_t tmp;
261

  
262
    tmp = glue(ldub, MEMSUFFIX)(T0);
263
    T1 = (T1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
264

  
265
    if (GET_LMASK64(T0) >= 1) {
266
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -1));
267
        T1 = (T1 & 0xFFFFFFFFFFFF00FFULL) | (tmp  << 8);
268
    }
269

  
270
    if (GET_LMASK64(T0) >= 2) {
271
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -2));
272
        T1 = (T1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
273
    }
274

  
275
    if (GET_LMASK64(T0) >= 3) {
276
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -3));
277
        T1 = (T1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
278
    }
279

  
280
    if (GET_LMASK64(T0) >= 4) {
281
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -4));
282
        T1 = (T1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
283
    }
284

  
285
    if (GET_LMASK64(T0) >= 5) {
286
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -5));
287
        T1 = (T1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
288
    }
289

  
290
    if (GET_LMASK64(T0) >= 6) {
291
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -6));
292
        T1 = (T1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
293
    }
294

  
295
    if (GET_LMASK64(T0) == 7) {
296
        tmp = glue(ldub, MEMSUFFIX)(GET_OFFSET(T0, -7));
297
        T1 = (T1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
298
    }
299

  
159 300
    RETURN();
160 301
}
161 302

  
162 303
void glue(op_sdl, MEMSUFFIX) (void)
163 304
{
164
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
165
    tmp = CALL_FROM_TB1(glue(do_sdl, MEMSUFFIX), tmp);
166
    glue(stq, MEMSUFFIX)(T0 & ~7, tmp);
305
    glue(stb, MEMSUFFIX)(T0, (uint8_t)(T1 >> 56));
306

  
307
    if (GET_LMASK64(T0) <= 6)
308
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 1), (uint8_t)(T1 >> 48));
309

  
310
    if (GET_LMASK64(T0) <= 5)
311
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 2), (uint8_t)(T1 >> 40));
312

  
313
    if (GET_LMASK64(T0) <= 4)
314
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 3), (uint8_t)(T1 >> 32));
315

  
316
    if (GET_LMASK64(T0) <= 3)
317
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 4), (uint8_t)(T1 >> 24));
318

  
319
    if (GET_LMASK64(T0) <= 2)
320
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 5), (uint8_t)(T1 >> 16));
321

  
322
    if (GET_LMASK64(T0) <= 1)
323
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 6), (uint8_t)(T1 >> 8));
324

  
325
    if (GET_LMASK64(T0) <= 0)
326
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, 7), (uint8_t)T1);
327

  
167 328
    RETURN();
168 329
}
169 330

  
170 331
void glue(op_sdr, MEMSUFFIX) (void)
171 332
{
172
    target_long tmp = glue(ldq, MEMSUFFIX)(T0 & ~7);
173
    tmp = CALL_FROM_TB1(glue(do_sdr, MEMSUFFIX), tmp);
174
    glue(stq, MEMSUFFIX)(T0 & ~7, tmp);
333
    glue(stb, MEMSUFFIX)(T0, (uint8_t)T1);
334

  
335
    if (GET_LMASK64(T0) >= 1)
336
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -1), (uint8_t)(T1 >> 8));
337

  
338
    if (GET_LMASK64(T0) >= 2)
339
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -2), (uint8_t)(T1 >> 16));
340

  
341
    if (GET_LMASK64(T0) >= 3)
342
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -3), (uint8_t)(T1 >> 24));
343

  
344
    if (GET_LMASK64(T0) >= 4)
345
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -4), (uint8_t)(T1 >> 32));
346

  
347
    if (GET_LMASK64(T0) >= 5)
348
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -5), (uint8_t)(T1 >> 40));
349

  
350
    if (GET_LMASK64(T0) >= 6)
351
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -6), (uint8_t)(T1 >> 48));
352

  
353
    if (GET_LMASK64(T0) == 7)
354
        glue(stb, MEMSUFFIX)(GET_OFFSET(T0, -7), (uint8_t)(T1 >> 56));
355

  
175 356
    RETURN();
176 357
}
177 358

  

Also available in: Unified diff