Przeglądaj źródła

* don't destroy edi when allocating the stack frame for win32

git-svn-id: trunk@2330 -
Jonas Maebe 19 lat temu
rodzic
commit
d2ba35df7e
1 zmienionych plików z 5 dodań i 2 usunięć
  1. 5 2
      compiler/x86/cgx86.pas

+ 5 - 2
compiler/x86/cgx86.pas

@@ -1790,7 +1790,7 @@ unit cgx86;
                     for i:=1 to localsize div winstackpagesize do
                     for i:=1 to localsize div winstackpagesize do
                       begin
                       begin
                          reference_reset_base(href,NR_ESP,localsize-i*winstackpagesize);
                          reference_reset_base(href,NR_ESP,localsize-i*winstackpagesize);
-                         list.concat(Taicpu.op_const_ref(A_MOV,S_L,0,href));
+                         list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                       end;
                       end;
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                  end
                  end
@@ -1798,14 +1798,17 @@ unit cgx86;
                  begin
                  begin
                     objectlibrary.getjumplabel(again);
                     objectlibrary.getjumplabel(again);
                     getcpuregister(list,NR_EDI);
                     getcpuregister(list,NR_EDI);
+                    list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EDI));
                     list.concat(Taicpu.op_const_reg(A_MOV,S_L,localsize div winstackpagesize,NR_EDI));
                     list.concat(Taicpu.op_const_reg(A_MOV,S_L,localsize div winstackpagesize,NR_EDI));
                     a_label(list,again);
                     a_label(list,again);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,winstackpagesize-4,NR_ESP));
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,winstackpagesize-4,NR_ESP));
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     a_jmp_cond(list,OC_NE,again);
                     a_jmp_cond(list,OC_NE,again);
+                    list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize - 4,NR_ESP));
+                    reference_reset_base(href,NR_ESP,localsize-4);
+                    list.concat(Taicpu.op_ref_reg(A_MOV,S_L,href,NR_EDI));
                     ungetcpuregister(list,NR_EDI);
                     ungetcpuregister(list,NR_EDI);
-                    list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize,NR_ESP));
                  end
                  end
              end
              end
            else
            else