Browse Source

+ typed const int64 and qword
+ unary minus-operator q1:=-q2;
+ not-operator

florian 27 years ago
parent
commit
1b4cf9afb5
3 changed files with 197 additions and 63 deletions
  1. 146 61
      compiler/cg386mat.pas
  2. 18 1
      compiler/ptconst.pas
  3. 33 1
      compiler/tcmat.pas

+ 146 - 61
compiler/cg386mat.pas

@@ -461,76 +461,116 @@ implementation
            emit_reg_reg(A_MOVQ,S_NO,R_MM7,p^.location.register);
         end;
 {$endif}
+      var
+         hr : preference;
 
       begin
-         secondpass(p^.left);
-         p^.location.loc:=LOC_REGISTER;
-         case p^.left^.location.loc of
-            LOC_REGISTER:
-              begin
-                 p^.location.register:=p^.left^.location.register;
-                 exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
-              end;
-            LOC_CREGISTER:
-              begin
-                 p^.location.register:=getregister32;
-                 emit_reg_reg(A_MOV,S_L,p^.location.register,
-                   p^.location.register);
-                 exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+         if is_64bitint(p^.left^.resulttype) then
+           begin
+              secondpass(p^.left);
+              clear_location(p^.location);
+              p^.location.loc:=LOC_REGISTER;
+              case p^.left^.location.loc of
+                LOC_REGISTER :
+                  begin
+                     p^.location.registerlow:=p^.left^.location.registerlow;
+                     p^.location.registerhigh:=p^.left^.location.registerhigh;
+                  end;
+                LOC_CREGISTER :
+                  begin
+                     p^.location.registerlow:=getregister32;
+                     p^.location.registerhigh:=getregister32;
+                     emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,p^.location.registerlow);
+                     emit_reg_reg(A_MOV,S_L,p^.left^.location.registerhigh,p^.location.registerhigh);
+                  end;
+                LOC_REFERENCE,LOC_MEM :
+                  begin
+                     del_reference(p^.left^.location.reference);
+                     p^.location.registerlow:=getregister32;
+                     p^.location.registerhigh:=getregister32;
+                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                       newreference(p^.left^.location.reference),p^.location.registerlow)));
+                     hr:=newreference(p^.left^.location.reference);
+                     inc(hr^.offset,4);
+                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                       hr,p^.location.registerhigh)));
+                  end;
               end;
+            exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.registerlow)));
+            exprasmlist^.concat(new(pai386,op_const_reg(A_ADC,S_L,0,p^.location.registerhigh)));
+            exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.registerhigh)));
+           end
+         else
+           begin
+              secondpass(p^.left);
+              p^.location.loc:=LOC_REGISTER;
+              case p^.left^.location.loc of
+                 LOC_REGISTER:
+                   begin
+                      p^.location.register:=p^.left^.location.register;
+                      exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                   end;
+                 LOC_CREGISTER:
+                   begin
+                      p^.location.register:=getregister32;
+                      emit_reg_reg(A_MOV,S_L,p^.location.register,
+                        p^.location.register);
+                      exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                   end;
 {$ifdef SUPPORT_MMX}
-            LOC_MMXREGISTER:
-              begin
-                 set_location(p^.location,p^.left^.location);
-                 emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
-                 do_mmx_neg;
-              end;
-            LOC_CMMXREGISTER:
-              begin
-                 p^.location.register:=getregistermmx;
-                 emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
-                 emit_reg_reg(A_MOVQ,S_NO,p^.left^.location.register,
-                   p^.location.register);
-                 do_mmx_neg;
-              end;
+                 LOC_MMXREGISTER:
+                   begin
+                      set_location(p^.location,p^.left^.location);
+                      emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
+                      do_mmx_neg;
+                   end;
+                 LOC_CMMXREGISTER:
+                   begin
+                      p^.location.register:=getregistermmx;
+                      emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
+                      emit_reg_reg(A_MOVQ,S_NO,p^.left^.location.register,
+                        p^.location.register);
+                      do_mmx_neg;
+                   end;
 {$endif SUPPORT_MMX}
