Browse Source

+ again more stuff for int64/qword:
- comparision operators
- code generation for: str, read(ln), write(ln)

florian 27 years ago
parent
commit
6283947c69
4 changed files with 187 additions and 79 deletions
  1. 130 67
      compiler/cg386add.pas
  2. 28 4
      compiler/cg386inl.pas
  3. 23 5
      compiler/tcinl.pas
  4. 6 3
      compiler/tgeni386.pas

+ 130 - 67
compiler/cg386add.pas

@@ -43,9 +43,56 @@ implementation
                                 Helpers
                                 Helpers
 *****************************************************************************}
 *****************************************************************************}
 
 
+    function getresflags(p : ptree;unsigned : boolean) : tresflags;
+
+      begin
+         if not(unsigned) then
+           begin
+              if p^.swaped then
+                case p^.treetype of
+                   equaln : getresflags:=F_E;
+                   unequaln : getresflags:=F_NE;
+                   ltn : getresflags:=F_G;
+                   lten : getresflags:=F_GE;
+                   gtn : getresflags:=F_L;
+                   gten : getresflags:=F_LE;
+                end
+              else
+                case p^.treetype of
+                   equaln : getresflags:=F_E;
+                   unequaln : getresflags:=F_NE;
+                   ltn : getresflags:=F_L;
+                   lten : getresflags:=F_LE;
+                   gtn : getresflags:=F_G;
+                   gten : getresflags:=F_GE;
+                end;
+           end
+         else
+           begin
+              if p^.swaped then
+                case p^.treetype of
+                   equaln : getresflags:=F_E;
+                   unequaln : getresflags:=F_NE;
+                   ltn : getresflags:=F_A;
+                   lten : getresflags:=F_AE;
+                   gtn : getresflags:=F_B;
+                   gten : getresflags:=F_BE;
+                end
+              else
+                case p^.treetype of
+                   equaln : getresflags:=F_E;
+                   unequaln : getresflags:=F_NE;
+                   ltn : getresflags:=F_B;
+                   lten : getresflags:=F_BE;
+                   gtn : getresflags:=F_A;
+                   gten : getresflags:=F_AE;
+                end;
+           end;
+      end;
+
+
     procedure SetResultLocation(cmpop,unsigned:boolean;var p :ptree);
     procedure SetResultLocation(cmpop,unsigned:boolean;var p :ptree);
