mirror of
https://github.com/qemu/qemu.git
synced 2024-12-05 01:33:41 +08:00
71 lines
1.3 KiB
C
71 lines
1.3 KiB
C
|
/* ARM memory operations. */
|
||
|
|
||
|
/* Load from address T1 into T0. */
|
||
|
#define MEM_LD_OP(name) \
|
||
|
void OPPROTO glue(op_ld##name,MEMSUFFIX)(void) \
|
||
|
{ \
|
||
|
T0 = glue(ld##name,MEMSUFFIX)(T1); \
|
||
|
FORCE_RET(); \
|
||
|
}
|
||
|
|
||
|
MEM_LD_OP(ub)
|
||
|
MEM_LD_OP(sb)
|
||
|
MEM_LD_OP(uw)
|
||
|
MEM_LD_OP(sw)
|
||
|
MEM_LD_OP(l)
|
||
|
|
||
|
#undef MEM_LD_OP
|
||
|
|
||
|
/* Store T0 to address T1. */
|
||
|
#define MEM_ST_OP(name) \
|
||
|
void OPPROTO glue(op_st##name,MEMSUFFIX)(void) \
|
||
|
{ \
|
||
|
glue(st##name,MEMSUFFIX)(T1, T0); \
|
||
|
FORCE_RET(); \
|
||
|
}
|
||
|
|
||
|
MEM_ST_OP(b)
|
||
|
MEM_ST_OP(w)
|
||
|
MEM_ST_OP(l)
|
||
|
|
||
|
#undef MEM_ST_OP
|
||
|
|
||
|
/* Swap T0 with memory at address T1. */
|
||
|
/* ??? Is this exception safe? */
|
||
|
#define MEM_SWP_OP(name, lname) \
|
||
|
void OPPROTO glue(op_swp##name,MEMSUFFIX)(void) \
|
||
|
{ \
|
||
|
uint32_t tmp; \
|
||
|
cpu_lock(); \
|
||
|
tmp = glue(ld##lname,MEMSUFFIX)(T1); \
|
||
|
glue(st##name,MEMSUFFIX)(T1, T0); \
|
||
|
T0 = tmp; \
|
||
|
cpu_unlock(); \
|
||
|
FORCE_RET(); \
|
||
|
}
|
||
|
|
||
|
MEM_SWP_OP(b, ub)
|
||
|
MEM_SWP_OP(l, l)
|
||
|
|
||
|
#undef MEM_SWP_OP
|
||
|
|
||
|
/* Floating point load/store. Address is in T1 */
|
||
|
#define VFP_MEM_OP(p, w) \
|
||
|
void OPPROTO glue(op_vfp_ld##p,MEMSUFFIX)(void) \
|
||
|
{ \
|
||
|
FT0##p = glue(ldf##w,MEMSUFFIX)(T1); \
|
||
|
FORCE_RET(); \
|
||
|
} \
|
||
|
void OPPROTO glue(op_vfp_st##p,MEMSUFFIX)(void) \
|
||
|
{ \
|
||
|
glue(stf##w,MEMSUFFIX)(T1, FT0##p); \
|
||
|
FORCE_RET(); \
|
||
|
}
|
||
|
|
||
|
VFP_MEM_OP(s,l)
|
||
|
VFP_MEM_OP(d,q)
|
||
|
|
||
|
#undef VFP_MEM_OP
|
||
|
|
||
|
#undef MEMSUFFIX
|