Răsfoiți Sursa

* more cg11 updates

peter 25 ani în urmă
părinte
comite
27749c067e

+ 48 - 8
compiler/cg386ld.pas

@@ -401,6 +401,9 @@ implementation
          ai : paicpu;
          op : tasmop;
          pushed : boolean;
+         regspushed : tpushed;
+         regs_to_push: byte;
+         ungettemp : boolean;
 
       begin
          otlabel:=truelabel;
@@ -465,11 +468,45 @@ implementation
            begin
               if is_ansistring(p^.left^.resulttype) then
                 begin
-                  { the source and destinations are released
-                    in loadansistring, because an ansi string can
-                    also be in a register
-                  }
-                  loadansistring(p);
+                  { before pushing any parameter, we have to save all used      }
+                  { registers, but before that we have to release the       }
+                  { registers of that node to save uneccessary pushed       }
+                  { so be careful, if you think you can optimize that code (FK) }
+
+                  { nevertheless, this has to be changed, because otherwise the }
+                  { register is released before it's contents are pushed ->     }
+                  { problems with the optimizer (JM)                            }
+                  del_reference(p^.left^.location.reference);
+                  ungettemp:=false;
+                  { Find out which registers have to be pushed (JM) }
+                  regs_to_push := $ff;
+                  remove_non_regvars_from_loc(p^.right^.location,regs_to_push);
+                  { And push them (JM) }
+                  pushusedregisters(regspushed,regs_to_push);
+                  case p^.right^.location.loc of
+                     LOC_REGISTER,LOC_CREGISTER:
+                       begin
+                          exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,p^.right^.location.register)));
+                          ungetregister32(p^.right^.location.register);
+                       end;
+                     LOC_REFERENCE,LOC_MEM:
+                       begin
+                          { First release the registers because emit_push_mem may  }
+                          { load the reference in edi before pushing and then the  }
+                          { dealloc is too late (and optimizations are missed (JM) }
+                          del_reference(p^.right^.location.reference);
+                          { This one doesn't need extra registers (JM) }
+                          emit_push_mem(p^.right^.location.reference);
+                          ungettemp:=true;
+                       end;
+                  end;
+                  emitpushreferenceaddr(p^.left^.location.reference);
+                  del_reference(p^.left^.location.reference);
+                  emitcall('FPC_ANSISTR_ASSIGN');
+                  maybe_loadesi;
+                  popusedregisters(regspushed);
+                  if ungettemp then
+                    ungetiftemp(p^.right^.location.reference);
                 end
               else
               if is_shortstring(p^.left^.resulttype) and
@@ -958,7 +995,7 @@ implementation
                   begin
                     if vaddr then
                      begin
-                       emit_to_mem(hp^.left);
+                       emit_to_mem(hp^.left^.location,hp^.left^.resulttype);
                        emit_push_lea_loc(hp^.left^.location,freetemp);
                        del_reference(hp^.left^.location.reference);
                      end
@@ -972,7 +1009,7 @@ implementation
                     inc(href.offset,4);
                     if vaddr then
                      begin
-                       emit_to_mem(hp^.left);
+                       emit_to_mem(hp^.left^.location,hp^.left^.resulttype);
                        emit_lea_loc_ref(hp^.left^.location,href,freetemp);
                      end
                     else
@@ -1011,7 +1048,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.6  2000-09-24 21:19:49  peter
+  Revision 1.7  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.6  2000/09/24 21:19:49  peter
     * delphi compile fixes
 
   Revision 1.5  2000/08/27 16:11:49  peter

+ 105 - 219
compiler/cgai386.pas

@@ -28,7 +28,12 @@ unit cgai386;
 interface
 
     uses
-       cobjects,tree,
+       cobjects,
+{$ifdef CG11}
+       node,
+{$else}
+       tree,
+{$endif}
        cpubase,cpuasm,
        symconst,symtable,aasm;
 
@@ -94,7 +99,7 @@ interface
 
     procedure emit_pushw_loc(const t:tlocation);
     procedure emit_push_lea_loc(const t:tlocation;freetemp:boolean);
-    procedure emit_to_mem(var p:ptree);
+    procedure emit_to_mem(var t:tlocation;def:pdef);
     procedure emit_to_reg16(var hr:tregister);
     procedure emit_to_reg32(var hr:tregister);
     procedure emit_mov_reg_loc(reg: TRegister; const t:tlocation);
@@ -102,19 +107,18 @@ interface
 
     procedure copyshortstring(const dref,sref : treference;len : byte;
                         loadref, del_sref: boolean);
-    procedure loadansistring(p : ptree);
 
     procedure finalize(t : pdef;const ref : treference;is_already_ref : boolean);
     procedure incrstringref(t : pdef;const ref : treference);
     procedure decrstringref(t : pdef;const ref : treference);
 
-    function maybe_push(needed : byte;p : ptree;isint64 : boolean) : boolean;
+    function maybe_push(needed : byte;p : {$ifdef CG11}tnode{$else}ptree{$endif};isint64 : boolean) : boolean;
     procedure push_int(l : longint);
     procedure emit_push_mem(const ref : treference);
     procedure emitpushreferenceaddr(const ref : treference);
-    procedure pushsetelement(p : ptree);
-    procedure restore(p : ptree;isint64 : boolean);
-    procedure push_value_para(p:ptree;inlined,is_cdecl:boolean;
+    procedure pushsetelement(p : {$ifdef CG11}tnode{$else}ptree{$endif});
+    procedure restore(p : {$ifdef CG11}tnode{$else}ptree{$endif};isint64 : boolean);
+    procedure push_value_para(p:{$ifdef CG11}tnode{$else}ptree{$endif};inlined,is_cdecl:boolean;
                               para_offset:longint;alignment : longint);
 
 {$ifdef TEMPS_NOT_PUSH}
@@ -129,12 +133,12 @@ interface
     procedure floatstoreops(t : tfloattype;var op : tasmop;var s : topsize);
 
     procedure maybe_loadesi;
-    procedure maketojumpbool(p : ptree);
+    procedure maketojumpbool(p : {$ifdef CG11}tnode{$else}ptree{$endif});
     procedure emitloadord2reg(const location:Tlocation;orddef:Porddef;destreg:Tregister;delloc:boolean);
-    procedure emitoverflowcheck(p:ptree);
-    procedure emitrangecheck(p:ptree;todef:pdef);
+    procedure emitoverflowcheck(p:{$ifdef CG11}tnode{$else}ptree{$endif});
+    procedure emitrangecheck(p:{$ifdef CG11}tnode{$else}ptree{$endif};todef:pdef);
     procedure concatcopy(source,dest : treference;size : longint;delsource : boolean;loadref:boolean);
-    procedure firstcomplex(p : ptree);
+    procedure firstcomplex(p : {$ifdef CG11}tnode{$else}ptree{$endif});
 
     procedure genentrycode(alist : paasmoutput;const proc_names:Tstringcontainer;make_global:boolean;
                            stackframe:longint;
@@ -172,8 +176,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 {$else}
        strings,
 {$endif}
-       cutils,globtype,systems,globals,verbose,fmodule,types,pbase,
-       tgeni386,temp_gen,hcodegen,ppu,regvars
+       cutils,globtype,systems,globals,verbose,fmodule,types,
+       tgeni386,temp_gen,hcodegen,regvars
 {$ifdef GDB}
        ,gdb
 {$endif}
@@ -522,10 +526,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                  S_W : hreg:=R_DI;
                                  S_L : hreg:=R_EDI;
                                end;
-{$ifndef noAllocEdi}
                                if hreg in [R_DI,R_EDI] then
                                  getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                emit_ref_reg(A_MOV,siz,
                                  newreference(t.reference),hreg);
                                del_reference(t.reference);
@@ -538,10 +540,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                     else
                                       ungetregister(hreg);
                                  end;
-{$ifndef noAllocEdi}
                                if hreg in [R_DI,R_EDI] then
                                  ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                { we can release the registers }
                                { but only AFTER the MOV! Important for the optimizer!
                                  (JM)}
@@ -802,16 +802,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                              internalerror(331)
                            else
                              begin
-{$ifndef noAllocEdi}
                                getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                emit_ref_reg(A_LEA,S_L,
                                  newreference(t.reference),R_EDI);
                                exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,
                                  R_EDI,newreference(ref))));
-{$ifndef noAllocEdi}
                                ungetregister32(R_EDI);
-{$endif noAllocEdi}
                              end;
                             { release the registers }
                             del_reference(t.reference);
@@ -833,15 +829,11 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                              internalerror(331)
                            else
                              begin
-{$ifndef noAllocEdi}
                                getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                emit_ref_reg(A_LEA,S_L,
                                  newreference(t.reference),R_EDI);
                                exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
-{$ifndef noAllocEdi}
                                ungetregister32(R_EDI);
-{$endif noAllocEdi}
                              end;
                            if freetemp then
                             ungetiftemp(t.reference);
@@ -890,32 +882,28 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       end;
 
 
-    procedure emit_to_mem(var p:ptree);
+    procedure emit_to_mem(var t:tlocation;def:pdef);
 
       var
          r : treference;
 
       begin
-        case p^.location.loc of
+        case t.loc of
                LOC_FPU : begin
-                           reset_reference(p^.location.reference);
-                           gettempofsizereference(10,p^.location.reference);
-                           floatstore(pfloatdef(p^.resulttype)^.typ,p^.location.reference);
-                           {  This can't be never a l-value! (FK)
-                              p^.location.loc:=LOC_REFERENCE; }
+                           reset_reference(t.reference);
+                           gettempofsizereference(10,t.reference);
+                           floatstore(pfloatdef(def)^.typ,t.reference);
                          end;
                LOC_REGISTER:
                  begin
-                    if is_64bitint(p^.resulttype) then
+                    if is_64bitint(def) then
                       begin
                          gettempofsizereference(8,r);
-                         emit_reg_ref(A_MOV,S_L,p^.location.registerlow,
-                           newreference(r));
+                         emit_reg_ref(A_MOV,S_L,t.registerlow,newreference(r));
                          inc(r.offset,4);
-                         emit_reg_ref(A_MOV,S_L,p^.location.registerhigh,
-                           newreference(r));
+                         emit_reg_ref(A_MOV,S_L,t.registerhigh,newreference(r));
                          dec(r.offset,4);
-                         p^.location.reference:=r;
+                         t.reference:=r;
                       end
                     else
                       internalerror(1405001);
@@ -923,18 +911,16 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                LOC_MEM,
          LOC_REFERENCE : ;
          LOC_CFPUREGISTER : begin
-                           emit_reg(A_FLD,S_NO,correct_fpuregister(p^.location.register,fpuvaroffset));
+                           emit_reg(A_FLD,S_NO,correct_fpuregister(t.register,fpuvaroffset));
                            inc(fpuvaroffset);
-                           reset_reference(p^.location.reference);
-                           gettempofsizereference(10,p^.location.reference);
-                           floatstore(pfloatdef(p^.resulttype)^.typ,p^.location.reference);
-                           {  This can't be never a l-value! (FK)
-                              p^.location.loc:=LOC_REFERENCE; }
+                           reset_reference(t.reference);
+                           gettempofsizereference(10,t.reference);
+                           floatstore(pfloatdef(def)^.typ,t.reference);
                          end;
          else
          internalerror(333);
         end;
-        p^.location.loc:=LOC_MEM;
+        t.loc:=LOC_MEM;
       end;
 
 
@@ -1086,63 +1072,79 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          popusedregisters(pushedregs);
       end;
 
-    procedure loadansistring(p : ptree);
-    {
-      copies an ansistring from p^.right to p^.left, we
-      assume, that both sides are ansistring, firstassignement have
-      to take care of that, an ansistring can't be a register variable
-    }
-      var
-         pushed : tpushed;
-         regs_to_push: byte;
-         ungettemp : boolean;
-      begin
-         { before pushing any parameter, we have to save all used      }
-         { registers, but before that we have to release the       }
-         { registers of that node to save uneccessary pushed       }
-         { so be careful, if you think you can optimize that code (FK) }
-
-         { nevertheless, this has to be changed, because otherwise the }
-         { register is released before it's contents are pushed ->     }
-         { problems with the optimizer (JM)                            }
-         del_reference(p^.left^.location.reference);
-         ungettemp:=false;
-         { Find out which registers have to be pushed (JM) }
-         regs_to_push := $ff;
-         remove_non_regvars_from_loc(p^.right^.location,regs_to_push);
-         { And push them (JM) }
-         pushusedregisters(pushed,regs_to_push);
-         case p^.right^.location.loc of
-            LOC_REGISTER,LOC_CREGISTER:
-              begin
-                 exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,p^.right^.location.register)));
-                 ungetregister32(p^.right^.location.register);
-              end;
-            LOC_REFERENCE,LOC_MEM:
-              begin
-                 { First release the registers because emit_push_mem may  }
-                 { load the reference in edi before pushing and then the  }
-                 { dealloc is too late (and optimizations are missed (JM) }
-                 del_reference(p^.right^.location.reference);
-                 { This one doesn't need extra registers (JM) }
-                 emit_push_mem(p^.right^.location.reference);
-                 ungettemp:=true;
-              end;
-         end;
-         emitpushreferenceaddr(p^.left^.location.reference);
-         del_reference(p^.left^.location.reference);
-         emitcall('FPC_ANSISTR_ASSIGN');
-         maybe_loadesi;
-         popusedregisters(pushed);
-         if ungettemp then
-           ungetiftemp(p^.right^.location.reference);
-      end;
-
 
 {*****************************************************************************
                            Emit Push Functions
 *****************************************************************************}
 
+{$ifdef CG11}
+    function maybe_push(needed : byte;p : tnode;isint64 : boolean) : boolean;
+      var
+         pushed : boolean;
+         {hregister : tregister; }
+{$ifdef TEMPS_NOT_PUSH}
+         href : treference;
+{$endif TEMPS_NOT_PUSH}
+      begin
+         if needed>usablereg32 then
+           begin
+              if (p.location.loc=LOC_REGISTER) then
+                begin
+                   if isint64 then
+                     begin
+{$ifdef TEMPS_NOT_PUSH}
+                        gettempofsizereference(href,8);
+                        p.temp_offset:=href.offset;
+                        href.offset:=href.offset+4;
+                        exprasmlist^.concat(new(paicpu,op_reg(A_MOV,S_L,p.location.registerhigh,href)));
+                        href.offset:=href.offset-4;
+{$else TEMPS_NOT_PUSH}
+                        exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,p.location.registerhigh)));
+{$endif TEMPS_NOT_PUSH}
+                        ungetregister32(p^.location.registerhigh);
+                     end
+{$ifdef TEMPS_NOT_PUSH}
+                   else
+                     begin
+                        gettempofsizereference(href,4);
+                        p.temp_offset:=href.offset;
+                     end
+{$endif TEMPS_NOT_PUSH}
+                     ;
+                   pushed:=true;
+{$ifdef TEMPS_NOT_PUSH}
+                   exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,p.location.register,href)));
+{$else TEMPS_NOT_PUSH}
+                   exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,p.location.register)));
+{$endif TEMPS_NOT_PUSH}
+                   ungetregister32(p.location.register);
+                end
+              else if (p.location.loc in [LOC_MEM,LOC_REFERENCE]) and
+                      ((p.location.reference.base<>R_NO) or
+                       (p.location.reference.index<>R_NO)
+                      ) then
+                  begin
+                     del_reference(p.location.reference);
+                     getexplicitregister32(R_EDI);
+                     emit_ref_reg(A_LEA,S_L,newreference(p^.location.reference),R_EDI);
+{$ifdef TEMPS_NOT_PUSH}
+                     gettempofsizereference(href,4);
+                     exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,href)));
+                     p^.temp_offset:=href.offset;
+{$else TEMPS_NOT_PUSH}
+                     exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
+{$endif TEMPS_NOT_PUSH}
+                     ungetregister32(R_EDI);
+                     pushed:=true;
+                  end
+              else pushed:=false;
+           end
+         else pushed:=false;
+         maybe_push:=pushed;
+      end;
+
+{$else CG11}
+
     function maybe_push(needed : byte;p : ptree;isint64 : boolean) : boolean;
       var
          pushed : boolean;
