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 188 /* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
189 189 kernel handles unaligned load/stores may give better results, but
190 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 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 196 #ifdef __powerpc__
197 197 int val;
... ... @@ -203,7 +203,7 @@ static inline int lduw_p(void *ptr)
203 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 208 #ifdef __powerpc__
209 209 int val;
... ... @@ -215,7 +215,7 @@ static inline int ldsw_p(void *ptr)
215 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 220 #ifdef __powerpc__
221 221 int val;
... ... @@ -227,7 +227,7 @@ static inline int ldl_p(void *ptr)
227 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 232 uint8_t *p = ptr;
233 233 uint32_t v1, v2;
... ... @@ -236,7 +236,7 @@ static inline uint64_t ldq_p(void *ptr)
236 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 241 #ifdef __powerpc__
242 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 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 252 #ifdef __powerpc__
253 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 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 265 uint8_t *p = ptr;
266 266 stl_p(p, (uint32_t)v);
... ... @@ -269,45 +269,105 @@ static inline void stq_p(void *ptr, uint64_t v)
269 269  
270 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 274 union {
275 275 float32 f;
276 276 uint32_t i;
277 277 } u;
278   - u.i = ldl_p(ptr);
  278 + u.i = ldl_le_p(ptr);
279 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 284 union {
285 285 float32 f;
286 286 uint32_t i;
287 287 } u;
288 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 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 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 302 CPU_DoubleU u;
303 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 372 #if defined(__i386__)
313 373 int val;
... ... @@ -322,7 +382,7 @@ static inline int lduw_p(void *ptr)
322 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 387 #if defined(__i386__)
328 388 int val;
... ... @@ -337,7 +397,7 @@ static inline int ldsw_p(void *ptr)
337 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 402 #if defined(__i386__) || defined(__x86_64__)
343 403 int val;
... ... @@ -352,15 +412,15 @@ static inline int ldl_p(void *ptr)
352 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 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 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 425 #if defined(__i386__)
366 426 asm volatile ("xchgb %b0, %h0\n"
... ... @@ -374,7 +434,7 @@ static inline void stw_p(void *ptr, int v)
374 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 439 #if defined(__i386__) || defined(__x86_64__)
380 440 asm volatile ("bswap %0\n"
... ... @@ -390,108 +450,136 @@ static inline void stl_p(void *ptr, int v)
390 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 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 463 union {
404 464 float32 f;
405 465 uint32_t i;
406 466 } u;
407   - u.i = ldl_p(ptr);
  467 + u.i = ldl_be_p(ptr);
408 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 473 union {
414 474 float32 f;
415 475 uint32_t i;
416 476 } u;
417 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 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 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 491 CPU_DoubleU u;
432 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 497 #else
438 498  
439   -static inline int lduw_p(void *ptr)
  499 +static inline int lduw_be_p(void *ptr)
440 500 {
441 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 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 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 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 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 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 531 *(uint64_t *)ptr = v;
472 532 }
473 533  
474 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 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 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 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 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 583 #endif
496 584  
497 585 /* MMU memory access macros */
... ...