Convert align checks to TCG
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Fri, 21 Mar 2008 18:08:59 +0000 (18:08 +0000)
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Fri, 21 Mar 2008 18:08:59 +0000 (18:08 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4097 c046a42c-6fe2-441c-8c8c-71466251a162

target-sparc/helper.h
target-sparc/op.c
target-sparc/op_helper.c
target-sparc/translate.c

index 4bf363b..39dac74 100644 (file)
@@ -37,6 +37,7 @@ void TCG_HELPER_PROTO helper_tick_set_limit(void *opaque, uint64_t limit);
 void TCG_HELPER_PROTO helper_trap(target_ulong nb_trap);
 void TCG_HELPER_PROTO helper_trapcc(target_ulong nb_trap,
                                     target_ulong do_trap);
+void TCG_HELPER_PROTO helper_check_align(target_ulong addr, uint32_t align);
 void TCG_HELPER_PROTO helper_debug(void);
 void TCG_HELPER_PROTO helper_save(void);
 void TCG_HELPER_PROTO helper_restore(void);
index cc4aa14..e06cd81 100644 (file)
 #include "op_mem.h"
 #endif
 #endif
-
-#define CHECK_ALIGN_OP(align)                           \
-    void OPPROTO op_check_align_T0_ ## align (void)     \
-    {                                                   \
-        if (T0 & align)                                 \
-            raise_exception(TT_UNALIGNED);              \
-        FORCE_RET();                                    \
-    }
-
-CHECK_ALIGN_OP(1)
-CHECK_ALIGN_OP(3)
-CHECK_ALIGN_OP(7)
index 6e64eb8..bc9bb17 100644 (file)
@@ -50,6 +50,12 @@ void helper_trapcc(target_ulong nb_trap, target_ulong do_trap)
     }
 }
 
+void helper_check_align(target_ulong addr, uint32_t align)
+{
+    if (addr & align)
+        raise_exception(TT_UNALIGNED);
+}
+
 #define F_HELPER(name, p) void helper_f##name##p(void)
 
 #if defined(CONFIG_USER_ONLY)
index 69ce4cb..eb1906d 100644 (file)
@@ -1664,6 +1664,26 @@ static inline void gen_clear_float_exceptions(void)
     tcg_gen_helper_0_0(helper_clear_float_exceptions);
 }
 
+static inline void gen_check_align(TCGv r_addr, int align)
+{
+    tcg_gen_helper_0_2(helper_check_align, r_addr, tcg_const_i32(align));
+}
+
+static inline void gen_op_check_align_T0_1(void)
+{
+    gen_check_align(cpu_T[0], 1);
+}
+
+static inline void gen_op_check_align_T0_3(void)
+{
+    gen_check_align(cpu_T[0], 3);
+}
+
+static inline void gen_op_check_align_T0_7(void)
+{
+    gen_check_align(cpu_T[0], 7);
+}
+
 /* asi moves */
 #ifdef TARGET_SPARC64
 static inline TCGv gen_get_asi(int insn, TCGv r_addr)