Browse Source

+ floating point register variables !!
* pairegalloc is now generated for register variables

florian 26 years ago
parent
commit
e53aceb9be

+ 42 - 7
compiler/cg386add.pas

@@ -1803,9 +1803,25 @@ implementation
 
                     if (p^.right^.location.loc<>LOC_FPU) then
                       begin
-                         floatload(pfloatdef(p^.right^.resulttype)^.typ,p^.right^.location.reference);
+                         if p^.right^.location.loc=LOC_CFPUREGISTER then
+                           begin
+                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
+                                correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                              inc(fpuvaroffset);
+                            end
+                         else
+                           floatload(pfloatdef(p^.right^.resulttype)^.typ,p^.right^.location.reference);
                          if (p^.left^.location.loc<>LOC_FPU) then
-                           floatload(pfloatdef(p^.left^.resulttype)^.typ,p^.left^.location.reference)
+                           begin
+                              if p^.left^.location.loc=LOC_CFPUREGISTER then
+                                begin
+                                   exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
+                                     correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                                   inc(fpuvaroffset);
+                                end
+                              else
+                                floatload(pfloatdef(p^.left^.resulttype)^.typ,p^.left^.location.reference)
+                           end
                          { left was on the stack => swap }
                          else
                            p^.swaped:=not(p^.swaped);
@@ -1815,13 +1831,22 @@ implementation
                       end
                     { the nominator in st0 }
                     else if (p^.left^.location.loc<>LOC_FPU) then
-                      floatload(pfloatdef(p^.left^.resulttype)^.typ,p^.left^.location.reference)
+                      begin
+                         if p^.left^.location.loc=LOC_CFPUREGISTER then
+                           begin
+                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
+                                correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                              inc(fpuvaroffset);
+                           end
+                         else
+                           floatload(pfloatdef(p^.left^.resulttype)^.typ,p^.left^.location.reference)
+                      end
                     { fpu operands are always in the wrong order on the stack }
                     else
                       p^.swaped:=not(p^.swaped);
 
                     { releases the left reference }
-                    if (p^.left^.location.loc<>LOC_FPU) then
+                    if (p^.left^.location.loc in [LOC_MEM,LOC_REFERENCE]) then
                       del_reference(p^.left^.location.reference);
 
                     { if we swaped the tree nodes, then use the reverse operator }
@@ -1839,9 +1864,15 @@ implementation
                     }
                     { the Intel assemblers want operands }
                     if op<>A_FCOMPP then
-                       exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,R_ST,R_ST1)))
+                      begin
+                         exprasmlist^.concat(new(pai386,op_reg_reg(op,S_NO,R_ST,R_ST1)));
+                         dec(fpuvaroffset);
+                      end
                     else
-                      exprasmlist^.concat(new(pai386,op_none(op,S_NO)));
+                      begin
+                         exprasmlist^.concat(new(pai386,op_none(op,S_NO)));
+                         dec(fpuvaroffset,2);
+                      end;
 
                     { on comparison load flags }
                     if cmpop then
@@ -2091,7 +2122,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.71  1999-08-04 00:22:40  florian
+  Revision 1.72  1999-08-04 13:45:17  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.71  1999/08/04 00:22:40  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.70  1999/08/03 22:02:31  peter

+ 14 - 4
compiler/cg386cal.pas

@@ -995,7 +995,10 @@ implementation
                          end;
                     end;
                   else
-                    p^.location.loc:=LOC_FPU;
+                    begin
+                       p^.location.loc:=LOC_FPU;
+                       inc(fpuvaroffset);
+                    end;
                 end
               else if is_ansistring(p^.resulttype) or
                 is_widestring(p^.resulttype) then
@@ -1089,8 +1092,11 @@ implementation
                    ungetiftemp(p^.location.reference)
                 end
               else if p^.location.loc=LOC_FPU then
-                { release FPU stack }
-                exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,R_ST0)));
+                begin
+                  { release FPU stack }
+                  exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,R_ST0)));
+                  dec(fpuvaroffset);
+                end;
            end;
       end;
 
@@ -1172,7 +1178,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.96  1999-08-04 00:22:41  florian
+  Revision 1.97  1999-08-04 13:45:18  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.96  1999/08/04 00:22:41  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.95  1999/08/03 22:02:34  peter

+ 10 - 1
compiler/cg386cnv.pas

