diff options
Diffstat (limited to 'target-arm/op_mem.h')
-rw-r--r-- | target-arm/op_mem.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/target-arm/op_mem.h b/target-arm/op_mem.h index 29fd85b..9d4d5c0 100644 --- a/target-arm/op_mem.h +++ b/target-arm/op_mem.h @@ -1,12 +1,26 @@ /* ARM memory operations. */ +#ifdef GEN_TRACE /* Load from address T1 into T0. */ #define MEM_LD_OP(name) \ void OPPROTO glue(op_ld##name,MEMSUFFIX)(void) \ { \ + extern int tracing; \ + extern void dcache_load(uint32_t addr); \ + if (tracing) \ + dcache_load(T1); \ T0 = glue(ld##name,MEMSUFFIX)(T1); \ FORCE_RET(); \ } +#else +/* 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(); \ +} +#endif MEM_LD_OP(ub) MEM_LD_OP(sb) @@ -16,6 +30,19 @@ MEM_LD_OP(l) #undef MEM_LD_OP +#ifdef GEN_TRACE +/* Store T0 to address T1. */ +#define MEM_ST_OP(name) \ +void OPPROTO glue(op_st##name,MEMSUFFIX)(void) \ +{ \ + extern int tracing; \ + extern void dcache_store(uint32_t addr, uint32_t val); \ + if (tracing) \ + dcache_store(T1, T0); \ + glue(st##name,MEMSUFFIX)(T1, T0); \ + FORCE_RET(); \ +} +#else /* Store T0 to address T1. */ #define MEM_ST_OP(name) \ void OPPROTO glue(op_st##name,MEMSUFFIX)(void) \ @@ -23,6 +50,7 @@ void OPPROTO glue(op_st##name,MEMSUFFIX)(void) \ glue(st##name,MEMSUFFIX)(T1, T0); \ FORCE_RET(); \ } +#endif MEM_ST_OP(b) MEM_ST_OP(w) @@ -30,6 +58,25 @@ MEM_ST_OP(l) #undef MEM_ST_OP +#ifdef GEN_TRACE +/* 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) \ +{ \ + extern int tracing; \ + extern void dcache_swp(uint32_t addr); \ + uint32_t tmp; \ + cpu_lock(); \ + if (tracing) \ + dcache_swp(T1); \ + tmp = glue(ld##lname,MEMSUFFIX)(T1); \ + glue(st##name,MEMSUFFIX)(T1, T0); \ + T0 = tmp; \ + cpu_unlock(); \ + FORCE_RET(); \ +} +#else /* Swap T0 with memory at address T1. */ /* ??? Is this exception safe? */ #define MEM_SWP_OP(name, lname) \ @@ -43,6 +90,7 @@ void OPPROTO glue(op_swp##name,MEMSUFFIX)(void) \ cpu_unlock(); \ FORCE_RET(); \ } +#endif MEM_SWP_OP(b, ub) MEM_SWP_OP(l, l) |