Browse Source

m68k: use target_info.stackalign to align the stack instead of expecting a hardwired longword alignment. this is required for atari, and beneficial on all '000 targets

git-svn-id: trunk@34666 -
Károly Balogh 8 years ago
parent
commit
51cb5aefbe
1 changed files with 6 additions and 5 deletions
  1. 6 5
      compiler/m68k/cpupara.pas

+ 6 - 5
compiler/m68k/cpupara.pas

@@ -295,7 +295,7 @@ unit cpupara;
                   end;
                   end;
               end;
               end;
 
 
-            hp.paraloc[side].alignment:=std_param_align;
+            hp.paraloc[side].alignment:=target_info.stackalign;  //std_param_align;
             hp.paraloc[side].size:=paracgsize;
             hp.paraloc[side].size:=paracgsize;
             hp.paraloc[side].intsize:=paralen;
             hp.paraloc[side].intsize:=paralen;
             hp.paraloc[side].def:=paradef;
             hp.paraloc[side].def:=paradef;
@@ -316,7 +316,8 @@ unit cpupara;
 
 
                 paraloc^.loc:=LOC_REFERENCE;
                 paraloc^.loc:=LOC_REFERENCE;
                 paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
                 paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
-                if (paradef.typ=floatdef) then
+                if (not (cs_fp_emulation in current_settings.moduleswitches)) and
+                   (paradef.typ=floatdef) then
                   paraloc^.size:=int_float_cgsize(paralen)
                   paraloc^.size:=int_float_cgsize(paralen)
                 else
                 else
                   paraloc^.size:=int_cgsize(paralen);
                   paraloc^.size:=int_cgsize(paralen);
@@ -329,10 +330,10 @@ unit cpupara;
                     paraloc^.reference.index:=NR_FRAME_POINTER_REG;
                     paraloc^.reference.index:=NR_FRAME_POINTER_REG;
                     inc(paraloc^.reference.offset,target_info.first_parm_offset);
                     inc(paraloc^.reference.offset,target_info.first_parm_offset);
                     { M68K is a big-endian target }
                     { M68K is a big-endian target }
-                    if (paralen<tcgsize2size[OS_INT]) then
-                      inc(paraloc^.reference.offset,4-paralen);
+                    if (paralen<target_info.stackalign{tcgsize2size[OS_INT]}) then
+                      inc(paraloc^.reference.offset,target_info.stackalign-paralen);
                   end;
                   end;
-                inc(cur_stack_offset,align(paralen,4));
+                inc(cur_stack_offset,align(paralen,target_info.stackalign));
                 paralen := 0;
                 paralen := 0;
 
 
                 firstparaloc:=false;
                 firstparaloc:=false;