@@ -1190,9 +1192,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                       ) then
                   begin
                      del_reference(p^.location.reference);
-{$ifndef noAllocEdi}
-                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
+                     getexplicitregister32(R_EDI);
                      emit_ref_reg(A_LEA,S_L,newreference(p^.location.reference),
                        R_EDI);
 {$ifdef TEMPS_NOT_PUSH}
@@ -1202,9 +1202,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 {$else TEMPS_NOT_PUSH}
                      exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
 {$endif TEMPS_NOT_PUSH}
-{$ifndef noAllocEdi}
                      ungetregister32(R_EDI);
-{$endif noAllocEdi}
                      pushed:=true;
                   end
               else pushed:=false;
@@ -1212,6 +1210,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          else pushed:=false;
          maybe_push:=pushed;
       end;
+{$endif CG11}
 
 {$ifdef TEMPS_NOT_PUSH}
     function maybe_savetotemp(needed : byte;p : ptree;isint64 : boolean) : boolean;
@@ -1249,16 +1248,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                       ) then
                   begin
                      del_reference(p^.location.reference);
-{$ifndef noAllocEdi}
                      getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                      emit_ref_reg(A_LEA,S_L,newreference(p^.location.reference),
                        R_EDI);
                      gettempofsizereference(href,4);
                      exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,href)));