@@ -811,6 +811,11 @@ implementation
       begin
          case pfrom^.location.loc of
             LOC_FPU : ;
+            LOC_CFPUREGISTER:
+              begin
+                 pto^.location:=pfrom^.location;
+                 exit;
+              end;
             LOC_MEM,
             LOC_REFERENCE:
               begin
@@ -1463,7 +1468,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.82  1999-08-04 00:22:43  florian
+  Revision 1.83  1999-08-04 13:45:19  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.82  1999/08/04 00:22:43  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.81  1999/08/03 22:02:36  peter

+ 66 - 8
compiler/cg386ld.pas

@@ -146,9 +146,17 @@ implementation
                          { in case it is a register variable: }
                          if pvarsym(p^.symtableentry)^.reg<>R_NO then
                            begin
-                              p^.location.loc:=LOC_CREGISTER;
-                              p^.location.register:=pvarsym(p^.symtableentry)^.reg;
-                              unused:=unused-[pvarsym(p^.symtableentry)^.reg];
+                              if pvarsym(p^.symtableentry)^.reg in [R_ST0..R_ST7] then
+                                begin
+                                   p^.location.loc:=LOC_CFPUREGISTER;
+                                   p^.location.register:=pvarsym(p^.symtableentry)^.reg;
+                                end
+                              else
+                                begin
+                                   p^.location.loc:=LOC_CREGISTER;
+                                   p^.location.register:=pvarsym(p^.symtableentry)^.reg;
+                                   unused:=unused-[pvarsym(p^.symtableentry)^.reg];
+                                end;
                            end
                          else
                            begin
@@ -358,6 +366,7 @@ implementation
          loc : tloc;
          r : preference;
          ai : pai386;
+         op : tasmop;
       begin
          otlabel:=truelabel;
          oflabel:=falselabel;
@@ -389,6 +398,8 @@ implementation
                                 end;
                               loc:=LOC_REFERENCE;
                            end;
+            LOC_CFPUREGISTER:
+              loc:=LOC_CFPUREGISTER;
             LOC_CREGISTER:
               loc:=LOC_CREGISTER;
             LOC_MMXREGISTER:
@@ -526,6 +537,14 @@ implementation
                                 end;
 
                            end
+                         else if loc=LOC_CFPUREGISTER then
+                           begin
+                              floatloadops(pfloatdef(p^.right^.resulttype)^.typ,op,opsize);
+                              exprasmlist^.concat(new(pai386,op_ref(op,opsize,
+                                newreference(p^.right^.location.reference))));
+                              exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
+                                correct_fpuregister(p^.left^.location.register,fpuvaroffset+1))));
+                           end
                          else
                            begin
                               if (p^.right^.resulttype^.needs_inittable) and
@@ -638,11 +657,46 @@ implementation
                                 fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
                               else
                                 fputyp:=s32real;
-
-                              if loc<>LOC_REFERENCE then
-                                internalerror(10010)
+                              case loc of
+                                 LOC_CFPUREGISTER:
+                                   begin
+                                      exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
+                                        correct_fpuregister(p^.left^.location.register,fpuvaroffset))));
+                                      dec(fpuvaroffset);
+                                   end;
+                                 LOC_REFERENCE:
+                                   floatstore(fputyp,p^.left^.location.reference);
+                                 else
+                                   internalerror(48991);
+                              end;
+                           end;
+            LOC_CFPUREGISTER: begin
+                              if (p^.left^.resulttype^.deftype=floatdef) then
+                               fputyp:=pfloatdef(p^.left^.resulttype)^.typ
+                              else
+                               if (p^.right^.resulttype^.deftype=floatdef) then
+                                fputyp:=pfloatdef(p^.right^.resulttype)^.typ
                               else
