]> Git Repo - qemu.git/blobdiff - target-sparc/translate.c
Split icc and xcc flag calculations
[qemu.git] / target-sparc / translate.c
index e81ef84d72e95b9a392a21793737748a0eeeea19..aa97eb9d9b4f732a8bfe1b90b7eda63bb2f6f5c1 100644 (file)
@@ -112,8 +112,6 @@ static int sign_extend(int x, int len)
 
 #define IS_IMM (insn & (1<<13))
 
-static void disas_sparc_insn(DisasContext * dc);
-
 /* floating point registers moves */
 static void gen_op_load_fpr_FT0(unsigned int src)
 {
@@ -236,11 +234,6 @@ OP_LD_TABLE(lddf);
 #define ABI32_MASK(addr)
 #endif
 
-static inline void gen_movl_simm_T1(int32_t val)
-{
-    tcg_gen_movi_tl(cpu_T[1], val);
-}
-
 static inline void gen_movl_reg_TN(int reg, TCGv tn)
 {
     if (reg == 0)
@@ -252,23 +245,6 @@ static inline void gen_movl_reg_TN(int reg, TCGv tn)
     }
 }
 
-static inline void gen_movl_reg_T0(int reg)
-{
-    gen_movl_reg_TN(reg, cpu_T[0]);
-}
-
-static inline void gen_movl_reg_T1(int reg)
-{
-    gen_movl_reg_TN(reg, cpu_T[1]);
-}
-
-#ifdef __i386__
-static inline void gen_movl_reg_T2(int reg)
-{
-    gen_movl_reg_TN(reg, cpu_T[2]);
-}
-
-#endif /* __i386__ */
 static inline void gen_movl_TN_reg(int reg, TCGv tn)
 {
     if (reg == 0)
@@ -280,63 +256,6 @@ static inline void gen_movl_TN_reg(int reg, TCGv tn)
     }
 }
 
-static inline void gen_movl_T0_reg(int reg)
-{
-    gen_movl_TN_reg(reg, cpu_T[0]);
-}
-
-static inline void gen_movl_T1_reg(int reg)
-{
-    gen_movl_TN_reg(reg, cpu_T[1]);
-}
-
-static inline void gen_op_movl_T0_env(size_t offset)
-{
-    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offset);
-    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
-}
-
-static inline void gen_op_movl_env_T0(size_t offset)
-{
-    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
-    tcg_gen_st_i32(cpu_tmp32, cpu_env, offset);
-}
-
-static inline void gen_op_movtl_T0_env(size_t offset)
-{
-    tcg_gen_ld_tl(cpu_T[0], cpu_env, offset);
-}
-
-static inline void gen_op_movtl_env_T0(size_t offset)
-{
-    tcg_gen_st_tl(cpu_T[0], cpu_env, offset);
-}
-
-static inline void gen_op_add_T1_T0(void)
-{
-    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-}
-
-static inline void gen_op_or_T1_T0(void)
-{
-    tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-}
-
-static inline void gen_op_xor_T1_T0(void)
-{
-    tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-}
-
-static inline void gen_jmp_im(target_ulong pc)
-{
-    tcg_gen_movi_tl(cpu_pc, pc);
-}
-
-static inline void gen_movl_npc_im(target_ulong npc)
-{
-    tcg_gen_movi_tl(cpu_npc, npc);
-}
-
 static inline void gen_goto_tb(DisasContext *s, int tb_num,
                                target_ulong pc, target_ulong npc)
 {
@@ -347,13 +266,13 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num,
         (npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK))  {
         /* jump to same page: we can use a direct jump */
         tcg_gen_goto_tb(tb_num);
-        gen_jmp_im(pc);
-        gen_movl_npc_im(npc);
+        tcg_gen_movi_tl(cpu_pc, pc);
+        tcg_gen_movi_tl(cpu_npc, npc);
         tcg_gen_exit_tb((long)tb + tb_num);
     } else {
         /* jump to another page: currently not optimized */
-        gen_jmp_im(pc);
-        gen_movl_npc_im(npc);
+        tcg_gen_movi_tl(cpu_pc, pc);
+        tcg_gen_movi_tl(cpu_npc, npc);
         tcg_gen_exit_tb(0);
     }
 }
@@ -387,19 +306,17 @@ static inline void gen_mov_reg_C(TCGv reg, TCGv src)
     tcg_gen_andi_tl(reg, reg, 0x1);
 }
 
-static inline void gen_op_exception(int exception)
+static inline void gen_cc_clear_icc(void)
 {
-    tcg_gen_movi_i32(cpu_tmp32, exception);
-    tcg_gen_helper_0_1(raise_exception, cpu_tmp32);
+    tcg_gen_movi_i32(cpu_psr, 0);
 }
 
-static inline void gen_cc_clear(void)
-{
-    tcg_gen_movi_i32(cpu_psr, 0);
 #ifdef TARGET_SPARC64
+static inline void gen_cc_clear_xcc(void)
+{
     tcg_gen_movi_i32(cpu_xcc, 0);
-#endif
 }
+#endif
 
 /* old op:
     if (!T0)
@@ -407,7 +324,7 @@ static inline void gen_cc_clear(void)
     if ((int32_t) T0 < 0)
         env->psr |= PSR_NEG;
 */
-static inline void gen_cc_NZ(TCGv dst)
+static inline void gen_cc_NZ_icc(TCGv dst)
 {
     TCGv r_temp;
     int l1, l2;
@@ -419,31 +336,33 @@ static inline void gen_cc_NZ(TCGv dst)
     tcg_gen_brcond_tl(TCG_COND_NE, r_temp, tcg_const_tl(0), l1);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_ZERO);
     gen_set_label(l1);
-    tcg_gen_andi_tl(r_temp, dst, 0xffffffffULL);
+    tcg_gen_ext_i32_tl(r_temp, dst);
     tcg_gen_brcond_tl(TCG_COND_GE, r_temp, tcg_const_tl(0), l2);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_NEG);
     gen_set_label(l2);
+}
+
 #ifdef TARGET_SPARC64
-    {
-        int l3, l4;
-
-        l3 = gen_new_label();
-        l4 = gen_new_label();
-        tcg_gen_brcond_tl(TCG_COND_NE, dst, tcg_const_tl(0), l3);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_ZERO);
-        gen_set_label(l3);
-        tcg_gen_brcond_tl(TCG_COND_GE, dst, tcg_const_tl(0), l4);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_NEG);
-        gen_set_label(l4);
-    }
-#endif
+static inline void gen_cc_NZ_xcc(TCGv dst)
+{
+    int l1, l2;
+
+    l1 = gen_new_label();
+    l2 = gen_new_label();
+    tcg_gen_brcond_tl(TCG_COND_NE, dst, tcg_const_tl(0), l1);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_ZERO);
+    gen_set_label(l1);
+    tcg_gen_brcond_tl(TCG_COND_GE, dst, tcg_const_tl(0), l2);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_NEG);
+    gen_set_label(l2);
 }