-{$ifndef noAllocEdi}
                      ungetregister32(R_EDI);
-{$endif noAllocEdi}
                      p^.temp_offset:=href.offset;
                      pushed:=true;
                   end
@@ -1277,14 +1272,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
             not(cs_littlesize in aktglobalswitches)
            Then
              begin
-{$ifndef noAllocEdi}
                getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                emit_reg_reg(A_XOR,S_L,R_EDI,R_EDI);
                exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
-{$ifndef noAllocEdi}
                ungetregister32(R_EDI);
-{$endif noAllocEdi}
              end
            else
              exprasmlist^.concat(new(paicpu,op_const(A_PUSH,S_L,l)));
@@ -1301,14 +1292,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                 not(cs_littlesize in aktglobalswitches)
                then
                  begin
-{$ifndef noAllocEdi}
                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                    emit_ref_reg(A_MOV,S_L,newreference(ref),R_EDI);
                    exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
-{$ifndef noAllocEdi}
                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                  end
                else exprasmlist^.concat(new(paicpu,op_ref(A_PUSH,S_L,newreference(ref))));
            end;
@@ -1343,14 +1330,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                 exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,ref.base)))
               else
                 begin
-{$ifndef noAllocEdi}
                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                    emit_ref_reg(A_LEA,S_L,newreference(ref),R_EDI);
                    exprasmlist^.concat(new(paicpu,op_reg(A_PUSH,S_L,R_EDI)));