-            LOC_REFERENCE,LOC_MEM:
-                           begin
-                              del_reference(p^.left^.location.reference);
-                              if (p^.left^.resulttype^.deftype=floatdef) and
-                                 (pfloatdef(p^.left^.resulttype)^.typ<>f32bit) then
+                 LOC_REFERENCE,LOC_MEM:
                                 begin
-                                   p^.location.loc:=LOC_FPU;
-                                   floatload(pfloatdef(p^.left^.resulttype)^.typ,
-                                     p^.left^.location.reference);
-                                   exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
-                                end
+                                   del_reference(p^.left^.location.reference);
+                                   if (p^.left^.resulttype^.deftype=floatdef) and
+                                      (pfloatdef(p^.left^.resulttype)^.typ<>f32bit) then
+                                     begin
+                                        p^.location.loc:=LOC_FPU;
+                                        floatload(pfloatdef(p^.left^.resulttype)^.typ,
+                                          p^.left^.location.reference);
+                                        exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                                     end
 {$ifdef SUPPORT_MMX}
-                              else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
-                                begin
-                                   p^.location.register:=getregistermmx;
-                                   emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
-                                     newreference(p^.left^.location.reference),
-                                     p^.location.register)));
-                                   do_mmx_neg;
-                                end
+                                   else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(p^.left^.resulttype) then
+                                     begin
+                                        p^.location.register:=getregistermmx;
+                                        emit_reg_reg(A_PXOR,S_NO,R_MM7,R_MM7);
+                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOVQ,S_NO,
+                                          newreference(p^.left^.location.reference),
+                                          p^.location.register)));
+                                        do_mmx_neg;
+                                     end
 {$endif SUPPORT_MMX}
-                              else
-                                begin
-                                   p^.location.register:=getregister32;
-                                   exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
-                                     newreference(p^.left^.location.reference),
-                                     p^.location.register)));
-                                   exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                                   else
+                                     begin
+                                        p^.location.register:=getregister32;
+                                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                                          newreference(p^.left^.location.reference),
+                                          p^.location.register)));
+                                        exprasmlist^.concat(new(pai386,op_reg(A_NEG,S_L,p^.location.register)));
+                                     end;
                                 end;
-                           end;
-            LOC_FPU:
-              begin
-                 p^.location.loc:=LOC_FPU;
-                 exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                 LOC_FPU:
+                   begin
+                      p^.location.loc:=LOC_FPU;
+                      exprasmlist^.concat(new(pai386,op_none(A_FCHS,S_NO)));
+                   end;
               end;
-         end;
+           end;
 { Here was a problem...            }
 { Operand to be negated always     }
 { seems to be converted to signed  }
@@ -552,6 +592,8 @@ implementation
       var
          hl : plabel;
          opsize : topsize;
+         hr : preference;
+
       begin
          if is_boolean(p^.resulttype) then
           begin
@@ -640,6 +682,44 @@ implementation
              emit_reg_reg(A_PXOR,S_D,R_MM7,p^.location.register);
            end
 {$endif SUPPORT_MMX}
+         else if is_64bitint(p^.left^.resulttype) then
+           begin
+              secondpass(p^.left);
+              clear_location(p^.location);
+              p^.location.loc:=LOC_REGISTER;
+              case p^.left^.location.loc of
+                LOC_REGISTER :
+                  begin
+                     p^.location.registerlow:=p^.left^.location.registerlow;
+                     p^.location.registerhigh:=p^.left^.location.registerhigh;
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                  end;
+                LOC_CREGISTER :
+                  begin
+                     p^.location.registerlow:=getregister32;
+                     p^.location.registerhigh:=getregister32;
+                     emit_reg_reg(A_MOV,S_L,p^.left^.location.registerlow,p^.location.registerlow);
+                     emit_reg_reg(A_MOV,S_L,p^.left^.location.registerhigh,p^.location.registerhigh);
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                  end;
+                LOC_REFERENCE,LOC_MEM :
+                  begin
+                     del_reference(p^.left^.location.reference);
+                     p^.location.registerlow:=getregister32;
+                     p^.location.registerhigh:=getregister32;
+                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                       newreference(p^.left^.location.reference),p^.location.registerlow)));
+                     hr:=newreference(p^.left^.location.reference);
+                     inc(hr^.offset,4);
+                     exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                       hr,p^.location.registerhigh)));
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerlow)));
+                     exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,p^.location.registerhigh)));
+                  end;
+              end;
+           end
          else
           begin
             secondpass(p^.left);