+#endif
 
 /* old op:
     if (T0 < src1)
         env->psr |= PSR_CARRY;
 */
-static inline void gen_cc_C_add(TCGv dst, TCGv src1)
+static inline void gen_cc_C_add_icc(TCGv dst, TCGv src1)
 {
     TCGv r_temp;
     int l1;
@@ -454,23 +373,25 @@ static inline void gen_cc_C_add(TCGv dst, TCGv src1)
     tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l1);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY);
     gen_set_label(l1);
+}
+
 #ifdef TARGET_SPARC64
-    {
-        int l2;
+static inline void gen_cc_C_add_xcc(TCGv dst, TCGv src1)
+{
+    int l1;
 
-        l2 = gen_new_label();
-        tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l2);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
-        gen_set_label(l2);
-    }
-#endif
+    l1 = gen_new_label();
+    tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l1);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
+    gen_set_label(l1);
 }
+#endif
 
 /* old op:
     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
         env->psr |= PSR_OVF;
 */
-static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2)
+static inline void gen_cc_V_add_icc(TCGv dst, TCGv src1, TCGv src2)
 {
     TCGv r_temp;
     int l1;
@@ -486,23 +407,27 @@ static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2)
     tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
     gen_set_label(l1);
+}
+
 #ifdef TARGET_SPARC64
-    {
-        int l2;
-
-        l2 = gen_new_label();
-        tcg_gen_xor_tl(r_temp, src1, src2);
-        tcg_gen_xori_tl(r_temp, r_temp, -1);
-        tcg_gen_xor_tl(cpu_tmp0, src1, dst);
-        tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
-        tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
-        tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
-        gen_set_label(l2);
-    }
-#endif
-    tcg_gen_discard_tl(r_temp);
+static inline void gen_cc_V_add_xcc(TCGv dst, TCGv src1, TCGv src2)
+{
+    TCGv r_temp;
+    int l1;
+
+    l1 = gen_new_label();
+
+    r_temp = tcg_temp_new(TCG_TYPE_TL);
+    tcg_gen_xor_tl(r_temp, src1, src2);
+    tcg_gen_xori_tl(r_temp, r_temp, -1);
+    tcg_gen_xor_tl(cpu_tmp0, src1, dst);
+    tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
+    tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
+    tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
+    gen_set_label(l1);
 }
+#endif
 
 static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2)
 {
@@ -518,24 +443,8 @@ static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2)
     tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
     tcg_gen_andi_tl(r_temp, r_temp, (1 << 31));
     tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
-    gen_op_exception(TT_TOVF);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_TOVF));
     gen_set_label(l1);
-#ifdef TARGET_SPARC64
-    {
-        int l2;
-
-        l2 = gen_new_label();
-        tcg_gen_xor_tl(r_temp, src1, src2);
-        tcg_gen_xori_tl(r_temp, r_temp, -1);
-        tcg_gen_xor_tl(cpu_tmp0, src1, dst);
-        tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
-        tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
-        tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2);
-        gen_op_exception(TT_TOVF);
-        gen_set_label(l2);
-    }
-#endif
-    tcg_gen_discard_tl(r_temp);
 }
 
 static inline void gen_cc_V_tag(TCGv src1, TCGv src2)
@@ -558,7 +467,7 @@ static inline void gen_tag_tv(TCGv src1, TCGv src2)
     tcg_gen_or_tl(cpu_tmp0, src1, src2);
     tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3);
     tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1);
-    gen_op_exception(TT_TOVF);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_TOVF));
     gen_set_label(l1);
 }
 
@@ -566,10 +475,16 @@ static inline void gen_op_add_T1_T0_cc(void)
 {
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
-    gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_addx_T1_T0_cc(void)
@@ -577,23 +492,38 @@ static inline void gen_op_addx_T1_T0_cc(void)
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     gen_mov_reg_C(cpu_tmp0, cpu_psr);
     tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
-    gen_cc_clear();
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
+    gen_cc_clear_icc();
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
+#endif
     tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_tadd_T1_T0_cc(void)
 {
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
-    gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
     gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_tadd_T1_T0_ccTV(void)
@@ -602,16 +532,22 @@ static inline void gen_op_tadd_T1_T0_ccTV(void)
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
     gen_add_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_add_xcc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_add_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 /* old op:
     if (src1 < T1)
         env->psr |= PSR_CARRY;
 */
-static inline void gen_cc_C_sub(TCGv src1, TCGv src2)
+static inline void gen_cc_C_sub_icc(TCGv src1, TCGv src2)
 {
     TCGv r_temp1, r_temp2;
     int l1;
@@ -624,23 +560,25 @@ static inline void gen_cc_C_sub(TCGv src1, TCGv src2)
     tcg_gen_brcond_tl(TCG_COND_GEU, r_temp1, r_temp2, l1);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY);
     gen_set_label(l1);
+}
+
 #ifdef TARGET_SPARC64
-    {
-        int l2;
+static inline void gen_cc_C_sub_xcc(TCGv src1, TCGv src2)
+{
+    int l1;
 
-        l2 = gen_new_label();
-        tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l2);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
-        gen_set_label(l2);
-    }
-#endif
+    l1 = gen_new_label();
+    tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l1);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
+    gen_set_label(l1);
 }
+#endif
 
 /* old op:
     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
         env->psr |= PSR_OVF;
 */
-static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2)
+static inline void gen_cc_V_sub_icc(TCGv dst, TCGv src1, TCGv src2)
 {
     TCGv r_temp;
     int l1;
@@ -655,22 +593,26 @@ static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2)
     tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
     tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
     gen_set_label(l1);
+}
+
 #ifdef TARGET_SPARC64
-    {
-        int l2;
-
-        l2 = gen_new_label();
-        tcg_gen_xor_tl(r_temp, src1, src2);
-        tcg_gen_xor_tl(cpu_tmp0, src1, dst);
-        tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
-        tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
-        tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2);
-        tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
-        gen_set_label(l2);
-    }
-#endif
-    tcg_gen_discard_tl(r_temp);
+static inline void gen_cc_V_sub_xcc(TCGv dst, TCGv src1, TCGv src2)
+{
+    TCGv r_temp;
+    int l1;
+
+    l1 = gen_new_label();
+
+    r_temp = tcg_temp_new(TCG_TYPE_TL);
+    tcg_gen_xor_tl(r_temp, src1, src2);
+    tcg_gen_xor_tl(cpu_tmp0, src1, dst);
+    tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
+    tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
+    tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
+    tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
+    gen_set_label(l1);
 }
