Commit 2df3b95dbba21e68284409e570fbb372bdee8ab8

Authored by bellard
1 parent 5e9ab4c4

target independent memory access functions


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1626 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 139 additions and 51 deletions
cpu-all.h
@@ -188,10 +188,10 @@ static inline void stb_p(void *ptr, int v) @@ -188,10 +188,10 @@ static inline void stb_p(void *ptr, int v)
188 /* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the 188 /* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
189 kernel handles unaligned load/stores may give better results, but 189 kernel handles unaligned load/stores may give better results, but
190 it is a system wide setting : bad */ 190 it is a system wide setting : bad */
191 -#if !defined(TARGET_WORDS_BIGENDIAN) && (defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)) 191 +#if defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
192 192
193 /* conservative code for little endian unaligned accesses */ 193 /* conservative code for little endian unaligned accesses */
194 -static inline int lduw_p(void *ptr) 194 +static inline int lduw_le_p(void *ptr)
195 { 195 {
196 #ifdef __powerpc__ 196 #ifdef __powerpc__
197 int val; 197 int val;
@@ -203,7 +203,7 @@ static inline int lduw_p(void *ptr) @@ -203,7 +203,7 @@ static inline int lduw_p(void *ptr)
203 #endif 203 #endif
204 } 204 }
205 205
206 -static inline int ldsw_p(void *ptr) 206 +static inline int ldsw_le_p(void *ptr)
207 { 207 {
208 #ifdef __powerpc__ 208 #ifdef __powerpc__
209 int val; 209 int val;
@@ -215,7 +215,7 @@ static inline int ldsw_p(void *ptr) @@ -215,7 +215,7 @@ static inline int ldsw_p(void *ptr)
215 #endif 215 #endif
216 } 216 }
217 217
218 -static inline int ldl_p(void *ptr) 218 +static inline int ldl_le_p(void *ptr)
219 { 219 {
220 #ifdef __powerpc__ 220 #ifdef __powerpc__
221 int val; 221 int val;
@@ -227,7 +227,7 @@ static inline int ldl_p(void *ptr) @@ -227,7 +227,7 @@ static inline int ldl_p(void *ptr)
227 #endif 227 #endif
228 } 228 }
229 229
230 -static inline uint64_t ldq_p(void *ptr) 230 +static inline uint64_t ldq_le_p(void *ptr)
231 { 231 {
232 uint8_t *p = ptr; 232 uint8_t *p = ptr;
233 uint32_t v1, v2; 233 uint32_t v1, v2;
@@ -236,7 +236,7 @@ static inline uint64_t ldq_p(void *ptr) @@ -236,7 +236,7 @@ static inline uint64_t ldq_p(void *ptr)
236 return v1 | ((uint64_t)v2 << 32); 236 return v1 | ((uint64_t)v2 << 32);
237 } 237 }
238 238
239 -static inline void stw_p(void *ptr, int v) 239 +static inline void stw_le_p(void *ptr, int v)
240 { 240 {
241 #ifdef __powerpc__ 241 #ifdef __powerpc__
242 __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr)); 242 __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
@@ -247,7 +247,7 @@ static inline void stw_p(void *ptr, int v) @@ -247,7 +247,7 @@ static inline void stw_p(void *ptr, int v)
247 #endif 247 #endif
248 } 248 }
249 249
250 -static inline void stl_p(void *ptr, int v) 250 +static inline void stl_le_p(void *ptr, int v)
251 { 251 {
252 #ifdef __powerpc__ 252 #ifdef __powerpc__
253 __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr)); 253 __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
@@ -260,7 +260,7 @@ static inline void stl_p(void *ptr, int v) @@ -260,7 +260,7 @@ static inline void stl_p(void *ptr, int v)
260 #endif 260 #endif
261 } 261 }
262 262
263 -static inline void stq_p(void *ptr, uint64_t v) 263 +static inline void stq_le_p(void *ptr, uint64_t v)
264 { 264 {
265 uint8_t *p = ptr; 265 uint8_t *p = ptr;
266 stl_p(p, (uint32_t)v); 266 stl_p(p, (uint32_t)v);
@@ -269,45 +269,105 @@ static inline void stq_p(void *ptr, uint64_t v) @@ -269,45 +269,105 @@ static inline void stq_p(void *ptr, uint64_t v)
269 269
270 /* float access */ 270 /* float access */
271 271
272 -static inline float32 ldfl_p(void *ptr) 272 +static inline float32 ldfl_le_p(void *ptr)
273 { 273 {
274 union { 274 union {
275 float32 f; 275 float32 f;
276 uint32_t i; 276 uint32_t i;
277 } u; 277 } u;
278 - u.i = ldl_p(ptr); 278 + u.i = ldl_le_p(ptr);
279 return u.f; 279 return u.f;
280 } 280 }
281 281
282 -static inline void stfl_p(void *ptr, float32 v) 282 +static inline void stfl_le_p(void *ptr, float32 v)
283 { 283 {
284 union { 284 union {
285 float32 f; 285 float32 f;
286 uint32_t i; 286 uint32_t i;
287 } u; 287 } u;
288 u.f = v; 288 u.f = v;
289 - stl_p(ptr, u.i); 289 + stl_le_p(ptr, u.i);
290 } 290 }
291 291
292 -static inline float64 ldfq_p(void *ptr) 292 +static inline float64 ldfq_le_p(void *ptr)
293 { 293 {
294 CPU_DoubleU u; 294 CPU_DoubleU u;
295 - u.l.lower = ldl_p(ptr);  
296 - u.l.upper = ldl_p(ptr + 4); 295 + u.l.lower = ldl_le_p(ptr);
  296 + u.l.upper = ldl_le_p(ptr + 4);
297 return u.d; 297 return u.d;
298 } 298 }
299 299
300 -static inline void stfq_p(void *ptr, float64 v) 300 +static inline void stfq_le_p(void *ptr, float64 v)
301 { 301 {
302 CPU_DoubleU u; 302 CPU_DoubleU u;
303 u.d = v; 303 u.d = v;
304 - stl_p(ptr, u.l.lower);  
305 - stl_p(ptr + 4, u.l.upper); 304 + stl_le_p(ptr, u.l.lower);
  305 + stl_le_p(ptr + 4, u.l.upper);
306 } 306 }
307 307
308 -#elif defined(TARGET_WORDS_BIGENDIAN) && (!defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)) 308 +#else
  309 +
  310 +static inline int lduw_le_p(void *ptr)
  311 +{
  312 + return *(uint16_t *)ptr;
  313 +}
  314 +
  315 +static inline int ldsw_le_p(void *ptr)
  316 +{
  317 + return *(int16_t *)ptr;
  318 +}
309 319
310 -static inline int lduw_p(void *ptr) 320 +static inline int ldl_le_p(void *ptr)
  321 +{
  322 + return *(uint32_t *)ptr;
  323 +}
  324 +
  325 +static inline uint64_t ldq_le_p(void *ptr)
  326 +{
  327 + return *(uint64_t *)ptr;
  328 +}
  329 +
  330 +static inline void stw_le_p(void *ptr, int v)
  331 +{
  332 + *(uint16_t *)ptr = v;
  333 +}
  334 +
  335 +static inline void stl_le_p(void *ptr, int v)
  336 +{
  337 + *(uint32_t *)ptr = v;
  338 +}
  339 +
  340 +static inline void stq_le_p(void *ptr, uint64_t v)
  341 +{
  342 + *(uint64_t *)ptr = v;
  343 +}
  344 +
  345 +/* float access */
  346 +
  347 +static inline float32 ldfl_le_p(void *ptr)
  348 +{
  349 + return *(float32 *)ptr;
  350 +}
  351 +
  352 +static inline float64 ldfq_le_p(void *ptr)
  353 +{
  354 + return *(float64 *)ptr;
  355 +}
  356 +
  357 +static inline void stfl_le_p(void *ptr, float32 v)
  358 +{
  359 + *(float32 *)ptr = v;
  360 +}
  361 +
  362 +static inline void stfq_le_p(void *ptr, float64 v)
  363 +{
  364 + *(float64 *)ptr = v;
  365 +}
  366 +#endif
  367 +
  368 +#if !defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
  369 +
  370 +static inline int lduw_be_p(void *ptr)
311 { 371 {
312 #if defined(__i386__) 372 #if defined(__i386__)
313 int val; 373 int val;
@@ -322,7 +382,7 @@ static inline int lduw_p(void *ptr) @@ -322,7 +382,7 @@ static inline int lduw_p(void *ptr)
322 #endif 382 #endif
323 } 383 }
324 384
325 -static inline int ldsw_p(void *ptr) 385 +static inline int ldsw_be_p(void *ptr)
326 { 386 {
327 #if defined(__i386__) 387 #if defined(__i386__)
328 int val; 388 int val;
@@ -337,7 +397,7 @@ static inline int ldsw_p(void *ptr) @@ -337,7 +397,7 @@ static inline int ldsw_p(void *ptr)
337 #endif 397 #endif
338 } 398 }
339 399
340 -static inline int ldl_p(void *ptr) 400 +static inline int ldl_be_p(void *ptr)
341 { 401 {
342 #if defined(__i386__) || defined(__x86_64__) 402 #if defined(__i386__) || defined(__x86_64__)
343 int val; 403 int val;
@@ -352,15 +412,15 @@ static inline int ldl_p(void *ptr) @@ -352,15 +412,15 @@ static inline int ldl_p(void *ptr)
352 #endif 412 #endif
353 } 413 }
354 414
355 -static inline uint64_t ldq_p(void *ptr) 415 +static inline uint64_t ldq_be_p(void *ptr)
356 { 416 {
357 uint32_t a,b; 417 uint32_t a,b;
358 - a = ldl_p(ptr);  
359 - b = ldl_p(ptr+4); 418 + a = ldl_be_p(ptr);
  419 + b = ldl_be_p(ptr+4);
360 return (((uint64_t)a<<32)|b); 420 return (((uint64_t)a<<32)|b);
361 } 421 }
362 422
363 -static inline void stw_p(void *ptr, int v) 423 +static inline void stw_be_p(void *ptr, int v)
364 { 424 {
365 #if defined(__i386__) 425 #if defined(__i386__)
366 asm volatile ("xchgb %b0, %h0\n" 426 asm volatile ("xchgb %b0, %h0\n"
@@ -374,7 +434,7 @@ static inline void stw_p(void *ptr, int v) @@ -374,7 +434,7 @@ static inline void stw_p(void *ptr, int v)
374 #endif 434 #endif
375 } 435 }
376 436
377 -static inline void stl_p(void *ptr, int v) 437 +static inline void stl_be_p(void *ptr, int v)
378 { 438 {
379 #if defined(__i386__) || defined(__x86_64__) 439 #if defined(__i386__) || defined(__x86_64__)
380 asm volatile ("bswap %0\n" 440 asm volatile ("bswap %0\n"
@@ -390,108 +450,136 @@ static inline void stl_p(void *ptr, int v) @@ -390,108 +450,136 @@ static inline void stl_p(void *ptr, int v)
390 #endif 450 #endif
391 } 451 }
392 452
393 -static inline void stq_p(void *ptr, uint64_t v) 453 +static inline void stq_be_p(void *ptr, uint64_t v)
394 { 454 {
395 - stl_p(ptr, v >> 32);  
396 - stl_p(ptr + 4, v); 455 + stl_be_p(ptr, v >> 32);
  456 + stl_be_p(ptr + 4, v);
397 } 457 }
398 458
399 /* float access */ 459 /* float access */
400 460
401 -static inline float32 ldfl_p(void *ptr) 461 +static inline float32 ldfl_be_p(void *ptr)
402 { 462 {
403 union { 463 union {
404 float32 f; 464 float32 f;
405 uint32_t i; 465 uint32_t i;
406 } u; 466 } u;
407 - u.i = ldl_p(ptr); 467 + u.i = ldl_be_p(ptr);
408 return u.f; 468 return u.f;
409 } 469 }
410 470
411 -static inline void stfl_p(void *ptr, float32 v) 471 +static inline void stfl_be_p(void *ptr, float32 v)
412 { 472 {
413 union { 473 union {
414 float32 f; 474 float32 f;
415 uint32_t i; 475 uint32_t i;
416 } u; 476 } u;
417 u.f = v; 477 u.f = v;
418 - stl_p(ptr, u.i); 478 + stl_be_p(ptr, u.i);
419 } 479 }
420 480
421 -static inline float64 ldfq_p(void *ptr) 481 +static inline float64 ldfq_be_p(void *ptr)
422 { 482 {
423 CPU_DoubleU u; 483 CPU_DoubleU u;
424 - u.l.upper = ldl_p(ptr);  
425 - u.l.lower = ldl_p(ptr + 4); 484 + u.l.upper = ldl_be_p(ptr);
  485 + u.l.lower = ldl_be_p(ptr + 4);
426 return u.d; 486 return u.d;
427 } 487 }
428 488
429 -static inline void stfq_p(void *ptr, float64 v) 489 +static inline void stfq_be_p(void *ptr, float64 v)
430 { 490 {
431 CPU_DoubleU u; 491 CPU_DoubleU u;
432 u.d = v; 492 u.d = v;
433 - stl_p(ptr, u.l.upper);  
434 - stl_p(ptr + 4, u.l.lower); 493 + stl_be_p(ptr, u.l.upper);
  494 + stl_be_p(ptr + 4, u.l.lower);
435 } 495 }
436 496
437 #else 497 #else
438 498
439 -static inline int lduw_p(void *ptr) 499 +static inline int lduw_be_p(void *ptr)
440 { 500 {
441 return *(uint16_t *)ptr; 501 return *(uint16_t *)ptr;
442 } 502 }
443 503
444 -static inline int ldsw_p(void *ptr) 504 +static inline int ldsw_be_p(void *ptr)
445 { 505 {
446 return *(int16_t *)ptr; 506 return *(int16_t *)ptr;
447 } 507 }
448 508
449 -static inline int ldl_p(void *ptr) 509 +static inline int ldl_be_p(void *ptr)
450 { 510 {
451 return *(uint32_t *)ptr; 511 return *(uint32_t *)ptr;
452 } 512 }
453 513
454 -static inline uint64_t ldq_p(void *ptr) 514 +static inline uint64_t ldq_be_p(void *ptr)
455 { 515 {
456 return *(uint64_t *)ptr; 516 return *(uint64_t *)ptr;
457 } 517 }
458 518
459 -static inline void stw_p(void *ptr, int v) 519 +static inline void stw_be_p(void *ptr, int v)
460 { 520 {
461 *(uint16_t *)ptr = v; 521 *(uint16_t *)ptr = v;
462 } 522 }
463 523
464 -static inline void stl_p(void *ptr, int v) 524 +static inline void stl_be_p(void *ptr, int v)
465 { 525 {
466 *(uint32_t *)ptr = v; 526 *(uint32_t *)ptr = v;
467 } 527 }
468 528
469 -static inline void stq_p(void *ptr, uint64_t v) 529 +static inline void stq_be_p(void *ptr, uint64_t v)
470 { 530 {
471 *(uint64_t *)ptr = v; 531 *(uint64_t *)ptr = v;
472 } 532 }
473 533
474 /* float access */ 534 /* float access */
475 535
476 -static inline float32 ldfl_p(void *ptr) 536 +static inline float32 ldfl_be_p(void *ptr)
477 { 537 {
478 return *(float32 *)ptr; 538 return *(float32 *)ptr;
479 } 539 }
480 540
481 -static inline float64 ldfq_p(void *ptr) 541 +static inline float64 ldfq_be_p(void *ptr)
482 { 542 {
483 return *(float64 *)ptr; 543 return *(float64 *)ptr;
484 } 544 }
485 545
486 -static inline void stfl_p(void *ptr, float32 v) 546 +static inline void stfl_be_p(void *ptr, float32 v)
487 { 547 {
488 *(float32 *)ptr = v; 548 *(float32 *)ptr = v;
489 } 549 }
490 550
491 -static inline void stfq_p(void *ptr, float64 v) 551 +static inline void stfq_be_p(void *ptr, float64 v)
492 { 552 {
493 *(float64 *)ptr = v; 553 *(float64 *)ptr = v;
494 } 554 }
  555 +
  556 +#endif
  557 +
  558 +/* target CPU memory access functions */
  559 +#if defined(TARGET_WORDS_BIGENDIAN)
  560 +#define lduw_p(p) lduw_be_p(p)
  561 +#define ldsw_p(p) ldsw_be_p(p)
  562 +#define ldl_p(p) ldl_be_p(p)
  563 +#define ldq_p(p) ldq_be_p(p)
  564 +#define ldfl_p(p) ldfl_be_p(p)
  565 +#define ldfq_p(p) ldfq_be_p(p)
  566 +#define stw_p(p, v) stw_be_p(p, v)
  567 +#define stl_p(p, v) stl_be_p(p, v)
  568 +#define stq_p(p, v) stq_be_p(p, v)
  569 +#define stfl_p(p, v) stfl_be_p(p, v)
  570 +#define stfq_p(p, v) stfq_be_p(p, v)
  571 +#else
  572 +#define lduw_p(p) lduw_le_p(p)
  573 +#define ldsw_p(p) ldsw_le_p(p)
  574 +#define ldl_p(p) ldl_le_p(p)
  575 +#define ldq_p(p) ldq_le_p(p)
  576 +#define ldfl_p(p) ldfl_le_p(p)
  577 +#define ldfq_p(p) ldfq_le_p(p)
  578 +#define stw_p(p, v) stw_le_p(p, v)
  579 +#define stl_p(p, v) stl_le_p(p, v)
  580 +#define stq_p(p, v) stq_le_p(p, v)
  581 +#define stfl_p(p, v) stfl_le_p(p, v)
  582 +#define stfq_p(p, v) stfq_le_p(p, v)
495 #endif 583 #endif
496 584
497 /* MMU memory access macros */ 585 /* MMU memory access macros */