aboutsummaryrefslogtreecommitdiffstats
path: root/target-arm/op_mem.h
diff options
context:
space:
mode:
Diffstat (limited to 'target-arm/op_mem.h')
-rw-r--r--target-arm/op_mem.h48
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)