+#endif
 
 static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2)
 {
@@ -685,22 +627,8 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2)
     tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
     tcg_gen_andi_tl(r_temp, r_temp, (1 << 31));
     tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
-    gen_op_exception(TT_TOVF);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_TOVF));
     gen_set_label(l1);
-#ifdef TARGET_SPARC64
-    {
-        int l2;
-
-        l2 = gen_new_label();
-        tcg_gen_xor_tl(r_temp, src1, src2);
-        tcg_gen_xor_tl(cpu_tmp0, src1, dst);
-        tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
-        tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63));
-        tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l2);
-        gen_op_exception(TT_TOVF);
-        gen_set_label(l2);
-    }
-#endif
     tcg_gen_discard_tl(r_temp);
 }
 
@@ -708,10 +636,16 @@ static inline void gen_op_sub_T1_T0_cc(void)
 {
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
-    gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
+    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
+    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_subx_T1_T0_cc(void)
@@ -719,23 +653,38 @@ static inline void gen_op_subx_T1_T0_cc(void)
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     gen_mov_reg_C(cpu_tmp0, cpu_psr);
     tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
-    gen_cc_clear();
-    gen_cc_C_sub(cpu_T[0], cpu_cc_src);
+    gen_cc_clear_icc();
+    gen_cc_C_sub_icc(cpu_T[0], cpu_cc_src);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_C_sub_xcc(cpu_T[0], cpu_cc_src);
+#endif
     tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_C_sub(cpu_T[0], cpu_cc_src);
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_sub_icc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_sub_xcc(cpu_T[0], cpu_cc_src);
+    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_tsub_T1_T0_cc(void)
 {
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
-    gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
+    gen_cc_V_sub_icc(cpu_T[0], cpu_cc_src, cpu_T[1]);
     gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
+    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_tsub_T1_T0_ccTV(void)
@@ -744,28 +693,35 @@ static inline void gen_op_tsub_T1_T0_ccTV(void)
     tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
     tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
     gen_sub_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_C_sub_icc(cpu_cc_src, cpu_T[1]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+    gen_cc_C_sub_xcc(cpu_cc_src, cpu_T[1]);
+    gen_cc_V_sub_xcc(cpu_T[0], cpu_cc_src, cpu_T[1]);
+#endif
 }
 
 static inline void gen_op_mulscc_T1_T0(void)
 {
-    TCGv r_temp;
+    TCGv r_temp, r_temp2;
     int l1, l2;
 
     l1 = gen_new_label();
     l2 = gen_new_label();
     r_temp = tcg_temp_new(TCG_TYPE_TL);
+    r_temp2 = tcg_temp_new(TCG_TYPE_I32);
 
     /* old op:
     if (!(env->y & 1))
         T1 = 0;
     */
-    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y));
-    tcg_gen_extu_i32_tl(r_temp, cpu_tmp32);
-    tcg_gen_andi_tl(r_temp, r_temp, 0x1);
-    tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1);
+    tcg_gen_ld32u_tl(r_temp, cpu_env, offsetof(CPUSPARCState, y));
+    tcg_gen_trunc_tl_i32(r_temp2, r_temp);
+    tcg_gen_andi_i32(r_temp2, r_temp2, 0x1);
+    tcg_gen_brcond_i32(TCG_COND_EQ, r_temp2, tcg_const_i32(0), l1);
     tcg_gen_mov_tl(cpu_cc_src2, cpu_T[1]);
     tcg_gen_br(l2);
     gen_set_label(l1);
@@ -774,10 +730,12 @@ static inline void gen_op_mulscc_T1_T0(void)
 
     // b2 = T0 & 1;
     // env->y = (b2 << 31) | (env->y >> 1);
-    tcg_gen_shli_tl(r_temp, cpu_T[0], 31);
+    tcg_gen_trunc_tl_i32(r_temp2, cpu_T[0]);
+    tcg_gen_andi_i32(r_temp2, r_temp2, 0x1);
+    tcg_gen_shli_i32(r_temp2, r_temp2, 31);
     tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y));
     tcg_gen_shri_i32(cpu_tmp32, cpu_tmp32, 1);
-    tcg_gen_or_i32(cpu_tmp32, cpu_tmp32, r_temp);
+    tcg_gen_or_i32(cpu_tmp32, cpu_tmp32, r_temp2);
     tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y));
 
     // b1 = N ^ V;
@@ -795,10 +753,10 @@ static inline void gen_op_mulscc_T1_T0(void)
     tcg_gen_add_tl(cpu_T[0], cpu_cc_src, cpu_cc_src2);
     tcg_gen_discard_tl(r_temp);
 
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
-    gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_cc_src2);
-    gen_cc_C_add(cpu_T[0], cpu_cc_src);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+    gen_cc_V_add_icc(cpu_T[0], cpu_cc_src, cpu_cc_src2);
+    gen_cc_C_add_icc(cpu_T[0], cpu_cc_src);
 }
 
 static inline void gen_op_umul_T1_T0(void)
@@ -849,16 +807,6 @@ static inline void gen_op_smul_T1_T0(void)
     tcg_gen_discard_i64(r_temp2);
 }
 
-static inline void gen_op_udiv_T1_T0(void)
-{
-    tcg_gen_helper_1_2(helper_udiv, cpu_T[0], cpu_T[0], cpu_T[1]);
-}
-
-static inline void gen_op_sdiv_T1_T0(void)
-{
-    tcg_gen_helper_1_2(helper_sdiv, cpu_T[0], cpu_T[0], cpu_T[1]);
-}
-
 #ifdef TARGET_SPARC64
 static inline void gen_trap_ifdivzero_tl(TCGv divisor)
 {
@@ -866,7 +814,7 @@ static inline void gen_trap_ifdivzero_tl(TCGv divisor)
 
     l1 = gen_new_label();
     tcg_gen_brcond_tl(TCG_COND_NE, divisor, tcg_const_tl(0), l1);
-    gen_op_exception(TT_DIV_ZERO);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_DIV_ZERO));
     gen_set_label(l1);
 }
 
@@ -891,8 +839,8 @@ static inline void gen_op_div_cc(void)
 {
     int l1;
 
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
     l1 = gen_new_label();
     tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, cc_src2));
     tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1);
@@ -902,8 +850,12 @@ static inline void gen_op_div_cc(void)
 
 static inline void gen_op_logic_T0_cc(void)
 {
-    gen_cc_clear();
-    gen_cc_NZ(cpu_T[0]);
+    gen_cc_clear_icc();
+    gen_cc_NZ_icc(cpu_T[0]);
+#ifdef TARGET_SPARC64
+    gen_cc_clear_xcc();
+    gen_cc_NZ_xcc(cpu_T[0]);
+#endif
 }
 
 // 1