-                                floatstore(fputyp,p^.left^.location.reference);
+                               if (p^.right^.treetype=typeconvn) and
+                                  (p^.right^.left^.resulttype^.deftype=floatdef) then
+                                fputyp:=pfloatdef(p^.right^.left^.resulttype)^.typ
+                              else
+                                fputyp:=s32real;
+                              exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
+                                correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                              inc(fpuvaroffset);
+                              case loc of
+                                 LOC_CFPUREGISTER:
+                                   begin
+                                      exprasmlist^.concat(new(pai386,op_reg(A_FSTP,S_NO,
+                                        correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                                      dec(fpuvaroffset);
+                                   end;
+                                 LOC_REFERENCE:
+                                   floatstore(fputyp,p^.left^.location.reference);
+                                 else
+                                   internalerror(48992);
+                              end;
                            end;
             LOC_JUMP     : begin
                               getlabel(hlabel);
@@ -875,7 +929,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.69  1999-08-04 00:22:50  florian
+  Revision 1.70  1999-08-04 13:45:22  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.69  1999/08/04 00:22:50  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.68  1999/08/03 22:02:43  peter

+ 14 - 1
compiler/cg386mat.pas

@@ -736,6 +736,14 @@ implementation
                       p^.location.loc:=LOC_FPU;
                       exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
                    end;
+                 LOC_CFPUREGISTER:
+                   begin
+                      exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,
+                        correct_fpuregister(p^.right^.location.register,fpuvaroffset))));
+                      inc(fpuvaroffset);
+                      p^.location.loc:=LOC_FPU;
+                      exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                   end;
               end;
            end;
 { Here was a problem...     }
@@ -743,6 +751,7 @@ implementation
 { seems to be converted to signed  }
 { 32-bit before doing neg!!     }
 { So this is useless...     }
+{ that's not true: -2^31 gives an overflow error if it is negaded (FK) }
 {        emitoverflowcheck(p);}
       end;
 
@@ -930,7 +939,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.29  1999-08-04 00:22:51  florian
+  Revision 1.30  1999-08-04 13:45:23  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.29  1999/08/04 00:22:51  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.28  1999/08/03 22:02:45  peter

+ 29 - 1
compiler/cgai386.pas

@@ -1187,6 +1187,28 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                   if (cs_debuginfo in aktmoduleswitches) and
                      (exprasmlist^.first=exprasmlist^.last) then
                     exprasmlist^.concat(new(pai_force_line,init));
+{$endif GDB}
+                  r:=new_reference(R_ESP,0);
+                  floatstoreops(pfloatdef(p^.resulttype)^.typ,op,opsize);
+                  { this is the easiest case for inlined !! }
+                  if inlined then
+                    begin
+                       r^.base:=procinfo.framepointer;
+                       r^.offset:=para_offset-pushedparasize;
+                    end;
+                  exprasmlist^.concat(new(pai386,op_ref(op,opsize,r)));
+               end;
+             LOC_CFPUREGISTER:
+               begin
+                  exprasmlist^.concat(new(pai386,op_reg(A_FLD,S_NO,p^.location.register)));
+                  size:=align(pfloatdef(p^.resulttype)^.size,alignment);
+                  inc(pushedparasize,size);
+                  if not inlined then
+                   exprasmlist^.concat(new(pai386,op_const_reg(A_SUB,S_L,size,R_ESP)));
+{$ifdef GDB}
+                  if (cs_debuginfo in aktmoduleswitches) and
+                     (exprasmlist^.first=exprasmlist^.last) then
+                    exprasmlist^.concat(new(pai_force_line,init));
 {$endif GDB}
                   r:=new_reference(R_ESP,0);
                   floatstoreops(pfloatdef(p^.resulttype)^.typ,op,opsize);
@@ -1545,6 +1567,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          floatloadops(t,op,s);
          exprasmlist^.concat(new(pai386,op_ref(op,s,
            newreference(ref))));
+         inc(fpuvaroffset);
       end;
 
 
@@ -1581,6 +1604,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          floatstoreops(t,op,s);
          exprasmlist^.concat(new(pai386,op_ref(op,s,
            newreference(ref))));
+         dec(fpuvaroffset);
       end;
 
 
@@ -3137,7 +3161,11 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.24  1999-08-04 00:22:55  florian
+  Revision 1.25  1999-08-04 13:45:24  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.24  1999/08/04 00:22:55  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.23  1999/08/03 22:02:49  peter

+ 14 - 4
compiler/cpubase.pas

@@ -31,7 +31,7 @@ interface
 {$endif}
 
 uses
-  strings,cobjects,aasm;
+  globals,strings,cobjects,aasm;
 
 const
 { Size of the instruction table converted by nasmconv.pas }
@@ -670,7 +670,8 @@ type
     LOC_FLAGS,       { boolean results only, flags are set }
     LOC_CREGISTER,   { Constant register which shouldn't be modified }
     LOC_MMXREGISTER, { MMX register }
-    LOC_CMMXREGISTER { Constant MMX register }
+    LOC_CMMXREGISTER,{ Constant MMX register }
+    LOC_CFPUREGISTER { if it is a FPU register variable on the fpu stack }
   );
 
   plocation = ^tlocation;
@@ -760,6 +761,8 @@ var
        varregs : array[1..maxvarregs] of tregister =
          (R_EBX,R_EDX,R_ECX,R_EAX);
 
+       maxfpuvarregs = 8;
+
     function imm_2_type(l:longint):longint;
 
     { the following functions allow to convert registers }
@@ -834,7 +837,10 @@ implementation
            'AX','CX','DX','BX','SP','BP','SI','DI',
            'AL','CL','DL','BL');
       begin
