Pārlūkot izejas kodu

+ added support for succ/pred(<qword/int64>)

florian 26 gadi atpakaļ
vecāks
revīzija
17950502e1
2 mainītis faili ar 85 papildinājumiem un 24 dzēšanām
  1. 71 22
      compiler/cg386inl.pas
  2. 14 2
      compiler/tcinl.pas

+ 71 - 22
compiler/cg386inl.pas

@@ -1077,34 +1077,80 @@ implementation
                    internalerror(10080);
                  end;
                  p^.location.loc:=LOC_REGISTER;
-                 if p^.left^.location.loc<>LOC_REGISTER then
+                 if p^.resulttype^.size=8 then
                    begin
-                      p^.location.register:=getregister32;
-                      if (p^.resulttype^.size=2) then
-                        p^.location.register:=reg32toreg16(p^.location.register);
-                      if (p^.resulttype^.size=1) then
-                        p^.location.register:=reg32toreg8(p^.location.register);
-                      if p^.left^.location.loc=LOC_CREGISTER then
-                        emit_reg_reg(A_MOV,opsize,p^.left^.location.register,
-                          p^.location.register)
+                      if p^.left^.location.loc<>LOC_REGISTER then
+                        begin
+                           p^.location.registerlow:=getregister32;
+                           p^.location.registerhigh:=getregister32;
+                           if p^.left^.location.loc=LOC_CREGISTER then
+                             begin
+                                emit_reg_reg(A_MOV,opsize,p^.left^.location.registerlow,
+                                  p^.location.registerlow);
+                                emit_reg_reg(A_MOV,opsize,p^.left^.location.registerhigh,
+                                  p^.location.registerhigh);
+                             end
+                           else
+                             begin
+                                del_reference(p^.left^.location.reference);
+                                emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
+                                  p^.location.registerlow);
+                                r:=newreference(p^.left^.location.reference);
+                                inc(r^.offset,4);
+                                emit_ref_reg(A_MOV,opsize,r,
+                                  p^.location.registerhigh);
+                             end;
+                        end
                       else
-                      if p^.left^.location.loc=LOC_FLAGS then
-                        emit_flag2reg(p^.left^.location.resflags,p^.location.register)
+                        begin
+                           p^.location.registerhigh:=p^.left^.location.registerhigh;
+                           p^.location.registerlow:=p^.left^.location.registerlow;
+                        end;
+                      if p^.inlinenumber=in_succ_x then
+                        begin
+                           emit_const_reg(A_ADD,opsize,1,
+                             p^.location.registerlow);
+                           emit_const_reg(A_ADC,opsize,0,
+                             p^.location.registerhigh);
+                        end
                       else
                         begin
-                           del_reference(p^.left^.location.reference);
-                           emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
-                             p^.location.register);
+                           emit_const_reg(A_SUB,opsize,1,
+                             p^.location.registerlow);
+                           emit_const_reg(A_SBB,opsize,0,
+                             p^.location.registerhigh);
                         end;
                    end
-                 else p^.location.register:=p^.left^.location.register;
-
-                 if not (cs_check_overflow in aktlocalswitches) then
-                   emit_reg(asmop,opsize,
-                     p^.location.register)
                  else
-                   emit_const_reg(asmop,opsize,1,
-                     p^.location.register);
+                   begin
+                      if p^.left^.location.loc<>LOC_REGISTER then
+                        begin
+                           p^.location.register:=getregister32;
+                           if (p^.resulttype^.size=2) then
+                             p^.location.register:=reg32toreg16(p^.location.register);
+                           if (p^.resulttype^.size=1) then
+                             p^.location.register:=reg32toreg8(p^.location.register);
+                           if p^.left^.location.loc=LOC_CREGISTER then
+                             emit_reg_reg(A_MOV,opsize,p^.left^.location.register,
+                               p^.location.register)
+                           else
+                           if p^.left^.location.loc=LOC_FLAGS then
+                             emit_flag2reg(p^.left^.location.resflags,p^.location.register)
+                           else
+                             begin
+                                del_reference(p^.left^.location.reference);
+                                emit_ref_reg(A_MOV,opsize,newreference(p^.left^.location.reference),
+                                  p^.location.register);
+                             end;
+                        end
+                      else p^.location.register:=p^.left^.location.register;
+                      if not (cs_check_overflow in aktlocalswitches) then
+                        emit_reg(asmop,opsize,
+                        p^.location.register)
+                      else
+                        emit_const_reg(asmop,opsize,1,
+                        p^.location.register);
+                   end;
                  emitoverflowcheck(p);
                  emitrangecheck(p,p^.resulttype);
               end;
@@ -1435,7 +1481,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.82  1999-12-01 12:42:31  peter
+  Revision 1.83  1999-12-02 12:38:45  florian
+    + added support for succ/pred(<qword/int64>)
+
+  Revision 1.82  1999/12/01 12:42:31  peter
     * fixed bug 698
     * removed some notes about unused vars
 

+ 14 - 2
compiler/tcinl.pas

@@ -550,8 +550,17 @@ implementation
              in_pred_x,
              in_succ_x:
                begin
-                  inc(p^.registers32);
                   p^.resulttype:=p^.left^.resulttype;
+                  if is_64bitint(p^.resulttype) then
+                    begin
+                       if (p^.registers32<2) then
+                         p^.registers32:=2
+                    end
+                  else
+                    begin
+                       if (p^.registers32<1) then
+                         p^.registers32:=1;
+                    end;
                   p^.location.loc:=LOC_REGISTER;
                   set_varstate(p^.left,true);
                   if not is_ordinal(p^.resulttype) then
@@ -1272,7 +1281,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.61  1999-11-30 10:40:58  peter
+  Revision 1.62  1999-12-02 12:38:45  florian
+    + added support for succ/pred(<qword/int64>)
+
+  Revision 1.61  1999/11/30 10:40:58  peter
     + ttype, tsymlist
 
   Revision 1.60  1999/11/18 15:34:49  pierre