@@ -1207,12 +1159,6 @@ static inline void gen_branch_a(DisasContext *dc, target_ulong pc1,
     gen_goto_tb(dc, 1, pc2 + 4, pc2 + 8);
 }
 
-static inline void gen_branch(DisasContext *dc, target_ulong pc,
-                              target_ulong npc)
-{
-    gen_goto_tb(dc, 0, pc, npc);
-}
-
 static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2,
                                       TCGv r_cond)
 {
@@ -1223,11 +1169,11 @@ static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2,
 
     tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1);
 
-    gen_movl_npc_im(npc1);
+    tcg_gen_movi_tl(cpu_npc, npc1);
     tcg_gen_br(l2);
 
     gen_set_label(l1);
-    gen_movl_npc_im(npc2);
+    tcg_gen_movi_tl(cpu_npc, npc2);
     gen_set_label(l2);
 }
 
@@ -1246,13 +1192,13 @@ static inline void save_npc(DisasContext * dc)
         gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cpu_T[2]);
         dc->npc = DYNAMIC_PC;
     } else if (dc->npc != DYNAMIC_PC) {
-        gen_movl_npc_im(dc->npc);
+        tcg_gen_movi_tl(cpu_npc, dc->npc);
     }
 }
 
 static inline void save_state(DisasContext * dc)
 {
-    gen_jmp_im(dc->pc);
+    tcg_gen_movi_tl(cpu_pc, dc->pc);
     save_npc(dc);
 }
 
@@ -1657,7 +1603,7 @@ static inline void gen_op_fpexception_im(int fsr_flags)
 {
     tcg_gen_andi_tl(cpu_fsr, cpu_fsr, ~FSR_FTT_MASK);
     tcg_gen_ori_tl(cpu_fsr, cpu_fsr, fsr_flags);
-    gen_op_exception(TT_FP_EXCP);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_FP_EXCP));
 }
 
 static int gen_trap_ifnofpu(DisasContext * dc)
@@ -1665,7 +1611,7 @@ static int gen_trap_ifnofpu(DisasContext * dc)
 #if !defined(CONFIG_USER_ONLY)
     if (!dc->fpu_enabled) {
         save_state(dc);
-        gen_op_exception(TT_NFPU_INSN);
+        tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_NFPU_INSN));
         dc->is_br = 1;
         return 1;
     }
@@ -1944,7 +1890,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     target = sign_extend(target, 16);
                     target <<= 2;
                     rs1 = GET_FIELD(insn, 13, 17);
-                    gen_movl_reg_T0(rs1);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
                     do_branch_reg(dc, target, insn);
                     goto jmp_insn;
                 }
@@ -1990,7 +1936,7 @@ static void disas_sparc_insn(DisasContext * dc)
 #endif
                     uint32_t value = GET_FIELD(insn, 10, 31);
                     tcg_gen_movi_tl(cpu_T[0], value << 10);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
 #if defined(OPTIM)
                 }
 #endif
@@ -2019,7 +1965,7 @@ static void disas_sparc_insn(DisasContext * dc)
                 int cond;
 
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {
                     rs2 = GET_FIELD(insn, 25, 31);
                     tcg_gen_addi_tl(cpu_T[0], cpu_T[0], rs2);
@@ -2028,8 +1974,8 @@ static void disas_sparc_insn(DisasContext * dc)
 #if defined(OPTIM)
                     if (rs2 != 0) {
 #endif
-                        gen_movl_reg_T1(rs2);
-                        gen_op_add_T1_T0();
+                        gen_movl_reg_TN(rs2, cpu_T[1]);
+                        tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
 #if defined(OPTIM)
                     }
 #endif
@@ -2076,17 +2022,18 @@ static void disas_sparc_insn(DisasContext * dc)
                                        SPARCv8 manual, rdy on the
                                        microSPARC II */
 #endif
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, y));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, y));
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
 #ifdef TARGET_SPARC64
                 case 0x2: /* V9 rdccr */
                     tcg_gen_helper_1_0(helper_rdccr, cpu_T[0]);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x3: /* V9 rdasi */
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, asi));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, asi));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x4: /* V9 rdtick */
                     {
@@ -2097,29 +2044,30 @@ static void disas_sparc_insn(DisasContext * dc)
                                        offsetof(CPUState, tick));
                         tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
                                            r_tickptr);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         tcg_gen_discard_ptr(r_tickptr);
                     }
                     break;
                 case 0x5: /* V9 rdpc */
                     tcg_gen_movi_tl(cpu_T[0], dc->pc);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x6: /* V9 rdfprs */
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, fprs));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fprs));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0xf: /* V9 membar */
                     break; /* no effect */
                 case 0x13: /* Graphics Status */
                     if (gen_trap_ifnofpu(dc))
                         goto jmp_insn;
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, gsr));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, gsr));
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x17: /* Tick compare */
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, tick_cmpr));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tick_cmpr));
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x18: /* System tick */
                     {
@@ -2130,13 +2078,13 @@ static void disas_sparc_insn(DisasContext * dc)
                                        offsetof(CPUState, stick));
                         tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
                                            r_tickptr);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         tcg_gen_discard_ptr(r_tickptr);
                     }
                     break;
                 case 0x19: /* System tick compare */
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, stick_cmpr));
-                    gen_movl_T0_reg(rd);
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, stick_cmpr));
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x10: /* Performance Control */
                 case 0x11: /* Performance Instrumentation Counter */
@@ -2166,22 +2114,26 @@ static void disas_sparc_insn(DisasContext * dc)
                     // gen_op_rdhtstate();
                     break;
                 case 3: // hintp
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, hintp));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, hintp));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 5: // htba
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, htba));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, htba));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 6: // hver
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, hver));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, hver));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 31: // hstick_cmpr
-                    gen_op_movl_env_T0(offsetof(CPUSPARCState, hstick_cmpr));
+                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                    tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, hstick_cmpr));
                     break;
                 default:
                     goto illegal_insn;
                 }
 #endif
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
                 break;
             } else if (xop == 0x2a) { /* rdwim / V9 rdpr */
                 if (!supervisor(dc))
@@ -2246,59 +2198,70 @@ static void disas_sparc_insn(DisasContext * dc)
                                        offsetof(CPUState, tick));
                         tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
                                            r_tickptr);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         tcg_gen_discard_ptr(r_tickptr);
                     }
                     break;
                 case 5: // tba
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, tbr));
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tbr));
                     break;
                 case 6: // pstate
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, pstate));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, pstate));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 7: // tl
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, tl));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, tl));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 8: // pil
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, psrpil));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, psrpil));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 9: // cwp
                     tcg_gen_helper_1_0(helper_rdcwp, cpu_T[0]);
                     break;
                 case 10: // cansave
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, cansave));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, cansave));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 11: // canrestore
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, canrestore));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, canrestore));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 12: // cleanwin
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, cleanwin));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, cleanwin));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 13: // otherwin
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, otherwin));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, otherwin));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 14: // wstate
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, wstate));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, wstate));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 16: // UA2005 gl
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, gl));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, gl));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 26: // UA2005 strand status
                     if (!hypervisor(dc))
                         goto priv_insn;