-         reg2str:=a[r];
+         if r in [R_ST0..R_ST7] then
+           reg2str:='ST('+tostr(longint(r)-longint(R_ST0))+')'
+         else
+           reg2str:=a[r];
       end;
 
 
@@ -1004,7 +1010,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.1  1999-08-04 00:22:58  florian
+  Revision 1.2  1999-08-04 13:45:25  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.1  1999/08/04 00:22:58  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.10  1999/08/02 21:28:58  florian

+ 6 - 1
compiler/mppc386.bat

@@ -1 +1,6 @@
-ppt5 -Xs -Ch8000000 -dI386 -dGDB -Sg -dnoag386int -dnoag386nsm pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
+ppc386 -O3p3 -Ch8000000 -dI386 -dGDB -dBROWSERLOG -Sg pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel 0 goto success
+goto failed
+:success
+copy pp.exe ppc386.exe
+:failed

+ 118 - 7
compiler/pass_2.pas

@@ -291,12 +291,13 @@ implementation
          do_secondpass:=codegenerror;
       end;
 
-
-
     var
-       regvars : array[1..maxvarregs] of pvarsym;
-       regvars_para : array[1..maxvarregs] of boolean;
-       regvars_refs : array[1..maxvarregs] of longint;
+       { the array ranges are oveestimated !!!  }
+       { max(maxvarregs,maxfpuvarregs) would be }
+       { enough                                 }
+       regvars : array[1..maxvarregs+maxfpuvarregs] of pvarsym;
+       regvars_para : array[1..maxvarregs+maxfpuvarregs] of boolean;
+       regvars_refs : array[1..maxvarregs+maxfpuvarregs] of longint;
        parasym : boolean;
 
     procedure searchregvars(p : pnamedindexobject);
@@ -344,6 +345,51 @@ implementation
       end;
 
 
+    procedure searchfpuregvars(p : pnamedindexobject);
+      var
+         i,j,k : longint;
+      begin
+         if (psym(p)^.typ=varsym) and (vo_fpuregable in pvarsym(p)^.varoptions) then
+           begin
+              { walk through all momentary register variables }
+              for i:=1 to maxfpuvarregs do
+                begin
+                   { free register ? }
+                   if regvars[i]=nil then
+                     begin
+                        regvars[i]:=pvarsym(p);
+                        regvars_para[i]:=parasym;
+                        break;
+                     end;
+                   { else throw out a variable ? }
+                       j:=pvarsym(p)^.refs;
+                   { parameter get a less value }
+                   if parasym then
+                     begin
+                        if cs_littlesize in aktglobalswitches  then
+                          dec(j,1)
+                        else
+                          dec(j,100);
+                     end;
+                   if (j>regvars_refs[i]) and (j>0) then
+                     begin
+                        for k:=maxfpuvarregs-1 downto i do
+                          begin
+                             regvars[k+1]:=regvars[k];
+                             regvars_para[k+1]:=regvars_para[k];
+                          end;
+                        { calc the new refs
+                        pvarsym(p)^.refs:=j; }
+                        regvars[i]:=pvarsym(p);
+                        regvars_para[i]:=parasym;
+                        regvars_refs[i]:=j;
+                        break;
+                     end;
+                end;
+           end;
+      end;
+
+
     procedure generatecode(var p : ptree);
       var
          i       : longint;
@@ -405,7 +451,7 @@ implementation
                        end;
                      end;
                    if (p^.registers32<4) then
-                       begin
+                     begin
                         for i:=1 to maxvarregs do
                           regvars[i]:=nil;
                         parasym:=false;
@@ -435,6 +481,9 @@ implementation
                                   { search the register which is the most }
                                   { unused                              }
                                   usableregs:=usableregs-[varregs[i]];
