Browse Source

* some fixes to get -Or work:
- inc/dec didn't take care of CREGISTER
- register calculcation of inc/dec was wrong
- var/const parameters get now assigned 32 bit register, but
const parameters only if they are passed by reference !

florian 27 years ago
parent
commit
b74af9c243
4 changed files with 68 additions and 13 deletions
  1. 31 7
      compiler/cg386inl.pas
  2. 21 4
      compiler/cgi386.pas
  3. 1 1
      compiler/mppc386.bat
  4. 15 1
      compiler/pass_1.pas

+ 31 - 7
compiler/cg386inl.pas

@@ -767,6 +767,7 @@ implementation
                   LOC_CREGISTER : hregister:=p^.left^.right^.left^.location.register;
                         LOC_MEM,
                   LOC_REFERENCE : begin
+                                    del_reference(p^.left^.right^.left^.location.reference);
                                     hregister:=getregister32;
                                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                                       newreference(p^.left^.right^.left^.location.reference),hregister)));
@@ -785,16 +786,32 @@ implementation
                 if addconstant then
                  begin
                    if (addvalue=1) and not(cs_check_overflow in aktlocalswitches) then
-                    exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
-                      newreference(p^.left^.left^.location.reference))))
+                     begin
+                        if p^.left^.left^.location.loc=LOC_CREGISTER then
+                          exprasmlist^.concat(new(pai386,op_reg(incdecop[p^.inlinenumber],opsize,
+                            p^.left^.left^.location.register)))
+                        else
+                          exprasmlist^.concat(new(pai386,op_ref(incdecop[p^.inlinenumber],opsize,
+                            newreference(p^.left^.left^.location.reference))))
+                     end
                    else
-                    exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
-                      addvalue,newreference(p^.left^.left^.location.reference))));
+                     begin
+                        if p^.left^.left^.location.loc=LOC_CREGISTER then
+                          exprasmlist^.concat(new(pai386,op_const_reg(addsubop[p^.inlinenumber],opsize,
+                            addvalue,p^.left^.left^.location.register)))
+                        else
+                          exprasmlist^.concat(new(pai386,op_const_ref(addsubop[p^.inlinenumber],opsize,
+                            addvalue,newreference(p^.left^.left^.location.reference))));
+                     end
                  end
                 else
                  begin
-                   exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
-                      hregister,newreference(p^.left^.left^.location.reference))));
+                    if p^.left^.left^.location.loc=LOC_CREGISTER then
+                      exprasmlist^.concat(new(pai386,op_reg_reg(addsubop[p^.inlinenumber],opsize,
+                        hregister,p^.left^.left^.location.register)))
+                    else
+                      exprasmlist^.concat(new(pai386,op_reg_ref(addsubop[p^.inlinenumber],opsize,
+                        hregister,newreference(p^.left^.left^.location.reference))));
                    ungetregister32(hregister);
                  end;
                 emitoverflowcheck(p^.left^.left);
@@ -913,7 +930,14 @@ implementation
 end.
 {
   $Log$
-  Revision 1.2  1998-09-04 08:41:40  peter
+  Revision 1.3  1998-09-05 23:03:57  florian
+    * some fixes to get -Or work:
+      - inc/dec didn't take care of CREGISTER
+      - register calculcation of inc/dec was wrong
+      - var/const parameters get now assigned 32 bit register, but
+        const parameters only if they are passed by reference !
+
+  Revision 1.2  1998/09/04 08:41:40  peter
     * updated some error messages
 
   Revision 1.1  1998/08/31 12:22:14  peter

+ 21 - 4
compiler/cgi386.pas

@@ -434,14 +434,24 @@ implementation
                                   dec(c_usableregs);
 
                                   { possibly no 32 bit register are needed }
-                                  if  (regvars[i]^.definition^.deftype=orddef) and
+
+                                  { call by reference/const ? }
+                                  if (regvars[i]^.varspez=vs_var) or
+                                    ((regvars[i]^.varspez=vs_const) and
+                                     dont_copy_const_param(regvars[i]^.definition)
+                                    ) then
+                                    begin
+                                       regvars[i]^.reg:=varregs[i];
+                                       regsize:=S_L;
+                                    end
+                                  else if  (regvars[i]^.definition^.deftype=orddef) and
                                       (porddef(regvars[i]^.definition)^.typ in [bool8bit,uchar,u8bit,s8bit]) then
                                     begin
                                        regvars[i]^.reg:=reg32toreg8(varregs[i]);
                                        regsize:=S_B;
                                     end
-                                  else if  (regvars[i]^.definition^.deftype=orddef) and
-                                           (porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
+                                  else if (regvars[i]^.definition^.deftype=orddef) and
+                                          (porddef(regvars[i]^.definition)^.typ in [bool16bit,u16bit,s16bit]) then
                                     begin
                                        regvars[i]^.reg:=reg32toreg16(varregs[i]);
                                        regsize:=S_W;
@@ -506,7 +516,14 @@ implementation
 end.
 {
   $Log$
-  Revision 1.51  1998-08-31 12:22:14  peter
+  Revision 1.52  1998-09-05 23:03:58  florian
+    * some fixes to get -Or work:
+      - inc/dec didn't take care of CREGISTER
+      - register calculcation of inc/dec was wrong
+      - var/const parameters get now assigned 32 bit register, but
+        const parameters only if they are passed by reference !
+
+  Revision 1.51  1998/08/31 12:22:14  peter
     * secondinline moved to cg386inl
 
   Revision 1.50  1998/08/28 10:54:20  peter

+ 1 - 1
compiler/mppc386.bat

@@ -1,4 +1,4 @@
-ppc386 -OGp22 -Ch8000000 -dI386 -dGDB -a -Sg pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
+ppc386 -al -OGp22 -Ch8000000 -dI386 -dGDB -a -Sg pp.pas %1 %2 %3 %4 %5 %6 %7 %8 %9
 if errorlevel 0 goto success
 goto failed
 :success

+ 15 - 1
compiler/pass_1.pas

@@ -4032,6 +4032,13 @@ unit pass_1;
                                 p^.left^.right^.left:=gentypeconvnode(p^.left^.right^.left,s32bitdef);
                                 { check the type conversion }
                                 firstpass(p^.left^.right^.left);
+
+                                { need we an additional register ? }
+                                if not(is_constintnode(p^.left^.right^.left)) and
+                                  (p^.left^.right^.left^.location.loc in [LOC_MEM,LOC_REFERENCE]) and
+                                  (p^.left^.right^.left^.registers32<1) then
+                                  inc(p^.registers32);
+
                                 if assigned(p^.left^.right^.right) then
                                   Message(cg_e_illegal_expression);
                              end;
@@ -5441,7 +5448,14 @@ unit pass_1;
 end.
 {
   $Log$
-  Revision 1.73  1998-09-05 22:29:57  florian
+  Revision 1.74  1998-09-05 23:04:00  florian
+    * some fixes to get -Or work:
+      - inc/dec didn't take care of CREGISTER
+      - register calculcation of inc/dec was wrong
+      - var/const parameters get now assigned 32 bit register, but
+        const parameters only if they are passed by reference !
+
+  Revision 1.73  1998/09/05 22:29:57  florian
     + the boolean comparision a=true generates now the same code as only a,
       (a=1 was compiled to cmp 1,a now it is compiled to cmp 0,a)