qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [4323] Complete the TCG conversion


From: Blue Swirl
Subject: [Qemu-devel] [4323] Complete the TCG conversion
Date: Sun, 04 May 2008 11:58:46 +0000

Revision: 4323
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4323
Author:   blueswir1
Date:     2008-05-04 11:58:45 +0000 (Sun, 04 May 2008)

Log Message:
-----------
Complete the TCG conversion

Modified Paths:
--------------
    trunk/configure
    trunk/target-sparc/cpu.h
    trunk/target-sparc/exec.h
    trunk/target-sparc/helper.h
    trunk/target-sparc/op_helper.c
    trunk/target-sparc/translate.c

Modified: trunk/configure
===================================================================
--- trunk/configure     2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/configure     2008-05-04 11:58:45 UTC (rev 4323)
@@ -1291,24 +1291,30 @@
   ;;
   sparc)
     echo "TARGET_ARCH=sparc" >> $config_mak
+    echo "CONFIG_NO_DYNGEN_OP=yes" >> $config_mak
     echo "#define TARGET_ARCH \"sparc\"" >> $config_h
     echo "#define TARGET_SPARC 1" >> $config_h
+    echo "#define CONFIG_NO_DYNGEN_OP 1" >> $config_h
   ;;
   sparc64)
     echo "TARGET_ARCH=sparc64" >> $config_mak
+    echo "CONFIG_NO_DYNGEN_OP=yes" >> $config_mak
     echo "#define TARGET_ARCH \"sparc64\"" >> $config_h
     echo "#define TARGET_SPARC 1" >> $config_h
     echo "#define TARGET_SPARC64 1" >> $config_h
+    echo "#define CONFIG_NO_DYNGEN_OP 1" >> $config_h
     elfload32="yes"
   ;;
   sparc32plus)
     echo "TARGET_ARCH=sparc64" >> $config_mak
     echo "TARGET_ABI_DIR=sparc" >> $config_mak
     echo "TARGET_ARCH2=sparc32plus" >> $config_mak
+    echo "CONFIG_NO_DYNGEN_OP=yes" >> $config_mak
     echo "#define TARGET_ARCH \"sparc64\"" >> $config_h
     echo "#define TARGET_SPARC 1" >> $config_h
     echo "#define TARGET_SPARC64 1" >> $config_h
     echo "#define TARGET_ABI32 1" >> $config_h
+    echo "#define CONFIG_NO_DYNGEN_OP 1" >> $config_h
   ;;
   *)
     echo "Unsupported target CPU"

Modified: trunk/target-sparc/cpu.h
===================================================================
--- trunk/target-sparc/cpu.h    2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/target-sparc/cpu.h    2008-05-04 11:58:45 UTC (rev 4323)
@@ -250,7 +250,7 @@
     float_status fp_status;
 #if defined(TARGET_SPARC64)
 #define MAXTL 4
-    uint64_t t0, t1, t2;
+    uint64_t t0;
     trap_state *tsptr;
     trap_state ts[MAXTL];
     uint32_t xcc;               /* Extended integer condition codes */
@@ -271,9 +271,7 @@
     uint64_t hpstate, htstate[MAXTL], hintp, htba, hver, hstick_cmpr, ssr;
     void *hstick; // UA 2005
 #endif
-#if !defined(TARGET_SPARC64) && !defined(reg_T2)
-    target_ulong t2;
-#endif
+    target_ulong t1, t2;
 } CPUSPARCState;
 #if defined(TARGET_SPARC64)
 #define GET_FSR32(env) (env->fsr & 0xcfc1ffff)

Modified: trunk/target-sparc/exec.h
===================================================================
--- trunk/target-sparc/exec.h   2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/target-sparc/exec.h   2008-05-04 11:58:45 UTC (rev 4323)
@@ -7,12 +7,10 @@
 
 #ifdef TARGET_SPARC64
 #define T0 (env->t0)
-#define T1 (env->t1)
 #define T2 (env->t2)
 #define REGWPTR env->regwptr
 #else
 register uint32_t T0 asm(AREG1);
-register uint32_t T1 asm(AREG2);
 
 #undef REG_REGWPTR // Broken
 #ifdef REG_REGWPTR

Modified: trunk/target-sparc/helper.h
===================================================================
--- trunk/target-sparc/helper.h 2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/target-sparc/helper.h 2008-05-04 11:58:45 UTC (rev 4323)
@@ -45,6 +45,13 @@
 target_ulong TCG_HELPER_PROTO helper_udiv(target_ulong a, target_ulong b);
 target_ulong TCG_HELPER_PROTO helper_sdiv(target_ulong a, target_ulong b);
 uint64_t TCG_HELPER_PROTO helper_pack64(target_ulong high, target_ulong low);