+{$ifdef i386}
+                                  procinfo.aktentrycode^.concat(new(pairegalloc,alloc(varregs[i])));
+{$endif i386}
                                   is_reg_var[varregs[i]]:=true;
                                   dec(c_usableregs);
 
@@ -516,6 +565,64 @@ implementation
                                       tostr(regvars[i]^.refs),regvars[i]^.name);
                                end;
                           end;
+                     end;
+                   if (p^.registersfpu<maxfpuvarregs-2) then
+                     begin
+                        for i:=1 to maxfpuvarregs do
+                          regvars[i]:=nil;
+                        parasym:=false;
+                        symtablestack^.foreach({$ifndef TP}@{$endif}searchfpuregvars);
+{$ifdef dummy}
+                        { copy parameter into a register ? }
+                        parasym:=true;
+                        symtablestack^.next^.foreach({$ifndef TP}@{$endif}searchregvars);
+{$endif dummy}
+                        { hold needed registers free }
+                        for i:=maxvarregs downto maxvarregs-p^.registersfpu+1 do
+                          regvars[i]:=nil;
+                        { now assign register }
+                        for i:=1 to maxfpuvarregs-p^.registersfpu do
+                          begin
+                             if assigned(regvars[i]) then
+                               begin
+                                  regvars[i]^.reg:=correct_fpuregister(R_ST0,i-1);
+{$ifdef dummy}
+                                  { parameter must be load }
+                                  if regvars_para[i] then
+                                    begin
+                                       { procinfo is there actual,      }
+                                       { because we can't never be in a }
+                                       { nested procedure              }
+                                       { when loading parameter to reg  }
+                                       new(hr);
+                                       reset_reference(hr^);
+                                       hr^.offset:=pvarsym(regvars[i])^.address+procinfo.call_offset;
+                                       hr^.base:=procinfo.framepointer;
+{$ifdef i386}
+                                       procinfo.aktentrycode^.concat(new(pai386,op_ref_reg(A_MOV,regsize,
+                                         hr,regvars[i]^.reg)));
+{$endif i386}
+{$ifdef m68k}
+                                       procinfo.aktentrycode^.concat(new(pai68k,op_ref_reg(A_MOVE,regsize,
+                                         hr,regvars[i]^.reg)));
+{$endif m68k}
+                                    end;
+{$endif dummy}
+                               end;
+                          end;
+                        for i:=1 to maxfpuvarregs do
+                          begin
+                             if assigned(regvars[i]) then
+                               begin
+                                  if cs_asm_source in aktglobalswitches then
+                                    procinfo.aktentrycode^.insert(new(pai_asm_comment,init(strpnew(regvars[i]^.name+
+                                      ' with weight '+tostr(regvars[i]^.refs)+' assigned to register '+
+                                      reg2str(regvars[i]^.reg)))));
+                                  if (status.verbosity and v_debug)=v_debug then
+                                    Message3(cg_d_register_weight,reg2str(regvars[i]^.reg),
+                                      tostr(regvars[i]^.refs),regvars[i]^.name);
+                               end;
+                          end;
                         if cs_asm_source in aktglobalswitches then
                           procinfo.aktentrycode^.insert(new(pai_asm_comment,init(strpnew('Register variable assignment:'))));
                      end;
@@ -538,7 +645,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.28  1999-08-04 00:23:10  florian
+  Revision 1.29  1999-08-04 13:45:28  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.28  1999/08/04 00:23:10  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.27  1999/08/03 22:02:55  peter

+ 7 - 2
compiler/symconst.pas

@@ -153,7 +153,8 @@ type
     vo_is_C_var,
     vo_is_external,
     vo_is_dll_var,
-    vo_is_thread_var
+    vo_is_thread_var,
+    vo_fpuregable
   );
   tvaroptions=set of tvaroption;
 
@@ -179,7 +180,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.1  1999-08-03 22:03:14  peter
+  Revision 1.2  1999-08-04 13:45:29  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.1  1999/08/03 22:03:14  peter
     * moved bitmask constants to sets
     * some other type/const renamings
 

+ 20 - 5
compiler/symsym.inc

@@ -905,6 +905,13 @@
                  include(varoptions,vo_regable);
 {$else}
                  varoptions:=varoptions+[vo_regable];