-{$ifndef noAllocEdi}
                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                 end;
            end;
         end;
@@ -1656,25 +1639,19 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                inc(pushedparasize,8);
                                if inlined then
                                  begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    inc(tempreference.offset,4);
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize+4);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                  end
                                else
                                  begin
@@ -1688,16 +1665,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                inc(pushedparasize,4);
                                if inlined then
                                  begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                  end
                                else
                                  emit_push_mem(tempreference);
@@ -1717,16 +1690,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                 end;
                                if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                   getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                   emit_ref_reg(A_MOV,opsize,
                                     newreference(tempreference),hreg);
                                   r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                   exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,opsize,hreg,r)));
-{$ifndef noAllocEdi}
                                   ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                                else
                                 emit_push_mem_size(tempreference,p^.resulttype^.size);
@@ -1744,16 +1713,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                inc(pushedparasize,4);
                                if inlined then
                                  begin
-{$ifndef noAllocEdi}
                                     getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                     emit_ref_reg(A_MOV,S_L,
                                       newreference(tempreference),R_EDI);
                                     r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                     exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                     ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                  end
                                else
                                  emit_push_mem(tempreference);
@@ -1765,16 +1730,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                               inc(tempreference.offset,4);
                               if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                               else
                                 emit_push_mem(tempreference);
@@ -1782,16 +1743,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                               dec(tempreference.offset,4);
                               if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                               else
                                 emit_push_mem(tempreference);
@@ -1805,16 +1762,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                 inc(tempreference.offset,6);
                               if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                               else
                                 emit_push_mem(tempreference);
@@ -1822,16 +1775,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                               inc(pushedparasize,4);
                               if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,S_L,
                                      newreference(tempreference),R_EDI);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                               else
                                 emit_push_mem(tempreference);
@@ -1851,16 +1800,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                 end;
                               if inlined then
                                 begin
-{$ifndef noAllocEdi}
                                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                    emit_ref_reg(A_MOV,opsize,
                                      newreference(tempreference),hreg);
                                    r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                                    exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,opsize,hreg,r)));
