Commit 2df3b95dbba21e68284409e570fbb372bdee8ab8
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 */ | ... | ... |