فهرست منبع

* eliminated the dual initialization of DS in interrupt procedures in the huge
memory model

git-svn-id: trunk@31519 -

nickysn 10 سال پیش
والد
کامیت
98ec7a2211
2فایلهای تغییر یافته به همراه11 افزوده شده و 2 حذف شده
  1. 2 1
      compiler/i8086/cgcpu.pas
  2. 9 1
      compiler/x86/cgx86.pas

+ 2 - 1
compiler/i8086/cgcpu.pas

@@ -1777,7 +1777,8 @@ unit cgcpu;
               end
             else
               begin
-                if current_settings.x86memorymodel=mm_huge then
+                if (current_settings.x86memorymodel=mm_huge) and
+                    not (po_interrupt in current_procinfo.procdef.procoptions) then
                   list.concat(Taicpu.Op_reg(A_POP,S_W,NR_DS));
                 generate_leave(list);
               end;

+ 9 - 1
compiler/x86/cgx86.pas

@@ -2893,6 +2893,13 @@ unit cgx86;
                     list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
                   end;
               end
+            else if current_settings.x86memorymodel=mm_huge then
+              begin
+                reference_reset(fardataseg,0);
+                fardataseg.refaddr:=addr_fardataseg;
+                list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,fardataseg,NR_AX));
+                list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
+              end
             else
               begin
                 reference_reset(dgroup,0);
@@ -2977,7 +2984,8 @@ unit cgx86;
               end;
 
 {$ifdef i8086}
-              if current_settings.x86memorymodel=mm_huge then
+              if (current_settings.x86memorymodel=mm_huge) and
+                 not (po_interrupt in current_procinfo.procdef.procoptions) then
                 begin
                   list.concat(Taicpu.op_reg(A_PUSH,S_W,NR_DS));
                   reference_reset(fardataseg,0);