@@ -674,7 +754,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.14  1998-12-11 16:10:07  florian
+  Revision 1.15  1998-12-11 16:50:22  florian
+    + typed const int64 and qword
+    + unary minus-operator  q1:=-q2;
+    + not-operator
+
+  Revision 1.14  1998/12/11 16:10:07  florian
     + shifting for 64 bit ints added
     * bug in getexplicitregister32 fixed: usableregs wasn't decremented !!
 

+ 18 - 1
compiler/ptconst.pas

@@ -139,6 +139,18 @@ unit ptconst;
                                 datasegment^.concat(new(pai_const,init_16bit(p^.value)));
                                 check_range;
                             end;
+                    s64bitint,
+                    u64bit:
+                      begin
+                         if not is_constintnode(p) then
+                           Message(cg_e_illegal_expression)
+                         else
+                           begin
+                              {!!!!! hmmm, we can write yet only consts til 2^32-1 :( (FK) }
+                              datasegment^.concat(new(pai_const,init_32bit(p^.value)));
+                              datasegment^.concat(new(pai_const,init_32bit(0)));
+                           end;
+                      end;
                  end;
                  disposetree(p);
               end;
@@ -647,7 +659,12 @@ unit ptconst;
 end.
 {
   $Log$
-  Revision 1.31  1998-12-11 00:03:41  peter
+  Revision 1.32  1998-12-11 16:50:23  florian
+    + typed const int64 and qword
+    + unary minus-operator  q1:=-q2;
+    + not-operator
+
+  Revision 1.31  1998/12/11 00:03:41  peter
     + globtype,tokens,version unit splitted from globals
 
   Revision 1.30  1998/11/27 14:34:42  peter

+ 33 - 1
compiler/tcmat.pas

@@ -227,6 +227,22 @@ implementation
                }
              end
 {$endif SUPPORT_MMX}
+         else if is_64bitint(p^.left^.resulttype) then
+           begin
+              firstpass(p^.left);
+              p^.registersfpu:=p^.left^.registersfpu;
+{$ifdef SUPPORT_MMX}
+              p^.registersmmx:=p^.left^.registersmmx;
+{$endif SUPPORT_MMX}
+              p^.registers32:=p^.left^.registers32;
+              if codegenerror then
+                exit;
+              if (p^.left^.location.loc<>LOC_REGISTER) and
+                (p^.registers32<2) then
+              p^.registers32:=2;
+              p^.location.loc:=LOC_REGISTER;
+              p^.resulttype:=p^.left^.resulttype;
+           end
          else if (p^.left^.resulttype^.deftype=orddef) then
            begin
               p^.left:=gentypeconvnode(p^.left,s32bitdef);
@@ -318,6 +334,17 @@ implementation
              end
          else
 {$endif SUPPORT_MMX}
+           if is_64bitint(p^.left^.resulttype) then
+             begin
+                p^.registers32:=p^.left^.registers32;
+                if (p^.location.loc in [LOC_REFERENCE,LOC_MEM,LOC_CREGISTER]) then
+                 begin
+                   p^.location.loc:=LOC_REGISTER;
+                   if (p^.registers32<2) then
+                    p^.registers32:=2;
+                 end;
+             end
+         else
            begin
               p^.left:=gentypeconvnode(p^.left,s32bitdef);
               firstpass(p^.left);
@@ -342,7 +369,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.9  1998-12-11 16:10:12  florian
+  Revision 1.10  1998-12-11 16:50:24  florian
+    + typed const int64 and qword
+    + unary minus-operator  q1:=-q2;
+    + not-operator
+
+  Revision 1.9  1998/12/11 16:10:12  florian
     + shifting for 64 bit ints added
     * bug in getexplicitregister32 fixed: usableregs wasn't decremented !!