+{$endif}
+           floatdef:
+             if not(pfloatdef(p)^.typ in [f32bit,f16bit]) then
+{$ifdef INCLUDEOK}
+               include(varoptions,vo_fpuregable);
+{$else}
+               varoptions:=varoptions+[vo_fpuregable];
 {$endif}
            else
 {$ifdef INCLUDEOK}
@@ -1132,8 +1139,9 @@
             { this symbol can't be loaded to a register }
 {$ifdef INCLUDEOK}
             exclude(varoptions,vo_regable);
+            exclude(varoptions,vo_fpuregable);
 {$else}
-            varoptions:=varoptions-[vo_regable];
+            varoptions:=varoptions-[vo_regable,vo_fpuregable];
 {$endif}
          end
         else
@@ -1202,8 +1210,9 @@
                    { this symbol can't be loaded to a register }
 {$ifdef INCLUDEOK}
                    exclude(varoptions,vo_regable);
+                   exclude(varoptions,vo_fpuregable);
 {$else}
-                   varoptions:=varoptions-[vo_regable];
+                   varoptions:=varoptions-[vo_regable,vo_fpuregable];
 {$endif}
                  end;
                globalsymtable :
@@ -1226,8 +1235,9 @@
                    { this symbol can't be loaded to a register }
 {$ifdef INCLUDEOK}
                    exclude(varoptions,vo_regable);
+                   exclude(varoptions,vo_fpuregable);
 {$else}
-                   varoptions:=varoptions-[vo_regable];
+                   varoptions:=varoptions-[vo_regable,vo_fpuregable];
 {$endif}
                  end;
                recordsymtable,
@@ -1236,8 +1246,9 @@
                  { this symbol can't be loaded to a register }
 {$ifdef INCLUDEOK}
                    exclude(varoptions,vo_regable);
+                   exclude(varoptions,vo_fpuregable);
 {$else}
-                   varoptions:=varoptions-[vo_regable];
+                   varoptions:=varoptions-[vo_regable,vo_fpuregable];
 {$endif}
                  { get the alignment size }
                    if (aktpackrecords=packrecord_C) then
@@ -2106,7 +2117,11 @@
 
 {
   $Log$
-  Revision 1.106  1999-08-03 22:03:19  peter
+  Revision 1.107  1999-08-04 13:45:30  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.106  1999/08/03 22:03:19  peter
     * moved bitmask constants to sets
     * some other type/const renamings
 

+ 18 - 1
compiler/tgeni386.pas

@@ -71,6 +71,9 @@ unit tgeni386;
     procedure clearregistercount;
     procedure resetusableregisters;
 
+    { corrects the fpu stack register by ofs }
+    function correct_fpuregister(r : tregister;ofs : byte) : tregister;
+
     var
        unused,usableregs : tregisterset;
        c_usableregs : longint;
@@ -78,6 +81,8 @@ unit tgeni386;
        { uses only 1 byte while a set uses in FPC 32 bytes }
        usedinproc : byte;
 
+       fpuvaroffset : byte;
+
        { count, how much a register must be pushed if it is used as register }
        { variable                                                           }
 {$ifdef SUPPORT_MMX}
@@ -428,6 +433,7 @@ implementation
       begin
          unused:=usableregs;
          usablereg32:=c_usableregs;
+         fpuvaroffset:=0;
       end;
 
 
@@ -450,6 +456,12 @@ implementation
 {$endif SUPPORT_MMX}
       end;
 
+   function correct_fpuregister(r : tregister;ofs : byte) : tregister;
+
+     begin
+        correct_fpuregister:=tregister(longint(r)+ofs);
+     end;
+
    procedure resetusableregisters;
       begin
 {$ifdef SUPPORT_MMX}
@@ -460,6 +472,7 @@ implementation
         usableregs:=[R_EAX,R_EBX,R_ECX,R_EDX];
         c_usableregs:=4;
 {$endif SUPPORT_MMX}
+        fpuvaroffset:=0;
       end;
 
 begin
@@ -467,7 +480,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.29  1999-08-04 00:23:48  florian
+  Revision 1.30  1999-08-04 13:45:32  florian
+    + floating point register variables !!
+    * pairegalloc is now generated for register variables
+
+  Revision 1.29  1999/08/04 00:23:48  florian
     * renamed i386asm and i386base to cpuasm and cpubase
 
   Revision 1.28  1999/08/02 17:17:11  florian