PowerPC merge: real time TB and decrementer - faster and simpler exception handling...
[qemu] / target-arm / translate.c
index 44c6387..00bdbb9 100644 (file)
@@ -279,7 +279,8 @@ static inline void gen_add_data_offset(DisasContext *s, unsigned int insn)
         val = insn & 0xfff;
         if (!(insn & (1 << 23)))
             val = -val;
-        gen_op_addl_T1_im(val);
+        if (val != 0)
+            gen_op_addl_T1_im(val);
     } else {
         /* shift/register */
         rm = (insn) & 0xf;
@@ -304,7 +305,8 @@ static inline void gen_add_datah_offset(DisasContext *s, unsigned int insn)
         val = (insn & 0xf) | ((insn >> 4) & 0xf0);
         if (!(insn & (1 << 23)))
             val = -val;
-        gen_op_addl_T1_im(val);
+        if (val != 0)
+            gen_op_addl_T1_im(val);
     } else {
         /* register */
         rm = (insn) & 0xf;
@@ -541,7 +543,8 @@ static void disas_arm_insn(DisasContext *s)
                 rn = (insn >> 16) & 0xf;
                 rd = (insn >> 12) & 0xf;
                 gen_movl_T1_reg(s, rn);
-                gen_add_datah_offset(s, insn);
+                if (insn & (1 << 24))
+                    gen_add_datah_offset(s, insn);
                 if (insn & (1 << 20)) {
                     /* load */
                     switch(sh) {
@@ -708,66 +711,6 @@ static void disas_arm_insn(DisasContext *s)
             gen_op_swi();
             s->is_jmp = DISAS_JUMP;
             break;
-        case 0xc:
-        case 0xd:
-            rd = (insn >> 12) & 0x7;
-            rn = (insn >> 16) & 0xf;
-            gen_movl_T1_reg(s, rn);
-            val = (insn) & 0xff;
-            if (!(insn & (1 << 23)))
-                val = -val;
-            switch((insn >> 8) & 0xf) {
-            case 0x1:
-                /* load/store */
-                if ((insn & (1 << 24)))
-                    gen_op_addl_T1_im(val);
-                /* XXX: do it */
-                if (!(insn & (1 << 24)))
-                    gen_op_addl_T1_im(val);
-                if (insn & (1 << 21))
-                    gen_movl_reg_T1(s, rn);
-                break;
-            case 0x2:
-                {
-                    int n, i;
-                    /* load store multiple */
-                    if ((insn & (1 << 24)))
-                        gen_op_addl_T1_im(val);
-                    switch(insn & 0x00408000) {
-                    case 0x00008000: n = 1; break;
-                    case 0x00400000: n = 2; break;
-                    case 0x00408000: n = 3; break;
-                    default: n = 4; break;
-                    }
-                    for(i = 0;i < n; i++) {
-                        /* XXX: do it */
-                    }
-                    if (!(insn & (1 << 24)))
-                        gen_op_addl_T1_im(val);
-                    if (insn & (1 << 21))
-                        gen_movl_reg_T1(s, rn);
-                }
-                break;
-            default:
-                goto illegal_op;
-            }
-            break;
-        case 0x0e:
-            /* float ops */
-            /* XXX: do it */
-            switch((insn >> 20) & 0xf) {
-            case 0x2: /* wfs */
-                break;
-            case 0x3: /* rfs */
-                break;
-            case 0x4: /* wfc */
-                break;
-            case 0x5: /* rfc */
-                break;
-            default:
-                goto illegal_op;
-            }
-            break;
         default:
         illegal_op:
             gen_op_movl_T0_im((long)s->pc - 4);
@@ -835,15 +778,16 @@ static inline int gen_intermediate_code_internal(CPUState *env,
     *gen_opc_ptr = INDEX_op_end;
 
 #ifdef DEBUG_DISAS
-    if (loglevel) {
+    if (loglevel & CPU_LOG_TB_IN_ASM) {
         fprintf(logfile, "----------------\n");
         fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
-       disas(logfile, pc_start, dc->pc - pc_start, 0, 0);
-        fprintf(logfile, "\n");
-
-        fprintf(logfile, "OP:\n");
-        dump_ops(gen_opc_buf, gen_opparam_buf);
+        disas(logfile, pc_start, dc->pc - pc_start, 0, 0);
         fprintf(logfile, "\n");
+        if (loglevel & (CPU_LOG_TB_OP)) {
+            fprintf(logfile, "OP:\n");
+            dump_ops(gen_opc_buf, gen_opparam_buf);
+            fprintf(logfile, "\n");
+        }
     }
 #endif
     if (!search_pc)
@@ -897,3 +841,8 @@ void cpu_arm_dump_state(CPUARMState *env, FILE *f, int flags)
             env->cpsr & (1 << 29) ? 'C' : '-',
             env->cpsr & (1 << 28) ? 'V' : '-');
 }
+
+target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
+{
+    return addr;
+}