-                    gen_op_movl_T0_env(offsetof(CPUSPARCState, ssr));
+                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ssr));
+                    tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
                     break;
                 case 31: // ver
-                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, version));
+                    tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, version));
                     break;
                 case 15: // fq
                 default:
                     goto illegal_insn;
                 }
 #else
-                gen_op_movl_T0_env(offsetof(CPUSPARCState, wim));
+                tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, wim));
+                tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32);
 #endif
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
                 break;
             } else if (xop == 0x2b) { /* rdtbr / V9 flushw */
 #ifdef TARGET_SPARC64
@@ -2306,8 +2269,8 @@ static void disas_sparc_insn(DisasContext * dc)
 #else
                 if (!supervisor(dc))
                     goto priv_insn;
-                gen_op_movtl_T0_env(offsetof(CPUSPARCState, tbr));
-                gen_movl_T0_reg(rd);
+                tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tbr));
+                gen_movl_TN_reg(rd, cpu_T[0]);
 #endif
                 break;
 #endif
@@ -2700,7 +2663,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     l1 = gen_new_label();
                     cond = GET_FIELD_SP(insn, 14, 17);
                     rs1 = GET_FIELD(insn, 13, 17);
-                    gen_movl_reg_T0(rs1);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
                     tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0],
                                       tcg_const_tl(0), l1);
                     gen_op_load_fpr_FT0(rs2);
@@ -2713,7 +2676,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     l1 = gen_new_label();
                     cond = GET_FIELD_SP(insn, 14, 17);
                     rs1 = GET_FIELD(insn, 13, 17);
-                    gen_movl_reg_T0(rs1);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
                     tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0],
                                       tcg_const_tl(0), l1);
                     gen_op_load_fpr_DT0(DFPREG(rs2));
@@ -2727,7 +2690,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     l1 = gen_new_label();
                     cond = GET_FIELD_SP(insn, 14, 17);
                     rs1 = GET_FIELD(insn, 13, 17);
-                    gen_movl_reg_T0(rs1);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
                     tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0],
                                       tcg_const_tl(0), l1);
                     gen_op_load_fpr_QT0(QFPREG(rs2));
@@ -2907,10 +2870,10 @@ static void disas_sparc_insn(DisasContext * dc)
                         tcg_gen_movi_tl(cpu_T[0], (int)rs2);
                     } else {            /* register */
                         rs2 = GET_FIELD(insn, 27, 31);
-                        gen_movl_reg_T0(rs2);
+                        gen_movl_reg_TN(rs2, cpu_T[0]);
                     }
                 } else {
-                    gen_movl_reg_T0(rs1);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
                     if (IS_IMM) {       /* immediate */
                         rs2 = GET_FIELDs(insn, 19, 31);
                         tcg_gen_ori_tl(cpu_T[0], cpu_T[0], (int)rs2);
@@ -2918,17 +2881,17 @@ static void disas_sparc_insn(DisasContext * dc)
                         // or x, %g0, y -> mov T1, x; mov y, T1
                         rs2 = GET_FIELD(insn, 27, 31);
                         if (rs2 != 0) {
-                            gen_movl_reg_T1(rs2);
-                            gen_op_or_T1_T0();
+                            gen_movl_reg_TN(rs2, cpu_T[1]);
+                            tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
                         }
                     }
                 }
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
 #endif
 #ifdef TARGET_SPARC64
             } else if (xop == 0x25) { /* sll, V9 sllx */
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 20, 31);
                     if (insn & (1 << 12)) {
@@ -2939,7 +2902,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     }
                 } else {                /* register */
                     rs2 = GET_FIELD(insn, 27, 31);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     if (insn & (1 << 12)) {
                         tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f);
                         tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
@@ -2949,10 +2912,10 @@ static void disas_sparc_insn(DisasContext * dc)
                         tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
                     }
                 }
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
             } else if (xop == 0x26) { /* srl, V9 srlx */
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 20, 31);
                     if (insn & (1 << 12)) {
@@ -2963,7 +2926,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     }
                 } else {                /* register */
                     rs2 = GET_FIELD(insn, 27, 31);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     if (insn & (1 << 12)) {
                         tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f);
                         tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
@@ -2973,10 +2936,10 @@ static void disas_sparc_insn(DisasContext * dc)
                         tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
                     }
                 }
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
             } else if (xop == 0x27) { /* sra, V9 srax */
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 20, 31);
                     if (insn & (1 << 12)) {
@@ -2988,7 +2951,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     }
                 } else {                /* register */
                     rs2 = GET_FIELD(insn, 27, 31);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     if (insn & (1 << 12)) {
                         tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f);
                         tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
@@ -2998,17 +2961,17 @@ static void disas_sparc_insn(DisasContext * dc)
                         tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
                     }
                 }
-                gen_movl_T0_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[0]);
 #endif
             } else if (xop < 0x36) {
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 19, 31);
-                    gen_movl_simm_T1(rs2);
+                    tcg_gen_movi_tl(cpu_T[1], (int)rs2);
                 } else {                /* register */
                     rs2 = GET_FIELD(insn, 27, 31);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                 }
                 if (xop < 0x20) {
                     switch (xop & ~0x10) {
@@ -3016,7 +2979,7 @@ static void disas_sparc_insn(DisasContext * dc)
                         if (xop & 0x10)
                             gen_op_add_T1_T0_cc();
                         else
-                            gen_op_add_T1_T0();
+                            tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
                         break;
                     case 0x1:
                         tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
@@ -3097,66 +3060,66 @@ static void disas_sparc_insn(DisasContext * dc)
                         break;
 #endif
                     case 0xe:
-                        gen_op_udiv_T1_T0();
+                        tcg_gen_helper_1_2(helper_udiv, cpu_T[0], cpu_T[0], cpu_T[1]);
                         if (xop & 0x10)
                             gen_op_div_cc();
                         break;
                     case 0xf:
-                        gen_op_sdiv_T1_T0();
+                        tcg_gen_helper_1_2(helper_sdiv, cpu_T[0], cpu_T[0], cpu_T[1]);
                         if (xop & 0x10)
                             gen_op_div_cc();
                         break;
                     default:
                         goto illegal_insn;
                     }
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                 } else {
                     switch (xop) {
                     case 0x20: /* taddcc */
                         gen_op_tadd_T1_T0_cc();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x21: /* tsubcc */
                         gen_op_tsub_T1_T0_cc();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x22: /* taddcctv */
                         save_state(dc);
                         gen_op_tadd_T1_T0_ccTV();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x23: /* tsubcctv */
                         save_state(dc);
                         gen_op_tsub_T1_T0_ccTV();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x24: /* mulscc */
                         gen_op_mulscc_T1_T0();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
 #ifndef TARGET_SPARC64
                     case 0x25:  /* sll */
                         tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f);
                         tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x26:  /* srl */
                         tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f);
                         tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x27:  /* sra */
                         tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f);
                         tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
 #endif
                     case 0x30:
                         {
                             switch(rd) {
                             case 0: /* wry */
-                                gen_op_xor_T1_T0();
-                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, y));
+                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
+                                tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, y));
                                 break;
 #ifndef TARGET_SPARC64
                             case 0x01 ... 0x0f: /* undefined in the
@@ -3170,16 +3133,18 @@ static void disas_sparc_insn(DisasContext * dc)
                                 break;
 #else
                             case 0x2: /* V9 wrccr */
