Commit 02aab46a362acd041006776e322a85a7753e4c14
1 parent
aab33094
endianness fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1588 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
54 additions
and
26 deletions
target-sparc/op_helper.c
... | ... | @@ -256,11 +256,18 @@ void helper_ld_asi(int asi, int size, int sign) |
256 | 256 | } |
257 | 257 | break; |
258 | 258 | case 0x20 ... 0x2f: /* MMU passthrough */ |
259 | - cpu_physical_memory_read(T0, (void *) &ret, size); | |
260 | - if (size == 4) | |
261 | - tswap32s(&ret); | |
262 | - else if (size == 2) | |
263 | - tswap16s((uint16_t *)&ret); | |
259 | + switch(size) { | |
260 | + case 1: | |
261 | + ret = ldub_phys(T0); | |
262 | + break; | |
263 | + case 2: | |
264 | + ret = lduw_phys(T0 & ~1); | |
265 | + break; | |
266 | + default: | |
267 | + case 4: | |
268 | + ret = ldl_phys(T0 & ~3); | |
269 | + break; | |
270 | + } | |
264 | 271 | break; |
265 | 272 | default: |
266 | 273 | ret = 0; |
... | ... | @@ -369,12 +376,18 @@ void helper_st_asi(int asi, int size, int sign) |
369 | 376 | return; |
370 | 377 | case 0x20 ... 0x2f: /* MMU passthrough */ |
371 | 378 | { |
372 | - uint32_t temp = T1; | |
373 | - if (size == 4) | |
374 | - tswap32s(&temp); | |
375 | - else if (size == 2) | |
376 | - tswap16s((uint16_t *)&temp); | |
377 | - cpu_physical_memory_write(T0, (void *) &temp, size); | |
379 | + switch(size) { | |
380 | + case 1: | |
381 | + stb_phys(T0, T1); | |
382 | + break; | |
383 | + case 2: | |
384 | + stw_phys(T0 & ~1, T1); | |
385 | + break; | |
386 | + case 4: | |
387 | + default: | |
388 | + stl_phys(T0 & ~3, T1); | |
389 | + break; | |
390 | + } | |
378 | 391 | } |
379 | 392 | return; |
380 | 393 | default: |
... | ... | @@ -395,13 +408,21 @@ void helper_ld_asi(int asi, int size, int sign) |
395 | 408 | case 0x14: // Bypass |
396 | 409 | case 0x15: // Bypass, non-cacheable |
397 | 410 | { |
398 | - cpu_physical_memory_read(T0, (void *) &ret, size); | |
399 | - if (size == 8) | |
400 | - tswap64s(&ret); | |
401 | - if (size == 4) | |
402 | - tswap32s((uint32_t *)&ret); | |
403 | - else if (size == 2) | |
404 | - tswap16s((uint16_t *)&ret); | |
411 | + switch(size) { | |
412 | + case 1: | |
413 | + ret = ldub_phys(T0); | |
414 | + break; | |
415 | + case 2: | |
416 | + ret = lduw_phys(T0 & ~1); | |
417 | + break; | |
418 | + case 4: | |
419 | + ret = ldl_phys(T0 & ~3); | |
420 | + break; | |
421 | + default: | |
422 | + case 8: | |
423 | + ret = ldq_phys(T0 & ~7); | |
424 | + break; | |
425 | + } | |
405 | 426 | break; |
406 | 427 | } |
407 | 428 | case 0x04: // Nucleus |
... | ... | @@ -503,14 +524,21 @@ void helper_st_asi(int asi, int size, int sign) |
503 | 524 | case 0x14: // Bypass |
504 | 525 | case 0x15: // Bypass, non-cacheable |
505 | 526 | { |
506 | - target_ulong temp = T1; | |
507 | - if (size == 8) | |
508 | - tswap64s(&temp); | |
509 | - else if (size == 4) | |
510 | - tswap32s((uint32_t *)&temp); | |
511 | - else if (size == 2) | |
512 | - tswap16s((uint16_t *)&temp); | |
513 | - cpu_physical_memory_write(T0, (void *) &temp, size); | |
527 | + switch(size) { | |
528 | + case 1: | |
529 | + stb_phys(T0, T1); | |
530 | + break; | |
531 | + case 2: | |
532 | + stw_phys(T0 & ~1, T1); | |
533 | + break; | |
534 | + case 4: | |
535 | + stl_phys(T0 & ~3, T1); | |
536 | + break; | |
537 | + case 8: | |
538 | + default: | |
539 | + stq_phys(T0 & ~7, T1); | |
540 | + break; | |
541 | + } | |
514 | 542 | } |
515 | 543 | return; |
516 | 544 | case 0x04: // Nucleus | ... | ... |