Browse Source

* merged asm result patch part 2

peter 25 years ago
parent
commit
4bcd969993
4 changed files with 52 additions and 16 deletions
  1. 32 7
      compiler/i386/ra386.pas
  2. 8 5
      compiler/rautils.pas
  3. 5 2
      compiler/tgeni386.pas
  4. 7 2
      compiler/types.pas

+ 32 - 7
compiler/i386/ra386.pas

@@ -63,7 +63,7 @@ uses
 {$else}
 {$else}
   hcodegen,
   hcodegen,
 {$endif}
 {$endif}
-  globtype,systems,types,globals,verbose,cpuasm;
+  globtype,symconst,symdef,symtable,systems,types,globals,verbose,cpuasm;
 
 
 
 
 {*****************************************************************************
 {*****************************************************************************
@@ -185,16 +185,38 @@ Begin
    begin
    begin
      opr.typ:=OPR_REGISTER;
      opr.typ:=OPR_REGISTER;
      if is_fpu(procinfo^.returntype.def) then
      if is_fpu(procinfo^.returntype.def) then
-       opr.reg:=R_ST0
+       begin
+         opr.reg:=R_ST0;
+         case pfloatdef(procinfo^.returntype.def)^.typ of
+           s32real : size:=S_FS;
+           s64real : size:=S_FL;
+           s80real : size:=S_FX;
+           s64comp : size:=S_IQ;
+         else
+           begin
+             Message(asmr_e_cannot_use_RESULT_here);
+             res:=false;
+           end;
+         end;
+       end
      else if ret_in_acc(procinfo^.returntype.def) then
      else if ret_in_acc(procinfo^.returntype.def) then
        case procinfo^.returntype.def^.size of
        case procinfo^.returntype.def^.size of
-       1 : opr.reg:=R_AL;
-       2 : opr.reg:=R_AX;
-       3,4 : opr.reg:=R_EAX;
+       1 : begin
+             opr.reg:=R_AL;
+             size:=S_B;
+           end;
+       2 : begin
+             opr.reg:=R_AX;
+             size:=S_W;
+           end;
+       3,4 : begin
+               opr.reg:=R_EAX;
+               size:=S_L;
+             end;
        else
        else
          begin
          begin
            Message(asmr_e_cannot_use_RESULT_here);
            Message(asmr_e_cannot_use_RESULT_here);
-           exit;
+           res:=false;
          end;
          end;
        end;
        end;
      Message1(asmr_h_RESULT_is_reg,reg2str(opr.reg));
      Message1(asmr_h_RESULT_is_reg,reg2str(opr.reg));
@@ -492,7 +514,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2000-10-15 09:47:43  peter
+  Revision 1.2  2000-10-31 22:30:14  peter
+    * merged asm result patch part 2
+
+  Revision 1.1  2000/10/15 09:47:43  peter
     * moved to i386/
     * moved to i386/
 
 
   Revision 1.7  2000/10/08 10:26:33  peter
   Revision 1.7  2000/10/08 10:26:33  peter

+ 8 - 5
compiler/rautils.pas

@@ -28,7 +28,7 @@ Interface
 
 
 Uses
 Uses
   cutils,cobjects,
   cutils,cobjects,
-  globtype,aasm,cpubase,symconst;
+  globtype,aasm,cpubase,symconst,symdef;
 
 
 Const
 Const
   RPNMax = 10;             { I think you only need 4, but just to be safe }
   RPNMax = 10;             { I think you only need 4, but just to be safe }
@@ -212,7 +212,7 @@ uses
   strings,
   strings,
 {$endif}
 {$endif}
   types,systems,verbose,globals,fmodule,
   types,systems,verbose,globals,fmodule,
-  symbase,symtype,symdef,symsym,symtable,cpuasm
+  symbase,symtype,symsym,symtable,cpuasm
 {$ifdef NEWCG}
 {$ifdef NEWCG}
   ,cgbase;
   ,cgbase;
 {$else}
 {$else}
@@ -734,8 +734,8 @@ Begin
   if assigned(procinfo^.returntype.def) and
   if assigned(procinfo^.returntype.def) and
      (procinfo^.returntype.def<>pdef(voiddef)) then
      (procinfo^.returntype.def<>pdef(voiddef)) then
    begin
    begin
-     if (m_tp in aktmodeswitches) or
-        (m_delphi in aktmodeswitches) then
+     if (procinfo^.return_offset=0) and ((m_tp in aktmodeswitches) or
+        (m_delphi in aktmodeswitches)) then
        begin
        begin
          Message(asmr_e_cannot_use_RESULT_here);
          Message(asmr_e_cannot_use_RESULT_here);
          exit;
          exit;
@@ -1548,7 +1548,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.8  2000-10-31 22:02:51  peter
+  Revision 1.9  2000-10-31 22:30:13  peter
+    * merged asm result patch part 2
+
+  Revision 1.8  2000/10/31 22:02:51  peter
     * symtable splitted, no real code changes
     * symtable splitted, no real code changes
 
 
   Revision 1.7  2000/10/08 10:26:33  peter
   Revision 1.7  2000/10/08 10:26:33  peter

+ 5 - 2
compiler/tgeni386.pas

@@ -515,7 +515,6 @@ implementation
       begin
       begin
          if usablereg32=0 then
          if usablereg32=0 then
            internalerror(10);
            internalerror(10);
-         dec(usablereg32);
 {$ifdef TEMPREGDEBUG}
 {$ifdef TEMPREGDEBUG}
          if curptree^^.usableregs-usablereg32>curptree^^.registers32 then
          if curptree^^.usableregs-usablereg32>curptree^^.registers32 then
            internalerror(10);
            internalerror(10);
@@ -524,6 +523,7 @@ implementation
          if curptree^^.usableregs-usablereg32>curptree^^.reallyusedregs then
          if curptree^^.usableregs-usablereg32>curptree^^.reallyusedregs then
            curptree^^.reallyusedregs:=curptree^^.usableregs-usablereg32;
            curptree^^.reallyusedregs:=curptree^^.usableregs-usablereg32;
 {$endif EXTTEMPREGDEBUG}
 {$endif EXTTEMPREGDEBUG}
+         dec(usablereg32);
          if R_EAX in unused then
          if R_EAX in unused then
            begin
            begin
               unused:=unused-[R_EAX];
               unused:=unused-[R_EAX];
@@ -653,7 +653,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.8  2000-10-14 10:14:56  peter
+  Revision 1.9  2000-10-31 22:30:13  peter
+    * merged asm result patch part 2
+
+  Revision 1.8  2000/10/14 10:14:56  peter
     * moehrendorf oct 2000 rewrite
     * moehrendorf oct 2000 rewrite
 
 
   Revision 1.7  2000/09/30 16:08:46  peter
   Revision 1.7  2000/09/30 16:08:46  peter

+ 7 - 2
compiler/types.pas

@@ -458,7 +458,9 @@ implementation
     { returns true, if def uses FPU }
     { returns true, if def uses FPU }
     function is_fpu(def : pdef) : boolean;
     function is_fpu(def : pdef) : boolean;
       begin
       begin
-         is_fpu:=(def^.deftype=floatdef) and (pfloatdef(def)^.typ<>f32bit);
+         is_fpu:=(def^.deftype=floatdef) and
+                 (pfloatdef(def)^.typ<>f32bit) and
+                 (pfloatdef(def)^.typ<>f16bit);
       end;
       end;
 
 
 
 
@@ -1684,7 +1686,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.16  2000-10-31 22:02:55  peter
+  Revision 1.17  2000-10-31 22:30:13  peter
+    * merged asm result patch part 2
+
+  Revision 1.16  2000/10/31 22:02:55  peter
     * symtable splitted, no real code changes
     * symtable splitted, no real code changes
 
 
   Revision 1.15  2000/10/21 18:16:12  florian
   Revision 1.15  2000/10/21 18:16:12  florian