-      var
-         flags : tresflags;
+
       begin
       begin
          { remove temporary location if not a set or string }
          { remove temporary location if not a set or string }
          { that's a bad hack (FK) who did this ?            }
          { that's a bad hack (FK) who did this ?            }
@@ -60,51 +107,9 @@ implementation
          { in case of comparison operation the put result in the flags }
          { in case of comparison operation the put result in the flags }
          if cmpop then
          if cmpop then
            begin
            begin
-              if not(unsigned) then
-                begin
-                   if p^.swaped then
-                     case p^.treetype of
-                        equaln : flags:=F_E;
-                        unequaln : flags:=F_NE;
-                        ltn : flags:=F_G;
-                        lten : flags:=F_GE;
-                        gtn : flags:=F_L;
-                        gten : flags:=F_LE;
-                     end
-                   else
-                     case p^.treetype of
-                        equaln : flags:=F_E;
-                        unequaln : flags:=F_NE;
-                        ltn : flags:=F_L;
-                        lten : flags:=F_LE;
-                        gtn : flags:=F_G;
-                        gten : flags:=F_GE;
-                     end;
-                end
-              else
-                begin
-                   if p^.swaped then
-                     case p^.treetype of
-                        equaln : flags:=F_E;
-                        unequaln : flags:=F_NE;
-                        ltn : flags:=F_A;
-                        lten : flags:=F_AE;
-                        gtn : flags:=F_B;
-                        gten : flags:=F_BE;
-                     end
-                   else
-                     case p^.treetype of
-                        equaln : flags:=F_E;
-                        unequaln : flags:=F_NE;
-                        ltn : flags:=F_B;
-                        lten : flags:=F_BE;
-                        gtn : flags:=F_A;
-                        gten : flags:=F_AE;
-                     end;
-                end;
               clear_location(p^.location);
               clear_location(p^.location);
               p^.location.loc:=LOC_FLAGS;
               p^.location.loc:=LOC_FLAGS;
-              p^.location.resflags:=flags;
+              p^.location.resflags:=getresflags(p,unsigned);
            end;
            end;
       end;
       end;
 
 
@@ -1114,7 +1119,7 @@ implementation
                              begin
                              begin
                                op:=A_CMP;
                                op:=A_CMP;
                                op2:=A_CMP;
                                op2:=A_CMP;
-                               { cmpop is set later, if necessary }
+                               cmpop:=true;
                              end;
                              end;
 
 
                       xorn:
                       xorn:
@@ -1152,9 +1157,9 @@ implementation
                                begin
                                begin
                                   hregister:=p^.location.registerlow;
                                   hregister:=p^.location.registerlow;
                                   hregister2:=p^.location.registerhigh;
                                   hregister2:=p^.location.registerhigh;
-                                  emit_reg_reg(A_MOV,opsize,p^.left^.location.registerlow,
+                                  emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,
                                     hregister);
                                     hregister);
-                                  emit_reg_reg(A_MOV,opsize,p^.left^.location.registerlow,
+                                  emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,
                                     hregister2);
                                     hregister2);
                                end
                                end
                              else
                              else
@@ -1168,9 +1173,9 @@ implementation
                                begin
                                begin
                                   hregister:=getregister32;
                                   hregister:=getregister32;
                                   hregister2:=getregister32;
                                   hregister2:=getregister32;
-                                  emit_reg_reg(A_MOV,opsize,p^.left^.location.registerlow,
+                                  emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,
                                     hregister);
                                     hregister);
-                                  emit_reg_reg(A_MOV,opsize,p^.left^.location.registerhigh,
+                                  emit_reg_reg(A_MOV,S_L,p^.left^.location.registerhigh,
                                     hregister2);
                                     hregister2);
                                end
                                end
                           end
                           end
@@ -1182,23 +1187,23 @@ implementation
                                begin
                                begin
                                   hregister:=p^.location.registerlow;
                                   hregister:=p^.location.registerlow;
                                   hregister2:=p^.location.registerhigh;
                                   hregister2:=p^.location.registerhigh;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                                     newreference(p^.left^.location.reference),hregister)));
                                     newreference(p^.left^.location.reference),hregister)));
                                   hr:=newreference(p^.left^.location.reference);
                                   hr:=newreference(p^.left^.location.reference);
                                   inc(hr^.offset,4);
                                   inc(hr^.offset,4);
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                                     hr,hregister2)));
                                     hr,hregister2)));
                                end
                                end
                              else
                              else
                                begin
                                begin
                                   hregister:=getregister32;
                                   hregister:=getregister32;
                                   hregister2:=getregister32;
                                   hregister2:=getregister32;
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                                     newreference(p^.left^.location.reference),hregister)));
                                     newreference(p^.left^.location.reference),hregister)));
                                   hr:=newreference(p^.left^.location.reference);
                                   hr:=newreference(p^.left^.location.reference);
                                   inc(hr^.offset,4);
                                   inc(hr^.offset,4);
-                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,opsize,
-                                    newreference(p^.left^.location.reference),hregister2)));
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                    hr,hregister2)));
                                end;
                                end;
                           end;
                           end;
                         clear_location(p^.location);
                         clear_location(p^.location);
@@ -1235,6 +1240,38 @@ implementation
                                     newreference(p^.right^.location.reference),R_EDI)));
                                     newreference(p^.right^.location.reference),R_EDI)));
                                   exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,p^.location.register,R_EDI)));
                                   exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,p^.location.register,R_EDI)));
                                   exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,R_EDI,p^.location.register)));
                                   exprasmlist^.concat(new(pai386,op_reg_reg(A_MOV,opsize,R_EDI,p^.location.register)));