-                                gen_op_xor_T1_T0();
+                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
                                 tcg_gen_helper_0_1(helper_wrccr, cpu_T[0]);
                                 break;
                             case 0x3: /* V9 wrasi */
-                                gen_op_xor_T1_T0();
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, asi));
+                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, asi));
                                 break;
                             case 0x6: /* V9 wrfprs */
-                                gen_op_xor_T1_T0();
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, fprs));
+                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fprs));
                                 save_state(dc);
                                 gen_op_next_insn();
                                 tcg_gen_exit_tb(0);
@@ -3194,8 +3159,8 @@ static void disas_sparc_insn(DisasContext * dc)
                             case 0x13: /* Graphics Status */
                                 if (gen_trap_ifnofpu(dc))
                                     goto jmp_insn;
-                                gen_op_xor_T1_T0();
-                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, gsr));
+                                tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
+                                tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, gsr));
                                 break;
                             case 0x17: /* Tick compare */
 #if !defined(CONFIG_USER_ONLY)
@@ -3205,8 +3170,9 @@ static void disas_sparc_insn(DisasContext * dc)
                                 {
                                     TCGv r_tickptr;
 
-                                    gen_op_xor_T1_T0();
-                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
+                                    tcg_gen_xor_tl(cpu_T[0], cpu_T[0],
+                                                   cpu_T[1]);
+                                    tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState,
                                                                  tick_cmpr));
                                     r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
                                     tcg_gen_ld_ptr(r_tickptr, cpu_env,
@@ -3224,7 +3190,8 @@ static void disas_sparc_insn(DisasContext * dc)
                                 {
                                     TCGv r_tickptr;
 
-                                    gen_op_xor_T1_T0();
+                                    tcg_gen_xor_tl(cpu_T[0], cpu_T[0],
+                                                   cpu_T[1]);
                                     r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
                                     tcg_gen_ld_ptr(r_tickptr, cpu_env,
                                                    offsetof(CPUState, stick));
@@ -3241,8 +3208,9 @@ static void disas_sparc_insn(DisasContext * dc)
                                 {
                                     TCGv r_tickptr;
 
-                                    gen_op_xor_T1_T0();
-                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
+                                    tcg_gen_xor_tl(cpu_T[0], cpu_T[0],
+                                                   cpu_T[1]);
+                                    tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState,
                                                                  stick_cmpr));
                                     r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
                                     tcg_gen_ld_ptr(r_tickptr, cpu_env,
@@ -3287,7 +3255,7 @@ static void disas_sparc_insn(DisasContext * dc)
                                 goto illegal_insn;
                             }
 #else
-                            gen_op_xor_T1_T0();
+                            tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
                             tcg_gen_helper_0_1(helper_wrpsr, cpu_T[0]);
                             save_state(dc);
                             gen_op_next_insn();
@@ -3300,7 +3268,7 @@ static void disas_sparc_insn(DisasContext * dc)
                         {
                             if (!supervisor(dc))
                                 goto priv_insn;
-                            gen_op_xor_T1_T0();
+                            tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
 #ifdef TARGET_SPARC64
                             switch (rd) {
                             case 0: // tpc
@@ -3364,7 +3332,7 @@ static void disas_sparc_insn(DisasContext * dc)
                                 }
                                 break;
                             case 5: // tba
-                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr));
+                                tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tbr));
                                 break;
                             case 6: // pstate
                                 save_state(dc);
@@ -3374,43 +3342,53 @@ static void disas_sparc_insn(DisasContext * dc)
                                 dc->is_br = 1;
                                 break;
                             case 7: // tl
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, tl));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, tl));
                                 break;
                             case 8: // pil
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, psrpil));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, psrpil));
                                 break;
                             case 9: // cwp
                                 tcg_gen_helper_0_1(helper_wrcwp, cpu_T[0]);
                                 break;
                             case 10: // cansave
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, cansave));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, cansave));
                                 break;
                             case 11: // canrestore
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, canrestore));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, canrestore));
                                 break;
                             case 12: // cleanwin
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, cleanwin));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, cleanwin));
                                 break;
                             case 13: // otherwin
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, otherwin));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, otherwin));
                                 break;
                             case 14: // wstate
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, wstate));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, wstate));
                                 break;
                             case 16: // UA2005 gl
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, gl));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, gl));
                                 break;
                             case 26: // UA2005 strand status
                                 if (!hypervisor(dc))
                                     goto priv_insn;
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, ssr));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ssr));
                                 break;
                             default:
                                 goto illegal_insn;
                             }
 #else
                             tcg_gen_andi_tl(cpu_T[0], cpu_T[0], ((1 << NWINDOWS) - 1));
-                            gen_op_movl_env_T0(offsetof(CPUSPARCState, wim));
+                            tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                            tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, wim));
 #endif
                         }
                         break;
@@ -3419,12 +3397,12 @@ static void disas_sparc_insn(DisasContext * dc)
 #ifndef TARGET_SPARC64
                             if (!supervisor(dc))
                                 goto priv_insn;
-                            gen_op_xor_T1_T0();
-                            gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr));
+                            tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
+                            tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState, tbr));
 #else
                             if (!hypervisor(dc))
                                 goto priv_insn;
-                            gen_op_xor_T1_T0();
+                            tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
                             switch (rd) {
                             case 0: // hpstate
                                 // XXX gen_op_wrhpstate();
@@ -3437,16 +3415,18 @@ static void disas_sparc_insn(DisasContext * dc)
                                 // XXX gen_op_wrhtstate();
                                 break;
                             case 3: // hintp
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, hintp));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, hintp));
                                 break;
                             case 5: // htba