-{$ifndef noAllocEdi}
                                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                 end
                               else
                                 exprasmlist^.concat(new(paicpu,op_ref(A_PUSH,opsize,
@@ -1875,16 +1820,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                          inc(pushedparasize,4);
                          if inlined then
                            begin
-{$ifndef noAllocEdi}
                               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                               emit_ref_reg(A_MOV,S_L,
                                 newreference(tempreference),R_EDI);
                               r:=new_reference(procinfo^.framepointer,para_offset-pushedparasize);
                               exprasmlist^.concat(new(paicpu,op_reg_ref(A_MOV,S_L,R_EDI,r)));
-{$ifndef noAllocEdi}
                               ungetregister32(R_EDI);
-{$endif noAllocEdi}
                            end
                          else
                            emit_push_mem(tempreference);
@@ -1991,9 +1932,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                begin
                   if not(R_EAX in unused) then
                     begin
-{$ifndef noAllocEdi}
                       getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                       emit_reg_reg(A_MOV,S_L,R_EAX,R_EDI);
                     end;
                   emit_flag2reg(p^.location.resflags,R_AL);
@@ -2020,9 +1959,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                   if not(R_EAX in unused) then
                     begin
                       emit_reg_reg(A_MOV,S_L,R_EDI,R_EAX);
-{$ifndef noAllocEdi}
                       ungetregister32(R_EDI);
-{$endif noAllocEdi}
                     end;
                end;
 {$ifdef SUPPORT_MMX}
@@ -2328,27 +2265,19 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               emitjmp(C_L,neglabel);
             end;
            { insert bound instruction only }
-{$ifndef noAllocEdi}
            getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
            exprasmlist^.concat(new(paicpu,op_sym_ofs_reg(A_MOV,S_L,newasmsymbol(rstr),0,R_EDI)));
            emitcall('FPC_BOUNDCHECK');
-{$ifndef noAllocEdi}
            ungetregister32(R_EDI);
-{$endif noAllocEdi}
            { u32bit needs 2 checks }
            if doublebound then
             begin
               emitjmp(C_None,poslabel);
               emitlab(neglabel);
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               exprasmlist^.concat(new(paicpu,op_sym_ofs_reg(A_MOV,S_L,newasmsymbol(rstr),8,R_EDI)));
               emitcall('FPC_BOUNDCHECK');
-{$ifndef noAllocEdi}
               ungetregister32(R_EDI);
-{$endif noAllocEdi}
               emitlab(poslabel);
             end;
            if popecx then
@@ -2367,18 +2296,14 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                hreg:=p^.location.register
               else
                begin
-{$ifndef noAllocEdi}
                  getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                  emit_reg_reg(op,opsize,p^.location.register,R_EDI);
                  hreg:=R_EDI;
                end;
             end
            else
             begin
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               emit_ref_reg(op,opsize,newreference(p^.location.reference),R_EDI);
               hreg:=R_EDI;
             end;
@@ -2400,10 +2325,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               exprasmlist^.concat(new(paicpu,op_reg_ref(A_BOUND,S_L,hreg,newreference(href))));
               emitlab(poslabel);
             end;
-{$ifndef noAllocEdi}
            if hreg = R_EDI then
              ungetregister32(R_EDI);
-{$endif noAllocEdi}
          end;
       end;
 
@@ -2441,9 +2364,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
              (not(cs_littlesize in aktglobalswitches ) and (size<=12))) then
            begin
               helpsize:=size shr 2;
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               for i:=1 to helpsize do
                 begin
                    emit_ref_reg(A_MOV,S_L,newreference(source),R_EDI);
@@ -2468,9 +2389,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    inc(dest.offset,2);
                    dec(size,2);
                 end;
-{$ifndef noAllocEdi}
               ungetregister32(R_EDI);
-{$endif noAllocEdi}
               if size>0 then
                 begin
                    { and now look for an 8 bit register }
@@ -2503,9 +2422,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    if swap then
                      { was earlier XCHG, of course nonsense }
                      begin
-{$ifndef noAllocEdi}
                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                        emit_reg_reg(A_MOV,S_L,reg32,R_EDI);
                      end;
                    emit_ref_reg(A_MOV,S_B,newreference(source),reg8);
@@ -2517,9 +2434,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    if swap then
                      begin
                        emit_reg_reg(A_MOV,S_L,R_EDI,reg32);
-{$ifndef noAllocEdi}
                        ungetregister32(R_EDI);
-{$endif noAllocEdi}
                      end
                    else
                      ungetregister(reg8);
@@ -2527,17 +2442,13 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
            end
          else
            begin
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               emit_ref_reg(A_LEA,S_L,newreference(dest),R_EDI);
 {$ifdef regallocfix}
              {is this ok?? (JM)}
               del_reference(dest);
 {$endif regallocfix}
-{$ifndef noAllocEdi}
               exprasmlist^.concat(new(pairegalloc,alloc(R_ESI)));
-{$endif noAllocEdi}
               if loadref then
                 emit_ref_reg(A_MOV,S_L,newreference(source),R_ESI)
               else
@@ -2578,10 +2489,8 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    if size=1 then
                      exprasmlist^.concat(new(paicpu,op_none(A_MOVSB,S_NO)));
                 end;
-{$ifndef noAllocEdi}
               ungetregister32(R_EDI);
               exprasmlist^.concat(new(pairegalloc,dealloc(R_ESI)));
-{$endif noAllocEdi}
               if ecxpushed then
                 exprasmlist^.concat(new(paicpu,op_reg(A_POP,S_L,R_ECX)))
               else
@@ -2668,9 +2577,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       begin
          if assigned(procinfo^._class) then
            begin
-{$ifndef noAllocEdi}
               exprasmlist^.concat(new(pairegalloc,alloc(R_ESI)));
-{$endif noAllocEdi}
               if lexlevel>normal_function_level then
                 begin
                    new(hp);
@@ -3008,9 +2915,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               reset_reference(r^);
               r^.base:=procinfo^.framepointer;
               r^.offset:=pvarsym(p)^.address+4+procinfo^.para_offset;
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               exprasmlist^.concat(new(paicpu,
                 op_ref_reg(A_MOV,S_L,r,R_EDI)));
 
@@ -3050,17 +2955,13 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    emitlab(ok);
                    exprasmlist^.concat(new(paicpu,
                      op_reg_reg(A_SUB,S_L,R_EDI,R_ESP)));
-{$ifndef noAllocEdi}
                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                    { now reload EDI }
                    new(r);
                    reset_reference(r^);
                    r^.base:=procinfo^.framepointer;
                    r^.offset:=pvarsym(p)^.address+4+procinfo^.para_offset;
-{$ifndef noAllocEdi}
                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                    exprasmlist^.concat(new(paicpu,
                      op_ref_reg(A_MOV,S_L,r,R_EDI)));
 
@@ -3142,9 +3043,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                 S_W : exprasmlist^.concat(new(paicpu,op_none(A_MOVSW,S_NO)));
                 S_L : exprasmlist^.concat(new(paicpu,op_none(A_MOVSD,S_NO)));
               end;
-{$ifndef noAllocEdi}
               ungetregister32(R_EDI);
-{$endif noAllocEdi}
               exprasmlist^.concat(new(paicpu,
                 op_reg(A_POP,S_L,R_ESI)));
               exprasmlist^.concat(new(paicpu,
@@ -3324,9 +3223,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
             begin
               exprasmlist^.insert(new(paicpu,op_cond_sym(A_Jcc,C_Z,S_NO,faillabel)));
               emitinsertcall('FPC_HELP_CONSTRUCTOR');
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               exprasmlist^.insert(new(paicpu,op_const_reg(A_MOV,S_L,procinfo^._class^.vmt_offset,R_EDI)));
             end;
         end;
@@ -3349,9 +3246,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
            hr^.offset:=procinfo^.selfpointer_offset;
            hr^.base:=procinfo^.framepointer;
            exprasmlist^.insert(new(paicpu,op_ref_reg(A_MOV,S_L,hr,R_ESI)));
-{$ifndef noAllocEdi}
            exprasmlist^.insert(new(pairegalloc,alloc(R_ESI)));
-{$endif noAllocEdi}
         end;
       { should we save edi,esi,ebx like C ? }
       if (po_savestdregs in aktprocsym^.definition^.procoptions) then
@@ -3438,9 +3333,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                   else
                                     begin
                                        getlabel(again);
-{$ifndef noAllocEdi}
                                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                        exprasmlist^.concat(new(paicpu,
                                          op_const_reg(A_MOV,S_L,stackframe div winstackpagesize,R_EDI)));
                                        emitlab(again);
@@ -3451,9 +3344,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                                        exprasmlist^.concat(new(paicpu,
                                          op_reg(A_DEC,S_L,R_EDI)));
                                        emitjmp(C_NZ,again);
-{$ifndef noAllocEdi}
                                        ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                        exprasmlist^.concat(new(paicpu,
                                          op_const_reg(A_SUB,S_L,stackframe mod winstackpagesize,R_ESP)));
                                     end
@@ -3693,9 +3584,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
           else
             begin
               emitinsertcall('FPC_HELP_DESTRUCTOR');
-{$ifndef noAllocEdi}
               getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
               exprasmlist^.insert(new(paicpu,op_const_reg(A_MOV,S_L,procinfo^._class^.vmt_offset,R_EDI)));
               { must the object be finalized ? }
               if procinfo^._class^.needs_inittable then
@@ -3703,9 +3592,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    getlabel(nofinal);
                    exprasmlist^.insert(new(pai_label,init(nofinal)));
                    emitinsertcall('FPC_FINALIZE');
-{$ifndef noAllocEdi}
                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                    exprasmlist^.insert(new(paicpu,op_reg(A_PUSH,S_L,R_ESI)));
                    exprasmlist^.insert(new(paicpu,op_sym(A_PUSH,S_L,procinfo^._class^.get_inittable_label)));
                    ai:=new(paicpu,op_sym(A_Jcc,S_NO,nofinal));
@@ -3840,14 +3727,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                   else
                     begin
                       emit_ref_reg(A_MOV,S_L,new_reference(procinfo^.framepointer,12),R_ESI);
-{$ifndef noAllocEdi}
                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                       emit_const_reg(A_MOV,S_L,procinfo^._class^.vmt_offset,R_EDI);
                       emitcall('FPC_HELP_FAIL');
-{$ifndef noAllocEdi}
                       ungetregister32(R_EDI);
-{$endif noAllocEdi}
                     end;
                   emitlab(okexitlabel);
 
@@ -4083,7 +3966,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.15  2000-09-24 15:06:12  peter
+  Revision 1.16  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.15  2000/09/24 15:06:12  peter
     * use defines.inc
 
   Revision 1.14  2000/09/16 12:22:52  peter

+ 5 - 41
compiler/n386add.pas

@@ -1167,9 +1167,7 @@ interface
                            popedx:=true;
                           end;
                          { left.location can be R_EAX !!! }
-{$ifndef noAllocEdi}
                          getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                          { load the left value }
                          emitloadord2reg(left.location,u32bitdef,R_EDI,true);
                          release_loc(left.location);
@@ -1182,18 +1180,14 @@ interface
                          { allocate EAX if it isn't yet allocated (JM) }
                          if (R_EAX in unused) then
                            exprasmlist^.concat(new(pairegalloc,alloc(R_EAX)));
-{$ifndef noAllocEdi}
                          { also allocate EDX, since it is also modified by }
                          { a mul (JM)                                      }
                          if R_EDX in unused then
                            exprasmlist^.concat(new(pairegalloc,alloc(R_EDX)));
-{$endif noAllocEdi}
                          emit_reg(A_MUL,S_L,R_EDI);
-{$ifndef noAllocEdi}
                          ungetregister32(R_EDI);
                          if R_EDX in unused then
                            exprasmlist^.concat(new(pairegalloc,dealloc(R_EDX)));
-{$endif noAllocEdi}
                          if R_EAX in unused then
                            exprasmlist^.concat(new(pairegalloc,dealloc(R_EAX)));
                          location.register := getregister32;
@@ -1293,31 +1287,22 @@ interface
                                begin
                                   if extra_not then
                                     emit_reg(A_NOT,opsize,location.register);
-{$ifndef noAllocEdi}
                                   getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                   emit_reg_reg(A_MOV,opsize,right.location.register,R_EDI);
                                   emit_reg_reg(op,opsize,location.register,R_EDI);
                                   emit_reg_reg(A_MOV,opsize,R_EDI,location.register);
-{$ifndef noAllocEdi}
                                   ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                end
                              else
                                begin
                                   if extra_not then
                                     emit_reg(A_NOT,opsize,location.register);
-
-{$ifndef noAllocEdi}
                                   getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                   emit_ref_reg(A_MOV,opsize,
                                     newreference(right.location.reference),R_EDI);
                                   emit_reg_reg(op,opsize,location.register,R_EDI);
                                   emit_reg_reg(A_MOV,opsize,R_EDI,location.register);
-{$ifndef noAllocEdi}
                                   ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                   ungetiftemp(right.location.reference);
                                   del_reference(right.location.reference);
                                end;
@@ -1361,16 +1346,12 @@ interface
                                     begin
                                        if extra_not then
                                          begin
-{$ifndef noAllocEdi}
                                             getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                             emit_reg_reg(A_MOV,S_L,right.location.register,R_EDI);
                                             emit_reg(A_NOT,S_L,R_EDI);
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                               location.register);
-{$ifndef noAllocEdi}
                                             ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                          end
                                        else
                                          begin
@@ -1382,17 +1363,13 @@ interface
                                     begin
                                        if extra_not then
                                          begin
-{$ifndef noAllocEdi}
                                             getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                             emit_ref_reg(A_MOV,S_L,newreference(
                                               right.location.reference),R_EDI);
                                             emit_reg(A_NOT,S_L,R_EDI);
                                             emit_reg_reg(A_AND,S_L,R_EDI,
                                               location.register);
-{$ifndef noAllocEdi}
                                             ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                          end
                                        else
                                          begin
@@ -1776,37 +1753,27 @@ interface
                                begin
                                   if right.location.loc=LOC_CREGISTER then
                                     begin
-{$ifndef noAllocEdi}
                                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                        emit_reg_reg(A_MOV,opsize,right.location.register,R_EDI);
                                        emit_reg_reg(op,opsize,location.register,R_EDI);
                                        emit_reg_reg(A_MOV,opsize,R_EDI,location.register);
-{$ifndef noAllocEdi}
                                        ungetregister32(R_EDI);
                                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                        emit_reg_reg(A_MOV,opsize,right.location.registerhigh,R_EDI);
                                        { the carry flag is still ok }
                                        emit_reg_reg(op2,opsize,location.registerhigh,R_EDI);
                                        emit_reg_reg(A_MOV,opsize,R_EDI,location.registerhigh);
-{$ifndef noAllocEdi}
                                        ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                     end
                                   else
                                     begin
-{$ifndef noAllocEdi}
                                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                        emit_ref_reg(A_MOV,opsize,
                                          newreference(right.location.reference),R_EDI);
                                        emit_reg_reg(op,opsize,location.registerlow,R_EDI);
                                        emit_reg_reg(A_MOV,opsize,R_EDI,location.registerlow);
-{$ifndef noAllocEdi}
                                        ungetregister32(R_EDI);
                                        getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                        hr:=newreference(right.location.reference);
                                        inc(hr^.offset,4);
                                        emit_ref_reg(A_MOV,opsize,
@@ -1815,9 +1782,7 @@ interface
                                        emit_reg_reg(op2,opsize,location.registerhigh,R_EDI);
                                        emit_reg_reg(A_MOV,opsize,R_EDI,
                                          location.registerhigh);
-{$ifndef noAllocEdi}
                                        ungetregister32(R_EDI);
-{$endif noAllocEdi}
                                        ungetiftemp(right.location.reference);
                                        del_reference(right.location.reference);
                                     end;
@@ -2067,9 +2032,7 @@ interface
                      begin
                        if not(R_EAX in unused) then
                          begin
-{$ifndef noAllocEdi}
                            getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                            emit_reg_reg(A_MOV,S_L,R_EAX,R_EDI);
                          end;
                        emit_reg(A_FNSTSW,S_NO,R_AX);
@@ -2077,9 +2040,7 @@ interface
                        if not(R_EAX in unused) then
                          begin
                            emit_reg_reg(A_MOV,S_L,R_EDI,R_EAX);
-{$ifndef noAllocEdi}
                            ungetregister32(R_EDI);
-{$endif noAllocEdi}
                          end;
                        if swaped then
                         begin
@@ -2326,7 +2287,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.4  2000-09-24 15:06:18  peter
+  Revision 1.5  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.4  2000/09/24 15:06:18  peter
     * use defines.inc
 
   Revision 1.3  2000/09/22 22:42:52  florian
@@ -2340,4 +2304,4 @@ end.
 
   Revision 1.1  2000/09/20 21:23:32  florian
     * initial revision
-}
+}

+ 5 - 17
compiler/n386mat.pas

@@ -161,9 +161,7 @@ implementation
                               end
                             else
                               begin
-{$ifndef noAllocEdi}
                                 getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                                 hreg2 := R_EDI;
                                 emit_reg_reg(A_MOV,S_L,hreg1,R_EDI);
                               { if the left value is signed, R_EDI := $ffffffff,
@@ -175,13 +173,8 @@ implementation
                           { add to the left value }
                             emit_reg_reg(A_ADD,S_L,hreg2,hreg1);
                           { release EDX if we used it }
-{$ifndef noAllocEdi}
                           { also releas EDI }
                           ungetregister32(hreg2);
-{$else noAllocEdi}
-                          if (hreg2 = R_EDX) then
-                            ungetregister32(hreg2);
-{$endif noAllocEdi}
                           { do the shift }
                             emit_const_reg(A_SAR,S_L,power,hreg1);
                           end
@@ -216,9 +209,7 @@ implementation
                       { EDI is always free, it's }
                       { only used for temporary  }
                       { purposes              }
-{$ifndef noAllocEdi}
                    getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                    if (right.location.loc<>LOC_REGISTER) and
                       (right.location.loc<>LOC_CREGISTER) then
                      begin
@@ -270,9 +261,7 @@ implementation
                      emit_reg(A_DIV,S_L,R_EDI)
                    else
                      emit_reg(A_IDIV,S_L,R_EDI);
-{$ifndef noAllocEdi}
                    ungetregister32(R_EDI);
-{$endif noAllocEdi}
                    if treetype=divn then
                      begin
                         { if result register is busy then copy }
@@ -893,9 +882,7 @@ implementation
              secondpass(left);
              location.loc:=LOC_MMXREGISTER;
              { prepare EDI }
-{$ifndef noAllocEdi}
              getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
              emit_const_reg(A_MOV,S_L,$ffffffff,R_EDI);
              { load operand }
              case left.location.loc of
@@ -916,9 +903,7 @@ implementation
              end;
              { load mask }
              emit_reg_reg(A_MOVD,S_NO,R_EDI,R_MM7);
-{$ifndef noAllocEdi}
              ungetregister32(R_EDI);
-{$endif noAllocEdi}
              { lower 32 bit }
              emit_reg_reg(A_PXOR,S_D,R_MM7,location.register);
              { shift mask }
@@ -1000,10 +985,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.2  2000-09-24 15:06:18  peter
+  Revision 1.3  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.2  2000/09/24 15:06:18  peter
     * use defines.inc
 
   Revision 1.1  2000/09/22 22:24:37  florian
     * initial revision
 
-}
+}

+ 4 - 7
compiler/n386set.pas

@@ -381,9 +381,7 @@ implementation
                       { the set element isn't never samller than a byte  }
                       { and because it's a small set we need only 5 bits }
                       { but 8 bits are easier to load               }
-{$ifndef noAllocEdi}
                       getexplicitregister32(R_EDI);
-{$endif noAllocEdi}
                       emit_ref_reg(A_MOVZX,S_BL,
                         newreference(left.location.reference),R_EDI);
                       hr:=R_EDI;
@@ -417,12 +415,8 @@ implementation
                           newreference(right.location.reference));
                     end;
                   end;
-{$ifndef noAllocEdi}
                   { simply to indicate EDI is deallocated here too (JM) }
                   ungetregister32(hr);
-{$else noAllocEdi}
-                  ungetregister32(hr);
-{$endif noAllocEdi}
                   location.loc:=LOC_FLAGS;
                   location.resflags:=F_C;
                 end;
@@ -1066,7 +1060,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.2  2000-09-24 20:17:44  florian
+  Revision 1.3  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.2  2000/09/24 20:17:44  florian
     * more conversion work done
 
   Revision 1.1  2000/09/24 19:38:39  florian

+ 6 - 5
compiler/nadd.pas

@@ -57,9 +57,7 @@ implementation
       hcodegen,
 {$endif newcg}
       htypechk,pass_1,
-      cpubase,ncnv,ncal,nld,
-      ncon,nmat,nset
-      ;
+      cpubase;
 
     function isbinaryoverloaded(var p : tbinarynode) : boolean;
 
@@ -1104,7 +1102,7 @@ implementation
                   CGMessage(type_e_mismatch);
               end;
               location.loc:=LOC_MMXREGISTER;
-              calcregisters(p,0,0,1);
+              calcregisters(self,0,0,1);
               convdone:=true;
             end
           else
@@ -1316,7 +1314,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.10  2000-09-28 19:49:52  florian
+  Revision 1.11  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.10  2000/09/28 19:49:52  florian
   *** empty log message ***
 
   Revision 1.9  2000/09/27 21:33:22  florian

+ 6 - 3
compiler/node.pas

@@ -35,15 +35,18 @@ interface
 implementation
 
     uses
-       htypechk,ncal,hcodegen,verbose,nmat,
-       pass_1,nld,symconst,cutils;
+       htypechk,hcodegen,verbose,
+       pass_1,symconst,cutils;
 
     {$I node.inc}
 
 end.
 {
   $Log$
-  Revision 1.6  2000-09-28 19:49:52  florian
+  Revision 1.7  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.6  2000/09/28 19:49:52  florian
   *** empty log message ***
 
   Revision 1.5  2000/09/27 18:14:31  florian

+ 5 - 2
compiler/pass_1.pas

@@ -425,7 +425,7 @@ implementation
       globtype,systems,
       cutils,cobjects,verbose,globals,
       aasm,symtable,types,
-      htypechk,nflw,
+      htypechk,
       cpubase,cpuasm
 {$ifdef newcg}
       ,cgbase
@@ -741,7 +741,10 @@ end.
 {$endif cg11}
 {
   $Log$
-  Revision 1.6  2000-09-28 19:49:52  florian
+  Revision 1.7  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.6  2000/09/28 19:49:52  florian
   *** empty log message ***
 
   Revision 1.5  2000/09/24 21:15:34  florian

+ 97 - 0
compiler/ppc.dof

@@ -0,0 +1,97 @@
+[Compiler]
+A=1
+B=0
+C=0
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=0
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=0
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=VCL50;VCLX50;VCLSMP50;VCLDB50;VCLADO50;ibevnt50;VCLBDE50;VCLDBX50;QRPT50;TEEUI50;TEEDB50;TEE50;DSS50;TEEQR50;VCLIB50;VCLMID50;VCLIE50;INETDB50;INET50;NMFAST50;WEBMID50;dclocx50;dclaxserver50
+Conditionals=delphi i386 gdb support_mmx
+DebugSourceDirs=
+UsePackages=0
+
+[Parameters]
+RunParams=
+HostApplication=
+
+[Language]
+ActiveLang=
+ProjectLang=$00000413
+RootDir=
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1043
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlConditionals]
+Count=2
+Item0=delphi i386 gdb support_mmx
+Item1=delphi
+
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;

+ 8 - 3
compiler/regvars.pas

@@ -26,7 +26,9 @@ unit regvars;
 
 interface
 
-uses aasm, tree;
+uses
+  aasm,
+  tree;
 
 procedure assign_regvars(var p: ptree);
 procedure load_regvars(asml: paasmoutput; p: ptree);
@@ -481,7 +483,10 @@ end.
 
 {
   $Log$
-  Revision 1.7  2000-09-30 13:08:16  jonas
+  Revision 1.8  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.7  2000/09/30 13:08:16  jonas
     * regvars are now zeroed at the start of their life if they contain an 8
       or 16bit var/parameter, because the full 32bits are used if they are
       necessary for a btrl instruction
@@ -514,4 +519,4 @@ end.
         * deallocate the regvars of the caller in secondprocinline before
           inlining the called procedure and reallocate them afterwards
 
-}
+}

+ 7 - 3
compiler/temp_gen.pas

@@ -27,7 +27,8 @@ unit temp_gen;
 interface
 
     uses
-      cpubase,cpuinfo,cobjects,globals,tree,hcodegen,verbose,fmodule,aasm;
+      cpubase,cpuinfo,cobjects,globals,
+      hcodegen,verbose,fmodule,aasm;
 
     type
       ttemptype = (tt_none,tt_free,tt_normal,tt_persistant,tt_ansistring,tt_freeansistring,tt_widestring,tt_freewidestring);
@@ -541,7 +542,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.4  2000-09-24 15:06:31  peter
+  Revision 1.5  2000-09-30 16:08:45  peter
+    * more cg11 updates
+
+  Revision 1.4  2000/09/24 15:06:31  peter
     * use defines.inc
 
   Revision 1.3  2000/08/27 16:11:55  peter
@@ -551,4 +555,4 @@ end.
   Revision 1.2  2000/07/13 11:32:52  michael
   + removed logs
 
-}
+}

+ 14 - 5
compiler/tgeni386.pas

@@ -27,7 +27,13 @@ unit tgeni386;
 interface
 
     uses
-       cobjects,globals,tree,hcodegen,verbose,aasm,
+       cobjects,globals,
+       hcodegen,verbose,aasm,
+{$ifdef CG11}
+       node,
+{$else}
+       tree,
+{$endif}
        cpubase,cpuasm
        ;
 
@@ -90,11 +96,11 @@ interface
 {$ifdef SUPPORT_MMX}
        regvar_longintarray = array[R_EAX..R_MM6] of longint;
        regvar_booleanarray = array[R_EAX..R_MM6] of boolean;
-       regvar_ptreearray = array[R_EAX..R_MM6] of ptree;
+       regvar_ptreearray = array[R_EAX..R_MM6] of {$ifdef CG11}tnode{$else}ptree{$endif};
 {$else SUPPORT_MMX}
        regvar_longintarray = array[R_EAX..R_EDI] of longint;
        regvar_booleanarray = array[R_EAX..R_EDI] of boolean;
-       regvar_ptreearray = array[R_EAX..R_EDI] of ptree;
+       regvar_ptreearray = array[R_EAX..R_EDI] of {$ifdef CG11}tnode{$else}ptree{$endif};
 {$endif SUPPORT_MMX}
 
     var
@@ -651,7 +657,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.6  2000-09-24 15:06:32  peter
+  Revision 1.7  2000-09-30 16:08:46  peter
+    * more cg11 updates
+
+  Revision 1.6  2000/09/24 15:06:32  peter
     * use defines.inc
 
   Revision 1.5  2000/08/27 16:11:55  peter
@@ -667,4 +676,4 @@ end.
   Revision 1.2  2000/07/13 11:32:52  michael
   + removed logs
 
-}
+}

+ 11 - 3
compiler/types.pas

@@ -192,7 +192,12 @@ implementation
 
     uses
        globtype,globals,htypechk,
-       tree,verbose,symconst;
+{$ifdef CG11}
+       node,
+{$else}
+       tree,
+{$endif}
+       verbose,symconst;
 
     var
        b_needs_init_final : boolean;
@@ -1143,7 +1148,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.11  2000-09-24 15:06:32  peter
+  Revision 1.12  2000-09-30 16:08:46  peter
+    * more cg11 updates
+
+  Revision 1.11  2000/09/24 15:06:32  peter
     * use defines.inc
 
   Revision 1.10  2000/09/18 12:31:15  jonas
@@ -1173,4 +1181,4 @@ end.
   Revision 1.2  2000/07/13 11:32:53  michael
   + removed logs
 
-}
+}