+                                  ungetiftemp(p^.right^.location.reference);
+                                  del_reference(p^.right^.location.reference);
+                               end;
+                          end
+                        else if cmpop then
+                          begin
+                             if (p^.right^.location.loc=LOC_CREGISTER) then
+                               begin
+                                  emit_reg_reg(A_CMP,S_L,p^.right^.location.registerhigh,
+                                     p^.location.registerhigh);
+                                  emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+
+                                  emit_reg_reg(A_CMP,S_L,p^.right^.location.registerlow,
+                                     p^.location.registerlow);
+                                  emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+
+                                  emitl(A_JMP,falselabel);
+                               end
+                             else
+                               begin
+                                  hr:=newreference(p^.right^.location.reference);
+                                  inc(hr^.offset,4);
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_L,
+                                    hr,p^.location.registerhigh)));
+                                  emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+
+                                  exprasmlist^.concat(new(pai386,op_ref_reg(A_CMP,S_L,newreference(
+                                    p^.right^.location.reference),p^.location.registerlow)));
+                                  emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+
+                                  emitl(A_JMP,falselabel);
+
                                   ungetiftemp(p^.right^.location.reference);
                                   ungetiftemp(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                   del_reference(p^.right^.location.reference);
                                end;
                                end;
@@ -1261,16 +1298,18 @@ implementation
                                begin
                                begin
                                   if (p^.right^.location.loc=LOC_CREGISTER) then
                                   if (p^.right^.location.loc=LOC_CREGISTER) then
                                     begin
                                     begin
-                                       emit_reg_reg(op,opsize,p^.right^.location.register,
-                                          p^.location.register);
+                                       emit_reg_reg(op,S_L,p^.right^.location.registerlow,
+                                          p^.location.registerlow);
+                                       emit_reg_reg(op2,S_L,p^.right^.location.registerhigh,
+                                          p^.location.registerhigh);
                                     end
                                     end
                                   else
                                   else
                                     begin
                                     begin
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(op,opsize,newreference(
+                                       exprasmlist^.concat(new(pai386,op_ref_reg(op,S_L,newreference(
                                          p^.right^.location.reference),p^.location.registerlow)));
                                          p^.right^.location.reference),p^.location.registerlow)));
                                        hr:=newreference(p^.right^.location.reference);
                                        hr:=newreference(p^.right^.location.reference);
                                        inc(hr^.offset,4);
                                        inc(hr^.offset,4);
-                                       exprasmlist^.concat(new(pai386,op_ref_reg(op2,opsize,
+                                       exprasmlist^.concat(new(pai386,op_ref_reg(op2,S_L,
                                          hr,p^.location.registerhigh)));
                                          hr,p^.location.registerhigh)));
                                        ungetiftemp(p^.right^.location.reference);
                                        ungetiftemp(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
                                        del_reference(p^.right^.location.reference);
@@ -1290,12 +1329,24 @@ implementation
                                { just to maintain ordering           }
                                { just to maintain ordering           }
                                p^.swaped:=not(p^.swaped);
                                p^.swaped:=not(p^.swaped);
                           end
                           end
+                        else if cmpop then
+                          begin
+                             exprasmlist^.concat(new(pai386,op_reg_reg(A_CMP,S_L,
+                               p^.right^.location.registerhigh,
+                               p^.location.registerhigh)));
+                             emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+                             exprasmlist^.concat(new(pai386,op_reg_reg(A_CMP,S_L,
+                               p^.right^.location.registerlow,
+                               p^.location.registerlow)));
+                             emitl(flag_2_jmp[getresflags(p,unsigned)],truelabel);
+                             emitl(A_JMP,falselabel);
+                          end
                         else
                         else
                           begin
                           begin
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op,opsize,
-                               p^.right^.location.register,
-                               p^.location.register)));
-                             exprasmlist^.concat(new(pai386,op_reg_reg(op2,opsize,
+                             exprasmlist^.concat(new(pai386,op_reg_reg(op,S_L,
+                               p^.right^.location.registerlow,
+                               p^.location.registerlow)));
+                             exprasmlist^.concat(new(pai386,op_reg_reg(op2,S_L,
                                p^.right^.location.registerhigh,
                                p^.right^.location.registerhigh,
                                p^.location.registerhigh)));
                                p^.location.registerhigh)));
                           end;
                           end;