-                                gen_op_movl_env_T0(offsetof(CPUSPARCState, htba));
+                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]);
+                                tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, htba));
                                 break;
                             case 31: // hstick_cmpr
                                 {
                                     TCGv r_tickptr;
 
-                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
+                                    tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUSPARCState,
                                                                  hstick_cmpr));
                                     r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
                                     tcg_gen_ld_ptr(r_tickptr, cpu_env,
@@ -3490,34 +3470,34 @@ static void disas_sparc_insn(DisasContext * dc)
                                               tcg_const_tl(0), l1);
                             if (IS_IMM) {       /* immediate */
                                 rs2 = GET_FIELD_SPs(insn, 0, 10);
-                                gen_movl_simm_T1(rs2);
+                                tcg_gen_movi_tl(cpu_T[1], (int)rs2);
                             } else {
                                 rs2 = GET_FIELD_SP(insn, 0, 4);
-                                gen_movl_reg_T1(rs2);
+                                gen_movl_reg_TN(rs2, cpu_T[1]);
                             }
-                            gen_movl_T1_reg(rd);
+                            gen_movl_TN_reg(rd, cpu_T[1]);
                             gen_set_label(l1);
                             tcg_gen_discard_tl(r_cond);
                             break;
                         }
                     case 0x2d: /* V9 sdivx */
                         gen_op_sdivx_T1_T0();
-                        gen_movl_T0_reg(rd);
+                        gen_movl_TN_reg(rd, cpu_T[0]);
                         break;
                     case 0x2e: /* V9 popc */
                         {
                             if (IS_IMM) {       /* immediate */
                                 rs2 = GET_FIELD_SPs(insn, 0, 12);
-                                gen_movl_simm_T1(rs2);
+                                tcg_gen_movi_tl(cpu_T[1], (int)rs2);
                                 // XXX optimize: popc(constant)
                             }
                             else {
                                 rs2 = GET_FIELD_SP(insn, 0, 4);
-                                gen_movl_reg_T1(rs2);
+                                gen_movl_reg_TN(rs2, cpu_T[1]);
                             }
                             tcg_gen_helper_1_1(helper_popc, cpu_T[0],
                                                cpu_T[1]);
-                            gen_movl_T0_reg(rd);
+                            gen_movl_TN_reg(rd, cpu_T[0]);
                         }
                     case 0x2f: /* V9 movr */
                         {
@@ -3525,7 +3505,7 @@ static void disas_sparc_insn(DisasContext * dc)
                             int l1;
 
                             rs1 = GET_FIELD(insn, 13, 17);
-                            gen_movl_reg_T0(rs1);
+                            gen_movl_reg_TN(rs1, cpu_T[0]);
 
                             l1 = gen_new_label();
 
@@ -3533,12 +3513,12 @@ static void disas_sparc_insn(DisasContext * dc)
                                               tcg_const_tl(0), l1);
                             if (IS_IMM) {       /* immediate */
                                 rs2 = GET_FIELD_SPs(insn, 0, 9);
-                                gen_movl_simm_T1(rs2);
+                                tcg_gen_movi_tl(cpu_T[1], (int)rs2);
                             } else {
                                 rs2 = GET_FIELD_SP(insn, 0, 4);
-                                gen_movl_reg_T1(rs2);
+                                gen_movl_reg_TN(rs2, cpu_T[1]);
                             }
-                            gen_movl_T1_reg(rd);
+                            gen_movl_TN_reg(rd, cpu_T[1]);
                             gen_set_label(l1);
                             break;
                         }
@@ -3571,34 +3551,34 @@ static void disas_sparc_insn(DisasContext * dc)
                     // XXX
                     goto illegal_insn;
                 case 0x010: /* VIS I array8 */
-                    gen_movl_reg_T0(rs1);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0],
                                        cpu_T[1]);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x012: /* VIS I array16 */
-                    gen_movl_reg_T0(rs1);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0],
                                        cpu_T[1]);
                     tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 1);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x014: /* VIS I array32 */
-                    gen_movl_reg_T0(rs1);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     tcg_gen_helper_1_2(helper_array8, cpu_T[0], cpu_T[0],
                                        cpu_T[1]);
                     tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x018: /* VIS I alignaddr */
-                    gen_movl_reg_T0(rs1);
-                    gen_movl_reg_T1(rs2);
+                    gen_movl_reg_TN(rs1, cpu_T[0]);
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
                     tcg_gen_helper_1_2(helper_alignaddr, cpu_T[0], cpu_T[0],
                                        cpu_T[1]);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x019: /* VIS II bmask */
                 case 0x01a: /* VIS I alignaddrl */
@@ -3961,7 +3941,7 @@ static void disas_sparc_insn(DisasContext * dc)
             } else if (xop == 0x39) { /* V9 return */
                 rs1 = GET_FIELD(insn, 13, 17);
                 save_state(dc);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 19, 31);
                     tcg_gen_addi_tl(cpu_T[0], cpu_T[0], (int)rs2);
@@ -3970,8 +3950,8 @@ static void disas_sparc_insn(DisasContext * dc)
 #if defined(OPTIM)
                     if (rs2) {
 #endif
-                        gen_movl_reg_T1(rs2);
-                        gen_op_add_T1_T0();
+                        gen_movl_reg_TN(rs2, cpu_T[1]);
+                        tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
 #if defined(OPTIM)
                     }
 #endif
