Use ldq and stq for 8 byte accesses (original patch by Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3405 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
8f577d3d29
commit
e909ec2f11
@ -170,6 +170,7 @@ static void dump_mxcc(CPUState *env)
|
|||||||
void helper_ld_asi(int asi, int size, int sign)
|
void helper_ld_asi(int asi, int size, int sign)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
|
uint64_t tmp;
|
||||||
#ifdef DEBUG_MXCC
|
#ifdef DEBUG_MXCC
|
||||||
uint32_t last_T0 = T0;
|
uint32_t last_T0 = T0;
|
||||||
#endif
|
#endif
|
||||||
@ -244,8 +245,9 @@ void helper_ld_asi(int asi, int size, int sign)
|
|||||||
ret = ldl_code(T0 & ~3);
|
ret = ldl_code(T0 & ~3);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ret = ldl_code(T0 & ~3);
|
tmp = ldq_code(T0 & ~7);
|
||||||
T0 = ldl_code((T0 + 4) & ~3);
|
ret = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -262,8 +264,9 @@ void helper_ld_asi(int asi, int size, int sign)
|
|||||||
ret = ldl_user(T0 & ~3);
|
ret = ldl_user(T0 & ~3);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ret = ldl_user(T0 & ~3);
|
tmp = ldq_user(T0 & ~7);
|
||||||
T0 = ldl_user((T0 + 4) & ~3);
|
ret = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -280,8 +283,9 @@ void helper_ld_asi(int asi, int size, int sign)
|
|||||||
ret = ldl_kernel(T0 & ~3);
|
ret = ldl_kernel(T0 & ~3);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ret = ldl_kernel(T0 & ~3);
|
tmp = ldq_kernel(T0 & ~7);
|
||||||
T0 = ldl_kernel((T0 + 4) & ~3);
|
ret = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -303,8 +307,9 @@ void helper_ld_asi(int asi, int size, int sign)
|
|||||||
ret = ldl_phys(T0 & ~3);
|
ret = ldl_phys(T0 & ~3);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ret = ldl_phys(T0 & ~3);
|
tmp = ldq_phys(T0 & ~7);
|
||||||
T0 = ldl_phys((T0 + 4) & ~3);
|
ret = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -325,10 +330,10 @@ void helper_ld_asi(int asi, int size, int sign)
|
|||||||
| ((target_phys_addr_t)(asi & 0xf) << 32));
|
| ((target_phys_addr_t)(asi & 0xf) << 32));
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ret = ldl_phys((target_phys_addr_t)(T0 & ~3)
|
tmp = ldq_phys((target_phys_addr_t)(T0 & ~7)
|
||||||
| ((target_phys_addr_t)(asi & 0xf) << 32));
|
|
||||||
T0 = ldl_phys((target_phys_addr_t)((T0 + 4) & ~3)
|
|
||||||
| ((target_phys_addr_t)(asi & 0xf) << 32));
|
| ((target_phys_addr_t)(asi & 0xf) << 32));
|
||||||
|
ret = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -515,8 +520,7 @@ void helper_st_asi(int asi, int size)
|
|||||||
stl_user(T0 & ~3, T1);
|
stl_user(T0 & ~3, T1);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
stl_user(T0 & ~3, T1);
|
stq_user(T0 & ~7, ((uint64_t)T1 << 32) | T2);
|
||||||
stl_user((T0 + 4) & ~3, T2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -533,8 +537,7 @@ void helper_st_asi(int asi, int size)
|
|||||||
stl_kernel(T0 & ~3, T1);
|
stl_kernel(T0 & ~3, T1);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
stl_kernel(T0 & ~3, T1);
|
stq_kernel(T0 & ~7, ((uint64_t)T1 << 32) | T2);
|
||||||
stl_kernel((T0 + 4) & ~3, T2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -591,8 +594,7 @@ void helper_st_asi(int asi, int size)
|
|||||||
stl_phys(T0 & ~3, T1);
|
stl_phys(T0 & ~3, T1);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
stl_phys(T0 & ~3, T1);
|
stq_phys(T0 & ~7, ((uint64_t)T1 << 32) | T2);
|
||||||
stl_phys((T0 + 4) & ~3, T2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -615,10 +617,9 @@ void helper_st_asi(int asi, int size)
|
|||||||
| ((target_phys_addr_t)(asi & 0xf) << 32), T1);
|
| ((target_phys_addr_t)(asi & 0xf) << 32), T1);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
stl_phys((target_phys_addr_t)(T0 & ~3)
|
stq_phys((target_phys_addr_t)(T0 & ~7)
|
||||||
| ((target_phys_addr_t)(asi & 0xf) << 32), T1);
|
| ((target_phys_addr_t)(asi & 0xf) << 32),
|
||||||
stl_phys((target_phys_addr_t)((T0 + 4) & ~3)
|
((uint64_t)T1 << 32) | T2);
|
||||||
| ((target_phys_addr_t)(asi & 0xf) << 32), T2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,9 @@ SPARC_ST_OP(sth, stw);
|
|||||||
|
|
||||||
void OPPROTO glue(op_std, MEMSUFFIX)(void)
|
void OPPROTO glue(op_std, MEMSUFFIX)(void)
|
||||||
{
|
{
|
||||||
glue(stl, MEMSUFFIX)(ADDR(T0), T1);
|
uint64_t tmp = ((uint64_t)T1 << 32) | (uint64_t)(T2 & 0xffffffff);
|
||||||
glue(stl, MEMSUFFIX)((ADDR(T0 + 4)), T2);
|
|
||||||
|
glue(stq, MEMSUFFIX)(ADDR(T0), tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OPPROTO glue(op_ldstub, MEMSUFFIX)(void)
|
void OPPROTO glue(op_ldstub, MEMSUFFIX)(void)
|
||||||
@ -55,8 +56,11 @@ void OPPROTO glue(op_swap, MEMSUFFIX)(void)
|
|||||||
|
|
||||||
void OPPROTO glue(op_ldd, MEMSUFFIX)(void)
|
void OPPROTO glue(op_ldd, MEMSUFFIX)(void)
|
||||||
{
|
{
|
||||||
T1 = glue(ldl, MEMSUFFIX)(ADDR(T0));
|
uint64_t tmp;
|
||||||
T0 = glue(ldl, MEMSUFFIX)((ADDR(T0 + 4)));
|
|
||||||
|
tmp = glue(ldq, MEMSUFFIX)(ADDR(T0));
|
||||||
|
T1 = tmp >> 32;
|
||||||
|
T0 = tmp & 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** Floating-point store ***/
|
/*** Floating-point store ***/
|
||||||
|
Loading…
Reference in New Issue
Block a user