@@ -1304,9 +1355,9 @@ implementation
                      end;
                      end;
 
 
                    if cmpop then
                    if cmpop then
-                     case opsize of
-                        S_L : ungetregister32(p^.location.register);
-                        S_B : ungetregister32(reg8toreg32(p^.location.register));
+                     begin
+                        ungetregister32(p^.location.registerlow);
+                        ungetregister32(p^.location.registerhigh);
                      end;
                      end;
 
 
                    { only in case of overflow operations }
                    { only in case of overflow operations }
@@ -1326,6 +1377,13 @@ implementation
                          emitl(A_LABEL,hl4);
                          emitl(A_LABEL,hl4);
                        end;
                        end;
                     end;
                     end;
+                   { we have LOC_JUMP as result }
+                   if cmpop then
+                     begin
+                        clear_location(p^.location);
+                        p^.location.loc:=LOC_JUMP;
+                        cmpop:=false;
+                     end;
                 end
                 end
               else
               else
               { Floating point }
               { Floating point }
@@ -1639,7 +1697,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.34  1998-12-11 00:02:46  peter
+  Revision 1.35  1998-12-11 23:36:06  florian
+    + again more stuff for int64/qword:
+         - comparision operators
+         - code generation for: str, read(ln), write(ln)
+
+  Revision 1.34  1998/12/11 00:02:46  peter
     + globtype,tokens,version unit splitted from globals
     + globtype,tokens,version unit splitted from globals
 
 
   Revision 1.33  1998/12/10 11:16:00  florian
   Revision 1.33  1998/12/10 11:16:00  florian

+ 28 - 4
compiler/cg386inl.pas

@@ -354,6 +354,15 @@ implementation
                                                     emitcall('FPC_READ_TEXT_CHAR',true)
                                                     emitcall('FPC_READ_TEXT_CHAR',true)
                                                   else
                                                   else
                                                     emitcall('FPC_WRITE_TEXT_CHAR',true);
                                                     emitcall('FPC_WRITE_TEXT_CHAR',true);
+                                         s64bitint:
+                                                  if doread then
+                                                    emitcall('FPC_READ_TEXT_INT64',true)
+                                                  else
+                                                    emitcall('FPC_WRITE_TEXT_INT64',true);
+                                         u64bit : if doread then
+                                                    emitcall('FPC_READ_TEXT_QWORD',true)
+                                                  else
+                                                    emitcall('FPC_WRITE_TEXT_QWORD',true);
                                        bool8bit,
                                        bool8bit,
                                       bool16bit,
                                       bool16bit,
                                       bool32bit : if  doread then
                                       bool32bit : if  doread then
@@ -508,10 +517,20 @@ implementation
 
 
            if is_real then
            if is_real then
              emitcall('FPC_STR_'+float_name[pfloatdef(hp^.resulttype)^.typ],true)
              emitcall('FPC_STR_'+float_name[pfloatdef(hp^.resulttype)^.typ],true)
-           else if porddef(hp^.resulttype)^.typ=u32bit then
-             emitcall('FPC_STR_CARDINAL',true)
            else
            else
