Pārlūkot izejas kodu

* problem with -Or fixed

florian 27 gadi atpakaļ
vecāks
revīzija
28fd9c1421
2 mainītis faili ar 50 papildinājumiem un 35 dzēšanām
  1. 44 31
      compiler/cg386ld.pas
  2. 6 4
      compiler/pass_1.pas

+ 44 - 31
compiler/cg386ld.pas

@@ -180,36 +180,6 @@ implementation
                                           pvarsym(p^.symtableentry)^.address;
                                      end;
                                 end;
-                              { in case call by reference, then calculate: }
-                              if (pvarsym(p^.symtableentry)^.varspez=vs_var) or
-                                 ((pvarsym(p^.symtableentry)^.varspez=vs_const) and
-                                  dont_copy_const_param(pvarsym(p^.symtableentry)^.definition)) or
-                                  { call by value open arrays are also indirect addressed }
-                                  is_open_array(pvarsym(p^.symtableentry)^.definition) then
-                                begin
-                                   simple_loadn:=false;
-                                   if hregister=R_NO then
-                                     hregister:=getregister32;
-                                   if is_open_array(pvarsym(p^.symtableentry)^.definition) then
-                                     begin
-                                        if (p^.location.reference.base=procinfo.framepointer) then
-                                          begin
-                                             highframepointer:=p^.location.reference.base;
-                                             highoffset:=p^.location.reference.offset;
-                                          end
-                                        else
-                                          begin
-                                             highframepointer:=R_EDI;
-                                             highoffset:=p^.location.reference.offset;
-                                             exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
-                                               p^.location.reference.base,R_EDI)));
-                                          end;
-                                     end;
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,newreference(p^.location.reference),
-                                     hregister)));
-                                   clear_reference(p^.location.reference);
-                                   p^.location.reference.base:=hregister;
-                               end;
                               {
                               if (pvarsym(p^.symtableentry)^.definition^.deftype=objectdef) and
                                 ((pobjectdef(pvarsym(p^.symtableentry)^.definition)^.options and oois_class)<>0) then
@@ -224,6 +194,46 @@ implementation
                                 end;
                               }
                            end;
+                         { in case call by reference, then calculate: }
+                         if (pvarsym(p^.symtableentry)^.varspez=vs_var) or
+                            ((pvarsym(p^.symtableentry)^.varspez=vs_const) and
+                             dont_copy_const_param(pvarsym(p^.symtableentry)^.definition)) or
+                             { call by value open arrays are also indirect addressed }
+                             is_open_array(pvarsym(p^.symtableentry)^.definition) then
+                           begin
+                              simple_loadn:=false;
+                              if hregister=R_NO then
+                                hregister:=getregister32;
+                              if is_open_array(pvarsym(p^.symtableentry)^.definition) then
+                                begin
+                                   if (p^.location.reference.base=procinfo.framepointer) then
+                                     begin
+                                        highframepointer:=p^.location.reference.base;
+                                        highoffset:=p^.location.reference.offset;
+                                     end
+                                   else
+                                     begin
+                                        highframepointer:=R_EDI;
+                                        highoffset:=p^.location.reference.offset;
+                                        exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
+                                          p^.location.reference.base,R_EDI)));
+                                     end;
+                                end;
+                              if p^.location.loc=LOC_CREGISTER then
+                                begin
+                                   exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,S_L,
+                                     p^.location.register,hregister)));
+                                   p^.location.loc:=LOC_REFERENCE;
+                                end
+                              else
+                                begin
+                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                     newreference(p^.location.reference),
+                                     hregister)));
+                                end;
+                              clear_reference(p^.location.reference);
+                              p^.location.reference.base:=hregister;
+                          end;
                       end;
                  end;
               procsym:
@@ -555,7 +565,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.11  1998-09-03 16:03:14  florian
+  Revision 1.12  1998-09-04 11:55:17  florian
+    * problem with -Or fixed
+
+  Revision 1.11  1998/09/03 16:03:14  florian
     + rtti generation
     * init table generation changed
 

+ 6 - 4
compiler/pass_1.pas

@@ -601,9 +601,8 @@ unit pass_1;
                         if (p^.symtable^.symtablelevel)>0 then
                           begin
                              p^.registers32:=1;
-                             { auáerdem kann sie nicht mehr in ein Register
-                               geladen werden }
-                             pvarsym(p^.symtableentry)^.var_options :=
+                             { further, the variable can't be put into a register }
+                             pvarsym(p^.symtableentry)^.var_options:=
                                pvarsym(p^.symtableentry)^.var_options and not vo_regable;
                           end;
                      end;
@@ -5411,7 +5410,10 @@ unit pass_1;
 end.
 {
   $Log$
-  Revision 1.70  1998-09-04 08:42:00  peter
+  Revision 1.71  1998-09-04 11:55:18  florian
+    * problem with -Or fixed
+
+  Revision 1.70  1998/09/04 08:42:00  peter
     * updated some error messages
 
   Revision 1.69  1998/09/01 17:39:47  peter