فهرست منبع

* align locations where mm registers are stored to be preserved

git-svn-id: trunk@8970 -
florian 18 سال پیش
والد
کامیت
0b83cb5761
1فایلهای تغییر یافته به همراه40 افزوده شده و 25 حذف شده
  1. 40 25
      compiler/cgobj.pas

+ 40 - 25
compiler/cgobj.pas

@@ -470,7 +470,7 @@ unit cgobj;
              @param(usedinproc Registers which are used in the code of this routine)
           }
           procedure g_restore_registers(list:TAsmList);virtual;
-                    
+
           procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);virtual;abstract;
           procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: aint);virtual;
 
@@ -3609,9 +3609,14 @@ implementation
 
         { mm registers }
         if uses_registers(R_MMREGISTER) then
-          for r:=low(saved_mm_registers) to high(saved_mm_registers) do
-            if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
-              inc(size,tcgsize2size[OS_VECTOR]);
+          begin
+            if (size mod tcgsize2size[OS_VECTOR])<>0 then
+              inc(size,tcgsize2size[OS_VECTOR]-(size mod tcgsize2size[OS_VECTOR]));
+
+            for r:=low(saved_mm_registers) to high(saved_mm_registers) do
+              if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
+                inc(size,tcgsize2size[OS_VECTOR]);
+          end;
 
         tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
 
@@ -3632,15 +3637,20 @@ implementation
               end;
 
             if uses_registers(R_MMREGISTER) then
-              for r:=low(saved_mm_registers) to high(saved_mm_registers) do
-                begin
-                  if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
-                    begin
-                      a_loadmm_reg_ref(list,OS_VECTOR,OS_VECTOR,newreg(R_MMREGISTER,saved_mm_registers[r],R_SUBNONE),href,nil);
-                      inc(href.offset,tcgsize2size[OS_VECTOR]);
-                    end;
-                  include(rg[R_MMREGISTER].preserved_by_proc,saved_mm_registers[r]);
-                end;
+              begin
+                if (href.offset mod tcgsize2size[OS_VECTOR])<>0 then
+                  inc(href.offset,tcgsize2size[OS_VECTOR]-(href.offset mod tcgsize2size[OS_VECTOR]));
+
+                for r:=low(saved_mm_registers) to high(saved_mm_registers) do
+                  begin
+                    if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
+                      begin
+                        a_loadmm_reg_ref(list,OS_VECTOR,OS_VECTOR,newreg(R_MMREGISTER,saved_mm_registers[r],R_SUBNONE),href,nil);
+                        inc(href.offset,tcgsize2size[OS_VECTOR]);
+                      end;
+                    include(rg[R_MMREGISTER].preserved_by_proc,saved_mm_registers[r]);
+                  end;
+              end;
           end;
       end;
 
@@ -3667,18 +3677,23 @@ implementation
             end;
 
         if uses_registers(R_MMREGISTER) then
-          for r:=low(saved_mm_registers) to high(saved_mm_registers) do
-            begin
-              if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
-                begin
-                  hreg:=newreg(R_MMREGISTER,saved_mm_registers[r],R_SUBNONE);
-                  { Allocate register so the optimizer does not remove the load }
-                  a_reg_alloc(list,hreg);
-                  a_loadmm_ref_reg(list,OS_VECTOR,OS_VECTOR,href,hreg,nil);
-                  inc(href.offset,tcgsize2size[OS_VECTOR]);
-                  freetemp:=true;
-                end;
-            end;
+          begin
+            if (href.offset mod tcgsize2size[OS_VECTOR])<>0 then
+              inc(href.offset,tcgsize2size[OS_VECTOR]-(href.offset mod tcgsize2size[OS_VECTOR]));
+
+            for r:=low(saved_mm_registers) to high(saved_mm_registers) do
+              begin
+                if saved_mm_registers[r] in rg[R_MMREGISTER].used_in_proc then
+                  begin
+                    hreg:=newreg(R_MMREGISTER,saved_mm_registers[r],R_SUBNONE);
+                    { Allocate register so the optimizer does not remove the load }
+                    a_reg_alloc(list,hreg);
+                    a_loadmm_ref_reg(list,OS_VECTOR,OS_VECTOR,href,hreg,nil);
+                    inc(href.offset,tcgsize2size[OS_VECTOR]);
+                    freetemp:=true;
+                  end;
+              end;
+          end;
 
         if freetemp then
           tg.UnGetTemp(list,current_procinfo.save_regs_ref);