+void TCG_HELPER_PROTO helper_std_i386(target_ulong addr, int mem_idx);
+void TCG_HELPER_PROTO helper_stdf(target_ulong addr, int mem_idx);
+void TCG_HELPER_PROTO helper_lddf(target_ulong addr, int mem_idx);
+#if defined(CONFIG_USER_ONLY)
+void TCG_HELPER_PROTO helper_ldqf(target_ulong addr);
+void TCG_HELPER_PROTO helper_stqf(target_ulong addr);
+#endif
 uint64_t TCG_HELPER_PROTO helper_ld_asi(target_ulong addr, int asi,
                                         int size, int sign);
 void TCG_HELPER_PROTO helper_st_asi(target_ulong addr, uint64_t val, int asi,

Modified: trunk/target-sparc/op_helper.c
===================================================================
--- trunk/target-sparc/op_helper.c      2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/target-sparc/op_helper.c      2008-05-04 11:58:45 UTC (rev 4323)
@@ -2217,6 +2217,109 @@
     return ((uint64_t)high << 32) | (uint64_t)(low & 0xffffffff);
 }
 
+#ifdef TARGET_ABI32
+#define ADDR(x) ((x) & 0xffffffff)
+#else
+#define ADDR(x) (x)
+#endif
+
+#ifdef __i386__
+void helper_std_i386(target_ulong addr, int mem_idx)
+{
+    uint64_t tmp = ((uint64_t)env->t1 << 32) | (uint64_t)(env->t2 & 
0xffffffff);
+
+#if !defined(CONFIG_USER_ONLY)
+    switch (mem_idx) {
+    case 0:
+        stq_user(ADDR(addr), tmp);
+        break;
+    case 1:
+        stq_kernel(ADDR(addr), tmp);
+        break;
+#ifdef TARGET_SPARC64
+    case 2:
+        stq_hypv(ADDR(addr), tmp);
+        break;
+#endif
+    default:
+        break;
+    }
+#else
+    stq_raw(ADDR(addr), tmp);
+#endif
+}
+#endif /* __i386__ */
+
+void helper_stdf(target_ulong addr, int mem_idx)
+{
+#if !defined(CONFIG_USER_ONLY)
+    switch (mem_idx) {
+    case 0:
+        stfq_user(ADDR(addr), DT0);
+        break;
+    case 1:
+        stfq_kernel(ADDR(addr), DT0);
+        break;
+#ifdef TARGET_SPARC64
+    case 2:
+        stfq_hypv(ADDR(addr), DT0);
+        break;
+#endif
+    default:
+        break;
+    }
+#else
+    stfq_raw(ADDR(addr), DT0);
+#endif
+}
+
+void helper_lddf(target_ulong addr, int mem_idx)
+{
+#if !defined(CONFIG_USER_ONLY)
+    switch (mem_idx) {
+    case 0:
+        DT0 = ldfq_user(ADDR(addr));
+        break;
+    case 1:
+        DT0 = ldfq_kernel(ADDR(addr));
+        break;
+#ifdef TARGET_SPARC64
+    case 2:
+        DT0 = ldfq_hypv(ADDR(addr));
+        break;
+#endif
+    default:
+        break;
+    }
+#else
+    DT0 = ldfq_raw(ADDR(addr));
+#endif
+}
+
+#if defined(CONFIG_USER_ONLY)
+void helper_ldqf(target_ulong addr)
+{
+    // XXX add 128 bit load
+    CPU_QuadU u;
+
+    u.ll.upper = ldq_raw(ADDR(addr));
+    u.ll.lower = ldq_raw(ADDR(addr + 8));
+    QT0 = u.q;
+}
+
+void helper_stqf(target_ulong addr)
+{
+    // XXX add 128 bit store
+    CPU_QuadU u;
+
+    u.q = QT0;
+    stq_raw(ADDR(addr), u.ll.upper);
+    stq_raw(ADDR(addr + 8), u.ll.lower);
+}
+#endif
+
+#undef ADDR
+
 void helper_ldfsr(void)
 {
     int rnd_mode;

Modified: trunk/target-sparc/translate.c
===================================================================
--- trunk/target-sparc/translate.c      2008-05-04 10:55:25 UTC (rev 4322)
+++ trunk/target-sparc/translate.c      2008-05-04 11:58:45 UTC (rev 4323)
@@ -184,35 +184,14 @@
 #ifdef TARGET_SPARC64
 #define hypervisor(dc) 0
 #endif
-#define gen_op_ldst(name)        gen_op_##name##_raw()
 #else
 #define supervisor(dc) (dc->mem_idx >= 1)
 #ifdef TARGET_SPARC64
 #define hypervisor(dc) (dc->mem_idx == 2)
-#define OP_LD_TABLE(width)                                              \
-    static GenOpFunc * const gen_op_##width[] = {                       \
-        &gen_op_##width##_user,                                         \
-        &gen_op_##width##_kernel,                                       \
-        &gen_op_##width##_hypv,                                         \
-    };
 #else
