Commit 02aab46a362acd041006776e322a85a7753e4c14

Authored by bellard
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,11 +256,18 @@ void helper_ld_asi(int asi, int size, int sign)
256 } 256 }
257 break; 257 break;
258 case 0x20 ... 0x2f: /* MMU passthrough */ 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 break; 271 break;
265 default: 272 default:
266 ret = 0; 273 ret = 0;
@@ -369,12 +376,18 @@ void helper_st_asi(int asi, int size, int sign) @@ -369,12 +376,18 @@ void helper_st_asi(int asi, int size, int sign)
369 return; 376 return;
370 case 0x20 ... 0x2f: /* MMU passthrough */ 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 return; 392 return;
380 default: 393 default:
@@ -395,13 +408,21 @@ void helper_ld_asi(int asi, int size, int sign) @@ -395,13 +408,21 @@ void helper_ld_asi(int asi, int size, int sign)
395 case 0x14: // Bypass 408 case 0x14: // Bypass
396 case 0x15: // Bypass, non-cacheable 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 break; 426 break;
406 } 427 }
407 case 0x04: // Nucleus 428 case 0x04: // Nucleus
@@ -503,14 +524,21 @@ void helper_st_asi(int asi, int size, int sign) @@ -503,14 +524,21 @@ void helper_st_asi(int asi, int size, int sign)
503 case 0x14: // Bypass 524 case 0x14: // Bypass
504 case 0x15: // Bypass, non-cacheable 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 return; 543 return;
516 case 0x04: // Nucleus 544 case 0x04: // Nucleus