@@ -3985,7 +3965,7 @@ static void disas_sparc_insn(DisasContext * dc)
 #endif
             } else {
                 rs1 = GET_FIELD(insn, 13, 17);
-                gen_movl_reg_T0(rs1);
+                gen_movl_reg_TN(rs1, cpu_T[0]);
                 if (IS_IMM) {   /* immediate */
                     rs2 = GET_FIELDs(insn, 19, 31);
                     tcg_gen_addi_tl(cpu_T[0], cpu_T[0], (int)rs2);
@@ -3994,8 +3974,8 @@ static void disas_sparc_insn(DisasContext * dc)
 #if defined(OPTIM)
                     if (rs2) {
 #endif
-                        gen_movl_reg_T1(rs2);
-                        gen_op_add_T1_T0();
+                        gen_movl_reg_TN(rs2, cpu_T[1]);
+                        tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
 #if defined(OPTIM)
                     }
 #endif
@@ -4005,7 +3985,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     {
                         if (rd != 0) {
                             tcg_gen_movi_tl(cpu_T[1], dc->pc);
-                            gen_movl_T1_reg(rd);
+                            gen_movl_TN_reg(rd, cpu_T[1]);
                         }
                         gen_mov_pc_npc(dc);
                         gen_op_check_align_T0_3();
@@ -4032,12 +4012,12 @@ static void disas_sparc_insn(DisasContext * dc)
                 case 0x3c:      /* save */
                     save_state(dc);
                     tcg_gen_helper_0_0(helper_save);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
                 case 0x3d:      /* restore */
                     save_state(dc);
                     tcg_gen_helper_0_0(helper_restore);
-                    gen_movl_T0_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[0]);
                     break;
 #if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
                 case 0x3e:      /* V9 done/retry */
@@ -4075,11 +4055,11 @@ static void disas_sparc_insn(DisasContext * dc)
             unsigned int xop = GET_FIELD(insn, 7, 12);
             rs1 = GET_FIELD(insn, 13, 17);
             save_state(dc);
-            gen_movl_reg_T0(rs1);
+            gen_movl_reg_TN(rs1, cpu_T[0]);
             if (xop == 0x3c || xop == 0x3e)
             {
                 rs2 = GET_FIELD(insn, 27, 31);
-                gen_movl_reg_T1(rs2);
+                gen_movl_reg_TN(rs2, cpu_T[1]);
             }
             else if (IS_IMM) {       /* immediate */
                 rs2 = GET_FIELDs(insn, 19, 31);
@@ -4089,8 +4069,8 @@ static void disas_sparc_insn(DisasContext * dc)
 #if defined(OPTIM)
                 if (rs2 != 0) {
 #endif
-                    gen_movl_reg_T1(rs2);
-                    gen_op_add_T1_T0();
+                    gen_movl_reg_TN(rs2, cpu_T[1]);
+                    tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
 #if defined(OPTIM)
                 }
 #endif
@@ -4122,7 +4102,7 @@ static void disas_sparc_insn(DisasContext * dc)
                         tcg_gen_qemu_ld64(cpu_tmp64, cpu_T[0], dc->mem_idx);
                         tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64);
                         tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffffffffULL);
-                        gen_movl_T0_reg(rd + 1);
+                        gen_movl_TN_reg(rd + 1, cpu_T[0]);
                         tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
                         tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64);
                         tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0xffffffffULL);
@@ -4144,7 +4124,7 @@ static void disas_sparc_insn(DisasContext * dc)
                     break;
                 case 0x0f:      /* swap register with memory. Also atomically */
                     gen_op_check_align_T0_3();
-                    gen_movl_reg_T1(rd);
+                    gen_movl_reg_TN(rd, cpu_T[1]);
                     ABI32_MASK(cpu_T[0]);
                     tcg_gen_qemu_ld32u(cpu_tmp32, cpu_T[0], dc->mem_idx);
                     tcg_gen_qemu_st32(cpu_T[1], cpu_T[0], dc->mem_idx);
@@ -4191,7 +4171,7 @@ static void disas_sparc_insn(DisasContext * dc)
                         goto illegal_insn;
                     gen_op_check_align_T0_7();
                     gen_ldda_asi(insn);
-                    gen_movl_T0_reg(rd + 1);
+                    gen_movl_TN_reg(rd + 1, cpu_T[0]);
                     break;
                 case 0x19:      /* load signed byte alternate */
 #ifndef TARGET_SPARC64
@@ -4229,7 +4209,7 @@ static void disas_sparc_insn(DisasContext * dc)
                         goto priv_insn;
 #endif
                     gen_op_check_align_T0_3();
-                    gen_movl_reg_T1(rd);
+                    gen_movl_reg_TN(rd, cpu_T[1]);
                     gen_swap_asi(insn);
                     break;
 
@@ -4283,7 +4263,7 @@ static void disas_sparc_insn(DisasContext * dc)
                 default:
                     goto illegal_insn;
                 }
-                gen_movl_T1_reg(rd);
+                gen_movl_TN_reg(rd, cpu_T[1]);
 #ifdef TARGET_SPARC64
             skip_move: ;
 #endif
@@ -4323,7 +4303,7 @@ static void disas_sparc_insn(DisasContext * dc)
                 }
             } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) || \
                        xop == 0xe || xop == 0x1e) {
-                gen_movl_reg_T1(rd);
+                gen_movl_reg_TN(rd, cpu_T[1]);
                 switch (xop) {
                 case 0x4: /* store word */
                     gen_op_check_align_T0_3();
@@ -4356,7 +4336,7 @@ static void disas_sparc_insn(DisasContext * dc)
 #else /* __i386__ */
                     gen_op_check_align_T0_7();
                     flush_T2(dc);
-                    gen_movl_reg_T2(rd + 1);
+                    gen_movl_reg_TN(rd + 1, cpu_T[2]);
                     gen_op_ldst(std);
 #endif /* __i386__ */
                     break;
@@ -4494,12 +4474,12 @@ static void disas_sparc_insn(DisasContext * dc)
                 case 0x3c: /* V9 casa */
                     gen_op_check_align_T0_3();
                     gen_cas_asi(insn, rd);
-                    gen_movl_T1_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[1]);
                     break;
                 case 0x3e: /* V9 casxa */
                     gen_op_check_align_T0_7();
                     gen_casx_asi(insn, rd);
-                    gen_movl_T1_reg(rd);
+                    gen_movl_TN_reg(rd, cpu_T[1]);
                     break;
 #else
                 case 0x34: /* stc */
@@ -4533,13 +4513,13 @@ static void disas_sparc_insn(DisasContext * dc)
     return;
  illegal_insn:
     save_state(dc);
-    gen_op_exception(TT_ILL_INSN);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_ILL_INSN));
     dc->is_br = 1;
     return;
 #if !defined(CONFIG_USER_ONLY)
  priv_insn:
     save_state(dc);
-    gen_op_exception(TT_PRIV_INSN);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_PRIV_INSN));
     dc->is_br = 1;
     return;
  nfpu_insn:
@@ -4558,7 +4538,7 @@ static void disas_sparc_insn(DisasContext * dc)
 #ifndef TARGET_SPARC64
  ncp_insn:
     save_state(dc);
-    gen_op_exception(TT_NCP_INSN);
+    tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_NCP_INSN));
     dc->is_br = 1;
     return;
 #endif
@@ -4631,7 +4611,7 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb,
         /* if single step mode, we generate only one instruction and
            generate an exception */
         if (env->singlestep_enabled) {
-            gen_jmp_im(dc->pc);
+            tcg_gen_movi_tl(cpu_pc, dc->pc);
             tcg_gen_exit_tb(0);
             break;
         }
@@ -4643,10 +4623,10 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb,
         if (dc->pc != DYNAMIC_PC &&
             (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) {
             /* static PC and NPC: we can use direct chaining */
-            gen_branch(dc, dc->pc, dc->npc);
+            gen_goto_tb(dc, 0, dc->pc, dc->npc);
         } else {
             if (dc->pc != DYNAMIC_PC)
-                gen_jmp_im(dc->pc);
+                tcg_gen_movi_tl(cpu_pc, dc->pc);
             save_npc(dc);
             tcg_gen_exit_tb(0);
         }
This page took 0.090447 seconds and 4 git commands to generate.