]> git.proxmox.com Git - qemu.git/commitdiff
converted LSL/LAR/VERW/VERR to TCG - force 16 bit memory access for LSL/LAR
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 21 May 2008 16:25:27 +0000 (16:25 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 21 May 2008 16:25:27 +0000 (16:25 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4513 c046a42c-6fe2-441c-8c8c-71466251a162

target-i386/helper.c
target-i386/helper.h
target-i386/op.c
target-i386/translate.c

index 0891ec9dc1bdccdc28728588755877ade76eb95c..731d7a328c7d893452fb7ae44aa6350305a30fcc 100644 (file)
@@ -3138,13 +3138,13 @@ void helper_rdmsr(void)
 }
 #endif
 
-uint32_t helper_lsl(uint32_t selector)
+target_ulong helper_lsl(target_ulong selector1)
 {
     unsigned int limit;
-    uint32_t e1, e2, eflags;
+    uint32_t e1, e2, eflags, selector;
     int rpl, dpl, cpl, type;
 
-    selector &= 0xffff;
+    selector = selector1 & 0xffff;
     eflags = cc_table[CC_OP].compute_all();
     if (load_segment(&e1, &e2, selector) != 0)
         goto fail;
@@ -3181,12 +3181,12 @@ uint32_t helper_lsl(uint32_t selector)
     return limit;
 }
 
-uint32_t helper_lar(uint32_t selector)
+target_ulong helper_lar(target_ulong selector1)
 {
-    uint32_t e1, e2, eflags;
+    uint32_t e1, e2, eflags, selector;
     int rpl, dpl, cpl, type;
 
-    selector &= 0xffff;
+    selector = selector1 & 0xffff;
     eflags = cc_table[CC_OP].compute_all();
     if ((selector & 0xfffc) == 0)
         goto fail;
@@ -3227,12 +3227,12 @@ uint32_t helper_lar(uint32_t selector)
     return e2 & 0x00f0ff00;
 }
 
-void helper_verr(uint32_t selector)
+void helper_verr(target_ulong selector1)
 {
-    uint32_t e1, e2, eflags;
+    uint32_t e1, e2, eflags, selector;
     int rpl, dpl, cpl;
 
-    selector &= 0xffff;
+    selector = selector1 & 0xffff;
     eflags = cc_table[CC_OP].compute_all();
     if ((selector & 0xfffc) == 0)
         goto fail;
@@ -3260,12 +3260,12 @@ void helper_verr(uint32_t selector)
     CC_SRC = eflags | CC_Z;
 }
 
-void helper_verw(uint32_t selector)
+void helper_verw(target_ulong selector1)
 {
-    uint32_t e1, e2, eflags;
+    uint32_t e1, e2, eflags, selector;
     int rpl, dpl, cpl;
 
-    selector &= 0xffff;
+    selector = selector1 & 0xffff;
     eflags = cc_table[CC_OP].compute_all();
     if ((selector & 0xfffc) == 0)
         goto fail;
index 76775e15a6e9c777c86f899cac641a4ff6ad9e20..e0ff417b230d697e75253afb13499cbd4e1bdfdb 100644 (file)
@@ -23,10 +23,10 @@ void helper_aas(void);
 void helper_daa(void);
 void helper_das(void);
 
-uint32_t helper_lsl(uint32_t selector);
-uint32_t helper_lar(uint32_t selector);
-void helper_verr(uint32_t selector);
-void helper_verw(uint32_t selector);
+target_ulong helper_lsl(target_ulong selector1);
+target_ulong helper_lar(target_ulong selector1);
+void helper_verr(target_ulong selector1);
+void helper_verw(target_ulong selector1);
 void helper_lldt(int selector);
 void helper_ltr(int selector);
 void helper_load_seg(int seg_reg, int selector);
index a4833010b45c1a19e38e02a2c6b22b919161df09..d637423c65d3eddf475d77205fb78d60688b0298 100644 (file)
@@ -167,34 +167,6 @@ void OPPROTO op_movl_T0_seg(void)
     T0 = env->segs[PARAM1].selector;
 }
 
-void OPPROTO op_lsl(void)
-{
-    uint32_t val;
-    val = helper_lsl(T0);
-    if (CC_SRC & CC_Z)
-        T1 = val;
-    FORCE_RET();
-}
-
-void OPPROTO op_lar(void)
-{
-    uint32_t val;
-    val = helper_lar(T0);
-    if (CC_SRC & CC_Z)
-        T1 = val;
-    FORCE_RET();
-}
-
-void OPPROTO op_verr(void)
-{
-    helper_verr(T0);
-}
-
-void OPPROTO op_verw(void)
-{
-    helper_verw(T0);
-}
-
 void OPPROTO op_arpl(void)
 {
     if ((T0 & 3) < (T1 & 3)) {
index 5efebb349d3108217442634a42c51e28c47135ba..b2cd4d5f2891687b1bf032e94983d06490e68946 100644 (file)
@@ -6333,9 +6333,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
             if (s->cc_op != CC_OP_DYNAMIC)
                 gen_op_set_cc_op(s->cc_op);
             if (op == 4)
-                gen_op_verr();
+                tcg_gen_helper_0_1(helper_verr, cpu_T[0]);
             else
-                gen_op_verw();
+                tcg_gen_helper_0_1(helper_verw, cpu_T[0]);
             s->cc_op = CC_OP_EFLAGS;
             break;
         default:
@@ -6606,21 +6606,27 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
         break;
     case 0x102: /* lar */
     case 0x103: /* lsl */
-        if (!s->pe || s->vm86)
-            goto illegal_op;
-        ot = dflag ? OT_LONG : OT_WORD;
-        modrm = ldub_code(s->pc++);
-        reg = ((modrm >> 3) & 7) | rex_r;
-        gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0);
-        gen_op_mov_TN_reg(ot, 1, reg);
-        if (s->cc_op != CC_OP_DYNAMIC)
-            gen_op_set_cc_op(s->cc_op);
-        if (b == 0x102)
-            gen_op_lar();
-        else
-            gen_op_lsl();
-        s->cc_op = CC_OP_EFLAGS;
-        gen_op_mov_reg_T1(ot, reg);
+        {
+            int label1;
+            if (!s->pe || s->vm86)
+                goto illegal_op;
+            ot = dflag ? OT_LONG : OT_WORD;
+            modrm = ldub_code(s->pc++);
+            reg = ((modrm >> 3) & 7) | rex_r;
+            gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0);
+            if (s->cc_op != CC_OP_DYNAMIC)
+                gen_op_set_cc_op(s->cc_op);
+            if (b == 0x102)
+                tcg_gen_helper_1_1(helper_lar, cpu_T[0], cpu_T[0]);
+            else
+                tcg_gen_helper_1_1(helper_lsl, cpu_T[0], cpu_T[0]);
+            tcg_gen_andi_tl(cpu_tmp0, cpu_cc_src, CC_Z);
+            label1 = gen_new_label();
+            tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), label1);
+            gen_op_mov_reg_T0(ot, reg);
+            gen_set_label(label1);
+            s->cc_op = CC_OP_EFLAGS;
+        }
         break;
     case 0x118:
         modrm = ldub_code(s->pc++);