-#define OP_LD_TABLE(width)                                              \
-    static GenOpFunc * const gen_op_##width[] = {                       \
-        &gen_op_##width##_user,                                         \
-        &gen_op_##width##_kernel,                                       \
-    };
 #endif
-#define gen_op_ldst(name)        (*gen_op_##name[dc->mem_idx])()
 #endif
 
-#ifndef CONFIG_USER_ONLY
-#ifdef __i386__
-OP_LD_TABLE(std);
-#endif /* __i386__ */
-OP_LD_TABLE(stdf);
-OP_LD_TABLE(lddf);
-#endif
-
 #ifdef TARGET_ABI32
 #define ABI32_MASK(addr) tcg_gen_andi_tl(addr, addr, 0xffffffffULL);
 #else
@@ -4209,16 +4188,19 @@
                     break;
                 case 0x22:      /* load quad fpreg */
 #if defined(CONFIG_USER_ONLY)
-                    tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
-                    gen_op_ldst(ldqf);
+                    tcg_gen_helper_0_2(helper_check_align, cpu_addr,
+                                       tcg_const_i32(7));
+                    tcg_gen_helper_0_1(helper_ldqf, cpu_addr);
                     gen_op_store_QT0_fpr(QFPREG(rd));
                     break;
 #else
                     goto nfpu_insn;
 #endif
                 case 0x23:      /* load double fpreg */
-                    tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
-                    gen_op_ldst(lddf);
+                    tcg_gen_helper_0_2(helper_check_align, cpu_addr,
+                                       tcg_const_i32(7));
+                    tcg_gen_helper_0_2(helper_lddf, cpu_addr,
+                                       tcg_const_i32(dc->mem_idx));
                     gen_op_store_DT0_fpr(DFPREG(rd));
                     break;
                 default:
@@ -4245,23 +4227,23 @@
                 case 0x7: /* store double word */
                     if (rd & 1)
                         goto illegal_insn;
-#ifndef __i386__
                     else {
                         TCGv r_low;
 
                         tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
                         r_low = tcg_temp_new(TCG_TYPE_I32);
                         gen_movl_reg_TN(rd + 1, r_low);
+#ifndef __i386__
                         tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_val,
                                            r_low);
                         tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
-                    }
 #else /* __i386__ */
-                    tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
-                    flush_cond(dc, cpu_cond);
-                    gen_movl_reg_TN(rd + 1, cpu_cond);
-                    gen_op_ldst(std);
+                        tcg_gen_st_tl(cpu_val, cpu_env, offsetof(CPUState, 
t1));
+                        tcg_gen_st_tl(r_low, cpu_env, offsetof(CPUState, t2));
+                        tcg_gen_helper_0_2(helper_std_i386, cpu_addr,
+                                           tcg_const_i32(dc->mem_idx));
 #endif /* __i386__ */
+                    }
                     break;
 #if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
                 case 0x14: /* store word alternate */
@@ -4345,9 +4327,10 @@
 #ifdef TARGET_SPARC64
 #if defined(CONFIG_USER_ONLY)
                     /* V9 stqf, store quad fpreg */
-                    tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
+                    tcg_gen_helper_0_2(helper_check_align, cpu_addr,
+                                       tcg_const_i32(7));
                     gen_op_load_fpr_QT0(QFPREG(rd));
-                    gen_op_ldst(stqf);
+                    tcg_gen_helper_0_1(helper_stqf, cpu_addr);
                     break;
 #else
                     goto nfpu_insn;
@@ -4364,10 +4347,12 @@
                     goto nfq_insn;
 #endif
 #endif
-                case 0x27:
-                    tcg_gen_helper_0_2(helper_check_align, cpu_addr, 
tcg_const_i32(7));
+                case 0x27: /* store double fpreg */
+                    tcg_gen_helper_0_2(helper_check_align, cpu_addr,
+                                       tcg_const_i32(7));
                     gen_op_load_fpr_DT0(DFPREG(rd));
-                    gen_op_ldst(stdf);
+                    tcg_gen_helper_0_2(helper_stdf, cpu_addr,
+                                       tcg_const_i32(dc->mem_idx));
                     break;
                 default:
                     goto illegal_insn;






reply via email to

[Prev in Thread] Current Thread [Next in Thread]