-             emitcall('FPC_STR_LONGINT',true);
+             case porddef(hp^.resulttype)^.typ of
+                u32bit:
+                  emitcall('FPC_STR_CARDINAL',true);
+
+                u64bit:
+                  emitcall('FPC_STR_QWORD',true);
+
+                s64bitint:
+                  emitcall('FPC_STR_INT64',true);
+
+                else
+                  emitcall('FPC_STR_LONGINT',true);
+             end;
            popusedregisters(pushed);
            popusedregisters(pushed);
         end;
         end;
 
 
@@ -971,7 +990,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.21  1998-12-11 00:02:50  peter
+  Revision 1.22  1998-12-11 23:36:07  florian
+    + again more stuff for int64/qword:
+         - comparision operators
+         - code generation for: str, read(ln), write(ln)
+
+  Revision 1.21  1998/12/11 00:02:50  peter
     + globtype,tokens,version unit splitted from globals
     + globtype,tokens,version unit splitted from globals
 
 
   Revision 1.20  1998/11/27 14:50:32  peter
   Revision 1.20  1998/11/27 14:50:32  peter

+ 23 - 5
compiler/tcinl.pas

@@ -541,7 +541,12 @@ implementation
                                        orddef : begin
                                        orddef : begin
                                                   case porddef(hp^.left^.resulttype)^.typ of
                                                   case porddef(hp^.left^.resulttype)^.typ of
                                                      uchar,
                                                      uchar,
-                                             u32bit,s32bit : ;
+                                                     u32bit,
+                                                     s32bit,
+                                                     s64bitint,
+                                                     u64bit:
+                                                       ;
+
                                                u8bit,s8bit,
                                                u8bit,s8bit,
                                              u16bit,s16bit : if dowrite then
                                              u16bit,s16bit : if dowrite then
                                                               hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
                                                               hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
@@ -672,9 +677,17 @@ implementation
                        case hp^.resulttype^.deftype of
                        case hp^.resulttype^.deftype of
                         orddef : begin
                         orddef : begin
                                    case porddef(hp^.left^.resulttype)^.typ of
                                    case porddef(hp^.left^.resulttype)^.typ of
-                              u32bit,s32bit : ;
-                                u8bit,s8bit,
-                              u16bit,s16bit : hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
+
+                                      u32bit,
+                                      s32bit,
+                                      s64bitint,
+                                      u64bit:
+                                        ;
+
+                                      u8bit,s8bit,
+                                      u16bit,s16bit:
+                                        hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
+
                                    else
                                    else
                                      CGMessage(type_e_integer_or_real_expr_expected);
                                      CGMessage(type_e_integer_or_real_expr_expected);
                                    end;
                                    end;
@@ -875,7 +888,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.10  1998-11-27 14:50:53  peter
+  Revision 1.11  1998-12-11 23:36:08  florian
+    + again more stuff for int64/qword:
+         - comparision operators
+         - code generation for: str, read(ln), write(ln)
+
+  Revision 1.10  1998/11/27 14:50:53  peter
     + open strings, $P switch support
     + open strings, $P switch support
 
 
   Revision 1.9  1998/11/24 17:04:28  peter
   Revision 1.9  1998/11/24 17:04:28  peter

+ 6 - 3
compiler/tgeni386.pas

@@ -351,8 +351,6 @@ implementation
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
       end;
       end;
 
 
-
-
    procedure resetusableregisters;
    procedure resetusableregisters;
       begin
       begin
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
@@ -370,7 +368,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.16  1998-12-11 17:22:40  florian
+  Revision 1.17  1998-12-11 23:36:09  florian
+    + again more stuff for int64/qword:
+         - comparision operators
+         - code generation for: str, read(ln), write(ln)
+
+  Revision 1.16  1998/12/11 17:22:40  florian
     * fixed previous commit bug fix of getexplicitregister32
     * fixed previous commit bug fix of getexplicitregister32
       (usableregs32 was decremented twice, thnaks Pierre for that hint)
       (usableregs32 was decremented twice, thnaks Pierre for that hint)