Browse Source

* cg.a_load_* get a from and to size specifier
* makeregsize only accepts newregister
* i386 uses generic tcgnotnode,tcgunaryminus

peter 22 years ago
parent
commit
d91c880148

+ 40 - 40
compiler/cg64f32.pas

@@ -84,8 +84,7 @@ unit cg64f32;
         }
         }
         function optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : qword; var reg: tregister64): boolean;override;
         function optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : qword; var reg: tregister64): boolean;override;
 
 
-        procedure g_rangecheck64(list: taasmoutput; const p: tnode;
-          const todef: tdef); override;
+        procedure g_rangecheck64(list: taasmoutput; const l:tlocation;fromdef,todef: tdef); override;
       end;
       end;
 
 
     {# Creates a tregister64 record from 2 32 Bit registers. }
     {# Creates a tregister64 record from 2 32 Bit registers. }
@@ -131,10 +130,10 @@ unit cg64f32;
             reg.reglo:=reg.reghi;
             reg.reglo:=reg.reghi;
             reg.reghi:=tmpreg;
             reg.reghi:=tmpreg;
           end;
           end;
-        cg.a_load_reg_ref(list,OS_32,reg.reglo,ref);
+        cg.a_load_reg_ref(list,OS_32,OS_32,reg.reglo,ref);
         tmpref := ref;
         tmpref := ref;
         inc(tmpref.offset,4);
         inc(tmpref.offset,4);
-        cg.a_load_reg_ref(list,OS_32,reg.reghi,tmpref);
+        cg.a_load_reg_ref(list,OS_32,OS_32,reg.reghi,tmpref);
       end;
       end;
 
 
     procedure tcg64f32.a_load64_const_ref(list : taasmoutput;value : qword;const ref : treference);
     procedure tcg64f32.a_load64_const_ref(list : taasmoutput;value : qword;const ref : treference);
@@ -190,7 +189,7 @@ unit cg64f32;
             cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.index,tmpreg);
             cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,tmpref.index,tmpreg);
             tmpref.index:=tmpreg;
             tmpref.index:=tmpreg;
           end;
           end;
-        cg.a_load_ref_reg(list,OS_32,tmpref,reg.reglo);
+        cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reglo);
         inc(tmpref.offset,4);
         inc(tmpref.offset,4);
 {$ifdef newra}
 {$ifdef newra}
         if delete then
         if delete then
@@ -199,7 +198,7 @@ unit cg64f32;
             reference_release(list,tmpref);
             reference_release(list,tmpref);
           end;
           end;
 {$endif}
 {$endif}
-        cg.a_load_ref_reg(list,OS_32,tmpref,reg.reghi);
+        cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg.reghi);
 {$ifdef newra}
 {$ifdef newra}
         if got_scratch then
         if got_scratch then
           rg.ungetregisterint(list,tmpreg);
           rg.ungetregisterint(list,tmpreg);
@@ -295,12 +294,12 @@ unit cg64f32;
         tmpref: treference;
         tmpref: treference;
       begin
       begin
         if target_info.endian = endian_big then
         if target_info.endian = endian_big then
-          cg.a_load_reg_ref(list,OS_32,reg,ref)
+          cg.a_load_reg_ref(list,OS_32,OS_32,reg,ref)
         else
         else
           begin
           begin
             tmpref := ref;
             tmpref := ref;
             inc(tmpref.offset,4);
             inc(tmpref.offset,4);
-            cg.a_load_reg_ref(list,OS_32,reg,tmpref)
+            cg.a_load_reg_ref(list,OS_32,OS_32,reg,tmpref)
           end;
           end;
       end;
       end;
 
 
@@ -309,12 +308,12 @@ unit cg64f32;
         tmpref: treference;
         tmpref: treference;
       begin
       begin
         if target_info.endian = endian_little then
         if target_info.endian = endian_little then
-          cg.a_load_reg_ref(list,OS_32,reg,ref)
+          cg.a_load_reg_ref(list,OS_32,OS_32,reg,ref)
         else
         else
           begin
           begin
             tmpref := ref;
             tmpref := ref;
             inc(tmpref.offset,4);
             inc(tmpref.offset,4);
-            cg.a_load_reg_ref(list,OS_32,reg,tmpref)
+            cg.a_load_reg_ref(list,OS_32,OS_32,reg,tmpref)
           end;
           end;
       end;
       end;
 
 
@@ -323,12 +322,12 @@ unit cg64f32;
         tmpref: treference;
         tmpref: treference;
       begin
       begin
         if target_info.endian = endian_big then
         if target_info.endian = endian_big then
-          cg.a_load_ref_reg(list,OS_32,ref,reg)
+          cg.a_load_ref_reg(list,OS_32,OS_32,ref,reg)
         else
         else
           begin
           begin
             tmpref := ref;
             tmpref := ref;
             inc(tmpref.offset,4);
             inc(tmpref.offset,4);
-            cg.a_load_ref_reg(list,OS_32,tmpref,reg)
+            cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg)
           end;
           end;
       end;
       end;
 
 
@@ -337,12 +336,12 @@ unit cg64f32;
         tmpref: treference;
         tmpref: treference;
       begin
       begin
         if target_info.endian = endian_little then
         if target_info.endian = endian_little then
-          cg.a_load_ref_reg(list,OS_32,ref,reg)
+          cg.a_load_ref_reg(list,OS_32,OS_32,ref,reg)
         else
         else
           begin
           begin
             tmpref := ref;
             tmpref := ref;
             inc(tmpref.offset,4);
             inc(tmpref.offset,4);
-            cg.a_load_ref_reg(list,OS_32,tmpref,reg)
+            cg.a_load_ref_reg(list,OS_32,OS_32,tmpref,reg)
           end;
           end;
       end;
       end;
 
 
@@ -623,7 +622,7 @@ unit cg64f32;
       end;
       end;
 
 
 
 
-    procedure tcg64f32.g_rangecheck64(list : taasmoutput;const p : tnode;const todef : tdef);
+    procedure tcg64f32.g_rangecheck64(list : taasmoutput;const l:tlocation;fromdef,todef:tdef);
 
 
       var
       var
         neglabel,
         neglabel,
@@ -631,14 +630,13 @@ unit cg64f32;
         endlabel: tasmlabel;
         endlabel: tasmlabel;
         hreg   : tregister;
         hreg   : tregister;
         hdef   :  torddef;
         hdef   :  torddef;
-        fromdef : tdef;
         opsize   : tcgsize;
         opsize   : tcgsize;
         oldregisterdef: boolean;
         oldregisterdef: boolean;
         from_signed,to_signed: boolean;
         from_signed,to_signed: boolean;
         got_scratch: boolean;
         got_scratch: boolean;
+        temploc : tlocation;
 
 
       begin
       begin
-         fromdef:=p.resulttype.def;
          from_signed := is_signed(fromdef);
          from_signed := is_signed(fromdef);
          to_signed := is_signed(todef);
          to_signed := is_signed(todef);
 
 
@@ -648,9 +646,9 @@ unit cg64f32;
              registerdef := false;
              registerdef := false;
 
 
              { get the high dword in a register }
              { get the high dword in a register }
-             if p.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
+             if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                begin
                begin
-                 hreg := p.location.registerhigh;
+                 hreg := l.registerhigh;
                  got_scratch := false
                  got_scratch := false
                end
                end
              else
              else
@@ -661,7 +659,7 @@ unit cg64f32;
                  hreg := cg.get_scratch_reg_int(list,OS_INT);
                  hreg := cg.get_scratch_reg_int(list,OS_INT);
                {$endif}
                {$endif}
                  got_scratch := true;
                  got_scratch := true;
-                 a_load64high_ref_reg(list,p.location.reference,hreg);
+                 a_load64high_ref_reg(list,l.reference,hreg);
                end;
                end;
              objectlibrary.getlabel(poslabel);
              objectlibrary.getlabel(poslabel);
 
 
@@ -689,14 +687,12 @@ unit cg64f32;
              { simple cardinal                                          }
              { simple cardinal                                          }
              cg.a_label(list,poslabel);
              cg.a_label(list,poslabel);
              hdef:=torddef.create(u32bit,0,cardinal($ffffffff));
              hdef:=torddef.create(u32bit,0,cardinal($ffffffff));
-             { the real p.resulttype.def is already saved in fromdef }
-             p.resulttype.def := hdef;
              { no use in calling just "g_rangecheck" since that one will }
              { no use in calling just "g_rangecheck" since that one will }
              { simply call the inherited method too (JM)                 }
              { simply call the inherited method too (JM)                 }
-             cg.g_rangecheck(list,p,todef);
+             location_copy(temploc,l);
+             temploc.size:=OS_32;
+             cg.g_rangecheck(list,temploc,hdef,todef);
              hdef.free;
              hdef.free;
-             { restore original resulttype.def }
-             p.resulttype.def := fromdef;
 
 
              if from_signed and to_signed then
              if from_signed and to_signed then
                begin
                begin
@@ -705,9 +701,9 @@ unit cg64f32;
                  { if the high dword = $ffffffff, then the low dword (when }
                  { if the high dword = $ffffffff, then the low dword (when }
                  { considered as a longint) must be < 0                    }
                  { considered as a longint) must be < 0                    }
                  cg.a_label(list,neglabel);
                  cg.a_label(list,neglabel);
-                 if p.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
+                 if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                    begin
                    begin
-                     hreg := p.location.registerlow;
+                     hreg := l.registerlow;
                      got_scratch := false
                      got_scratch := false
                    end
                    end
                  else
                  else
@@ -718,7 +714,7 @@ unit cg64f32;
                      hreg := cg.get_scratch_reg_int(list,OS_INT);
                      hreg := cg.get_scratch_reg_int(list,OS_INT);
                    {$endif}
                    {$endif}
                      got_scratch := true;
                      got_scratch := true;
-                     a_load64low_ref_reg(list,p.location.reference,hreg);
+                     a_load64low_ref_reg(list,l.reference,hreg);
                    end;
                    end;
                  { get a new neglabel (JM) }
                  { get a new neglabel (JM) }
                  objectlibrary.getlabel(neglabel);
                  objectlibrary.getlabel(neglabel);
@@ -738,14 +734,13 @@ unit cg64f32;
                  { longint($80000000) and -1 (JM)               }
                  { longint($80000000) and -1 (JM)               }
                  cg.a_label(list,neglabel);
                  cg.a_label(list,neglabel);
                  hdef:=torddef.create(s32bit,longint($80000000),-1);
                  hdef:=torddef.create(s32bit,longint($80000000),-1);
-                 p.resulttype.def := hdef;
-                 cg.g_rangecheck(list,p,todef);
+                 location_copy(temploc,l);
+                 temploc.size:=OS_32;
+                 cg.g_rangecheck(list,temploc,hdef,todef);
                  hdef.free;
                  hdef.free;
                  cg.a_label(list,endlabel);
                  cg.a_label(list,endlabel);
                end;
                end;
              registerdef := oldregisterdef;
              registerdef := oldregisterdef;
-             p.resulttype.def := fromdef;
-             { restore p's resulttype.def }
            end
            end
          else
          else
            { todef = 64bit int }
            { todef = 64bit int }
@@ -759,17 +754,17 @@ unit cg64f32;
                (torddef(fromdef).typ = u64bit)) then
                (torddef(fromdef).typ = u64bit)) then
              begin
              begin
                { in all cases, there is only a problem if the higest bit is set }
                { in all cases, there is only a problem if the higest bit is set }
-               if p.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
+               if l.loc in [LOC_REGISTER,LOC_CREGISTER] then
                  begin
                  begin
                    if is_64bit(fromdef) then
                    if is_64bit(fromdef) then
                      begin
                      begin
-                       hreg := p.location.registerhigh;
+                       hreg := l.registerhigh;
                        opsize := OS_32;
                        opsize := OS_32;
                      end
                      end
                    else
                    else
                      begin
                      begin
-                       hreg := p.location.register;
-                       opsize := def_cgsize(p.resulttype.def);
+                       hreg := l.register;
+                       opsize := def_cgsize(fromdef);
                      end;
                      end;
                    got_scratch := false;
                    got_scratch := false;
                  end
                  end
@@ -782,11 +777,11 @@ unit cg64f32;
                  {$endif}
                  {$endif}
                    got_scratch := true;
                    got_scratch := true;
 
 
-                   opsize := def_cgsize(p.resulttype.def);
+                   opsize := def_cgsize(fromdef);
                    if opsize in [OS_64,OS_S64] then
                    if opsize in [OS_64,OS_S64] then
-                     a_load64high_ref_reg(list,p.location.reference,hreg)
+                     a_load64high_ref_reg(list,l.reference,hreg)
                    else
                    else
-                     cg.a_load_ref_reg(list,opsize,p.location.reference,hreg);
+                     cg.a_load_ref_reg(list,opsize,OS_INT,l.reference,hreg);
                  end;
                  end;
                objectlibrary.getlabel(poslabel);
                objectlibrary.getlabel(poslabel);
                cg.a_cmp_const_reg_label(list,opsize,OC_GTE,0,hreg,poslabel);
                cg.a_cmp_const_reg_label(list,opsize,OC_GTE,0,hreg,poslabel);
@@ -909,7 +904,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.46  2003-06-03 13:01:59  daniel
+  Revision 1.47  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.46  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.45  2003/06/01 21:38:06  peter
   Revision 1.45  2003/06/01 21:38:06  peter

+ 9 - 6
compiler/cg64f64.pas

@@ -35,7 +35,7 @@ unit cg64f64;
        aasmbase,aasmtai,aasmcpu,
        aasmbase,aasmtai,aasmcpu,
        cpuinfo, cpubase,
        cpuinfo, cpubase,
        cginfo, cgobj,
        cginfo, cgobj,
-       node,symtype;
+       symtype;
 
 
     type
     type
       {# Defines all the methods required on 32-bit processors
       {# Defines all the methods required on 32-bit processors
@@ -77,8 +77,7 @@ unit cg64f64;
         function optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : qword; var reg: tregister64): boolean;override;
         function optimize64_op_const_reg(list: taasmoutput; var op: topcg; var a : qword; var reg: tregister64): boolean;override;
 
 
         { override to catch 64bit rangechecks }
         { override to catch 64bit rangechecks }
-        procedure g_rangecheck64(list: taasmoutput; const p: tnode;
-          const todef: tdef); override;
+        procedure g_rangecheck64(list: taasmoutput; const l: tlocation;fromdef,todef: tdef); override;
       end;
       end;
 
 
   implementation
   implementation
@@ -198,8 +197,7 @@ unit cg64f64;
       begin
       begin
       end;
       end;
 
 
-    procedure tcg64f64.g_rangecheck64(list: taasmoutput; const p: tnode;
-      const todef: tdef);
+    procedure tcg64f64.g_rangecheck64(list: taasmoutput; const p: tnode;def: tdef);
       begin
       begin
       end;
       end;
 
 
@@ -225,7 +223,12 @@ unit cg64f64;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.7  2003-05-30 23:49:18  jonas
+  Revision 1.8  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.7  2003/05/30 23:49:18  jonas
     * a_load_loc_reg now has an extra size parameter for the destination
     * a_load_loc_reg now has an extra size parameter for the destination
       register (properly fixes what I worked around in revision 1.106 of
       register (properly fixes what I worked around in revision 1.106 of
       ncgutil.pas)
       ncgutil.pas)

+ 62 - 69
compiler/cgobj.pas

@@ -41,7 +41,7 @@ unit cgobj;
        cclasses,aasmbase,aasmtai,aasmcpu,symtable,
        cclasses,aasmbase,aasmtai,aasmcpu,symtable,
        cpubase,cpuinfo,
        cpubase,cpuinfo,
        cginfo,
        cginfo,
-       symconst,symbase,symtype,symdef,node
+       symconst,symbase,symtype,symdef
 {$ifdef delphi}
 {$ifdef delphi}
        ,dmisc
        ,dmisc
 {$endif}
 {$endif}
@@ -193,13 +193,13 @@ unit cgobj;
           procedure a_load_const_reg(list : taasmoutput;size : tcgsize;a : aword;register : tregister);virtual; abstract;
           procedure a_load_const_reg(list : taasmoutput;size : tcgsize;a : aword;register : tregister);virtual; abstract;
           procedure a_load_const_ref(list : taasmoutput;size : tcgsize;a : aword;const ref : treference);virtual;
           procedure a_load_const_ref(list : taasmoutput;size : tcgsize;a : aword;const ref : treference);virtual;
           procedure a_load_const_loc(list : taasmoutput;a : aword;const loc : tlocation);
           procedure a_load_const_loc(list : taasmoutput;a : aword;const loc : tlocation);
-          procedure a_load_reg_ref(list : taasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual; abstract;
-          procedure a_load_reg_reg(list : taasmoutput;fromsize, tosize : tcgsize;reg1,reg2 : tregister);virtual; abstract;
-          procedure a_load_reg_loc(list : taasmoutput;size : tcgsize;reg : tregister;const loc: tlocation);
-          procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual; abstract;
-          procedure a_load_ref_ref(list : taasmoutput;size : tcgsize;const sref : treference;const dref : treference);virtual;
-          procedure a_load_loc_reg(list : taasmoutput; dstsize: tcgsize; const loc: tlocation; reg : tregister);
-          procedure a_load_loc_ref(list : taasmoutput;const loc: tlocation; const ref : treference);
+          procedure a_load_reg_ref(list : taasmoutput;fromsize,tosize : tcgsize;register : tregister;const ref : treference);virtual; abstract;
+          procedure a_load_reg_reg(list : taasmoutput;fromsize,tosize : tcgsize;reg1,reg2 : tregister);virtual; abstract;
+          procedure a_load_reg_loc(list : taasmoutput;fromsize : tcgsize;reg : tregister;const loc: tlocation);
+          procedure a_load_ref_reg(list : taasmoutput;fromsize,tosize : tcgsize;const ref : treference;register : tregister);virtual; abstract;
+          procedure a_load_ref_ref(list : taasmoutput;fromsize,tosize : tcgsize;const sref : treference;const dref : treference);virtual;
+          procedure a_load_loc_reg(list : taasmoutput;tosize: tcgsize; const loc: tlocation; reg : tregister);
+          procedure a_load_loc_ref(list : taasmoutput;tosize: tcgsize; const loc: tlocation; const ref : treference);
           procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);virtual; abstract;
           procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);virtual; abstract;
 
 
           { fpu move instructions }
           { fpu move instructions }
@@ -356,11 +356,10 @@ unit cgobj;
              @param(p Node which contains the value to check)
              @param(p Node which contains the value to check)
              @param(todef Type definition of node to range check)
              @param(todef Type definition of node to range check)
           }
           }
-          procedure g_rangecheck(list: taasmoutput; const p: tnode;
-            const todef: tdef); virtual;
+          procedure g_rangecheck(list: taasmoutput; const l:tlocation; fromdef,todef: tdef); virtual;
 
 
           {# Generates overflow checking code for a node }
           {# Generates overflow checking code for a node }
-          procedure g_overflowcheck(list: taasmoutput; const p: tnode); virtual; abstract;
+          procedure g_overflowcheck(list: taasmoutput; const l:tlocation; def:tdef); virtual; abstract;
 
 
           procedure g_copyvaluepara_openarray(list : taasmoutput;const ref:treference;elesize:integer);virtual;abstract;
           procedure g_copyvaluepara_openarray(list : taasmoutput;const ref:treference;elesize:integer);virtual;abstract;
           {# Emits instructions which should be emitted when entering
           {# Emits instructions which should be emitted when entering
@@ -484,8 +483,7 @@ unit cgobj;
 
 
 
 
         { override to catch 64bit rangechecks }
         { override to catch 64bit rangechecks }
-        procedure g_rangecheck64(list: taasmoutput; const p: tnode;
-          const todef: tdef);virtual;abstract;
+        procedure g_rangecheck64(list: taasmoutput; const l:tlocation; fromdef,todef: tdef);virtual;abstract;
     end;
     end;
 
 
     var
     var
@@ -613,7 +611,7 @@ unit cgobj;
                  reference_reset(ref);
                  reference_reset(ref);
                  ref.base:=locpara.reference.index;
                  ref.base:=locpara.reference.index;
                  ref.offset:=locpara.reference.offset;
                  ref.offset:=locpara.reference.offset;
-                 a_load_reg_ref(list,size,r,ref);
+                 a_load_reg_ref(list,size,size,r,ref);
               end
               end
             else
             else
               internalerror(2002071004);
               internalerror(2002071004);
@@ -649,7 +647,7 @@ unit cgobj;
       {$else}
       {$else}
          hr:=get_scratch_reg_int(list,size);
          hr:=get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
-         a_load_ref_reg(list,size,r,hr);
+         a_load_ref_reg(list,size,size,r,hr);
          a_param_reg(list,size,hr,locpara);
          a_param_reg(list,size,hr,locpara);
       {$ifdef newra}
       {$ifdef newra}
          rg.ungetregisterint(list,hr);
          rg.ungetregisterint(list,hr);
@@ -714,7 +712,7 @@ unit cgobj;
                        some generic implementations
                        some generic implementations
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure tcg.a_load_ref_ref(list : taasmoutput;size : tcgsize;const sref : treference;const dref : treference);
+    procedure tcg.a_load_ref_ref(list : taasmoutput;fromsize,tosize : tcgsize;const sref : treference;const dref : treference);
 
 
       var
       var
         tmpreg: tregister;
         tmpreg: tregister;
@@ -732,7 +730,7 @@ unit cgobj;
         { doesn't have an 8bit component which is directly addressable) }
         { doesn't have an 8bit component which is directly addressable) }
         pushed_reg.enum:=R_INTREGISTER;
         pushed_reg.enum:=R_INTREGISTER;
         pushed_reg.number:=NR_NO;
         pushed_reg.number:=NR_NO;
-        if size in [OS_8,OS_S8] then
+        if tosize in [OS_8,OS_S8] then
         {$ifndef newra}
         {$ifndef newra}
           if (rg.countunusedregsint = 0) then
           if (rg.countunusedregsint = 0) then
             begin
             begin
@@ -755,19 +753,19 @@ unit cgobj;
             end
             end
           else
           else
         {$endif}
         {$endif}
-            tmpreg := rg.getregisterint(list,size)
+            tmpreg := rg.getregisterint(list,tosize)
         else
         else
 {$endif i386}
 {$endif i386}
 {$ifdef newra}
 {$ifdef newra}
-        tmpreg:=rg.getregisterint(list,size);
+        tmpreg:=rg.getregisterint(list,tosize);
 {$else}
 {$else}
-        tmpreg := get_scratch_reg_int(list,size);
+        tmpreg := get_scratch_reg_int(list,tosize);
 {$endif}
 {$endif}
-        a_load_ref_reg(list,size,sref,tmpreg);
-        a_load_reg_ref(list,size,tmpreg,dref);
+        a_load_ref_reg(list,fromsize,tosize,sref,tmpreg);
+        a_load_reg_ref(list,tosize,tosize,tmpreg,dref);
 {$ifdef i386}
 {$ifdef i386}
 {$ifndef newra}
 {$ifndef newra}
-        if size in [OS_8,OS_S8] then
+        if tosize in [OS_8,OS_S8] then
           begin
           begin
             if (pushed_reg.number<>NR_NO) then
             if (pushed_reg.number<>NR_NO) then
               list.concat(taicpu.op_reg(A_POP,S_L,pushed_reg))
               list.concat(taicpu.op_reg(A_POP,S_L,pushed_reg))
@@ -797,7 +795,7 @@ unit cgobj;
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
 {$endif}
 {$endif}
         a_load_const_reg(list,size,a,tmpreg);
         a_load_const_reg(list,size,a,tmpreg);
-        a_load_reg_ref(list,size,tmpreg,ref);
+        a_load_reg_ref(list,size,size,tmpreg,ref);
 {$ifdef newra}
 {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
 {$else}
 {$else}
@@ -819,45 +817,45 @@ unit cgobj;
       end;
       end;
 
 
 
 
-    procedure tcg.a_load_reg_loc(list : taasmoutput;size : tcgsize;reg : tregister;const loc: tlocation);
+    procedure tcg.a_load_reg_loc(list : taasmoutput;fromsize : tcgsize;reg : tregister;const loc: tlocation);
       begin
       begin
         case loc.loc of
         case loc.loc of
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
-            a_load_reg_ref(list,loc.size,reg,loc.reference);
+            a_load_reg_ref(list,fromsize,loc.size,reg,loc.reference);
           LOC_REGISTER,LOC_CREGISTER:
           LOC_REGISTER,LOC_CREGISTER:
-            a_load_reg_reg(list,size,loc.size,reg,loc.register);
+            a_load_reg_reg(list,fromsize,loc.size,reg,loc.register);
           else
           else
             internalerror(200203271);
             internalerror(200203271);
         end;
         end;
       end;
       end;
 
 
 
 
-    procedure tcg.a_load_loc_reg(list : taasmoutput; dstsize: tcgsize; const loc: tlocation; reg : tregister);
+    procedure tcg.a_load_loc_reg(list : taasmoutput; tosize: tcgsize; const loc: tlocation; reg : tregister);
 
 
       begin
       begin
         case loc.loc of
         case loc.loc of
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
-            a_load_ref_reg(list,loc.size,loc.reference,reg);
+            a_load_ref_reg(list,loc.size,tosize,loc.reference,reg);
           LOC_REGISTER,LOC_CREGISTER:
           LOC_REGISTER,LOC_CREGISTER:
-            a_load_reg_reg(list,loc.size,dstsize,loc.register,reg);
+            a_load_reg_reg(list,loc.size,tosize,loc.register,reg);
           LOC_CONSTANT:
           LOC_CONSTANT:
-            a_load_const_reg(list,loc.size,loc.value,reg);
+            a_load_const_reg(list,tosize,loc.value,reg);
           else
           else
             internalerror(200109092);
             internalerror(200109092);
         end;
         end;
       end;
       end;
 
 
 
 
-    procedure tcg.a_load_loc_ref(list : taasmoutput;const loc: tlocation; const ref : treference);
+    procedure tcg.a_load_loc_ref(list : taasmoutput;tosize: tcgsize; const loc: tlocation; const ref : treference);
 
 
       begin
       begin
         case loc.loc of
         case loc.loc of
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
-            a_load_ref_ref(list,loc.size,loc.reference,ref);
+            a_load_ref_ref(list,loc.size,tosize,loc.reference,ref);
           LOC_REGISTER,LOC_CREGISTER:
           LOC_REGISTER,LOC_CREGISTER:
-            a_load_reg_ref(list,loc.size,loc.register,ref);
+            a_load_reg_ref(list,loc.size,tosize,loc.register,ref);
           LOC_CONSTANT:
           LOC_CONSTANT:
-            a_load_const_ref(list,loc.size,loc.value,ref);
+            a_load_const_ref(list,tosize,loc.value,ref);
           else
           else
             internalerror(200109302);
             internalerror(200109302);
         end;
         end;
@@ -873,7 +871,7 @@ unit cgobj;
 {$else}
 {$else}
         tmpreg := get_scratch_reg_address(list);
         tmpreg := get_scratch_reg_address(list);
 {$endif}
 {$endif}
-        a_load_ref_reg(list,OS_ADDR,ref,tmpreg);
+        a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,tmpreg);
         a_call_reg(list,tmpreg);
         a_call_reg(list,tmpreg);
 {$ifdef newra}
 {$ifdef newra}
         rg.ungetaddressregister(list,tmpreg);
         rg.ungetaddressregister(list,tmpreg);
@@ -1028,9 +1026,9 @@ unit cgobj;
       {$else}
       {$else}
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
-        a_load_ref_reg(list,size,ref,tmpreg);
-        a_op_const_reg(list,op,OS_INT,a,tmpreg);
-        a_load_reg_ref(list,size,tmpreg,ref);
+        a_load_ref_reg(list,size,size,ref,tmpreg);
+        a_op_const_reg(list,op,size,a,tmpreg);
+        a_load_reg_ref(list,size,size,tmpreg,ref);
       {$ifdef newra}
       {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
       {$else}
       {$else}
@@ -1064,9 +1062,9 @@ unit cgobj;
       {$else}
       {$else}
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
-        a_load_ref_reg(list,size,ref,tmpreg);
+        a_load_ref_reg(list,size,size,ref,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
-        a_load_reg_ref(list,size,tmpreg,ref);
+        a_load_reg_ref(list,size,size,tmpreg,ref);
       {$ifdef newra}
       {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
       {$else}
       {$else}
@@ -1085,7 +1083,7 @@ unit cgobj;
           OP_NOT,OP_NEG:
           OP_NOT,OP_NEG:
             { handle it as "load ref,reg; op reg" }
             { handle it as "load ref,reg; op reg" }
             begin
             begin
-              a_load_ref_reg(list,size,ref,reg);
+              a_load_ref_reg(list,size,size,ref,reg);
               a_op_reg_reg(list,op,size,reg,reg);
               a_op_reg_reg(list,op,size,reg,reg);
             end;
             end;
           else
           else
@@ -1095,7 +1093,7 @@ unit cgobj;
             {$else}
             {$else}
               tmpreg := get_scratch_reg_int(list,size);
               tmpreg := get_scratch_reg_int(list,size);
             {$endif}
             {$endif}
-              a_load_ref_reg(list,size,ref,tmpreg);
+              a_load_ref_reg(list,size,size,ref,tmpreg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
             {$ifdef newra}
             {$ifdef newra}
               rg.ungetregisterint(list,tmpreg);
               rg.ungetregisterint(list,tmpreg);
@@ -1137,7 +1135,7 @@ unit cgobj;
             {$else}
             {$else}
               tmpreg := get_scratch_reg_int(list,loc.size);
               tmpreg := get_scratch_reg_int(list,loc.size);
             {$endif}
             {$endif}
-              a_load_ref_reg(list,loc.size,ref,tmpreg);
+              a_load_ref_reg(list,loc.size,loc.size,ref,tmpreg);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
             {$ifdef newra}
             {$ifdef newra}
               rg.ungetregisterint(list,tmpreg);
               rg.ungetregisterint(list,tmpreg);
@@ -1197,7 +1195,7 @@ unit cgobj;
       {$else}
       {$else}
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
-        a_load_ref_reg(list,size,ref,tmpreg);
+        a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
       {$ifdef newra}
       {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
@@ -1231,7 +1229,7 @@ unit cgobj;
       {$else}
       {$else}
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
-        a_load_ref_reg(list,size,ref,tmpreg);
+        a_load_ref_reg(list,size,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
       {$ifdef newra}
       {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
@@ -1284,8 +1282,7 @@ unit cgobj;
               else
               else
 {$endif i386}
 {$endif i386}
                 tmpreg := get_scratch_reg_int(list,size);
                 tmpreg := get_scratch_reg_int(list,size);
-              {tmpreg := rg.makeregsize(tmpreg,size);}
-              a_load_ref_reg(list,size,loc.reference,tmpreg);
+              a_load_ref_reg(list,size,size,loc.reference,tmpreg);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
 {$ifdef i386}
 {$ifdef i386}
               if size in [OS_8,OS_S8] then
               if size in [OS_8,OS_S8] then
@@ -1450,7 +1447,7 @@ unit cgobj;
       end;
       end;
 
 
 
 
-    procedure tcg.g_rangecheck(list: taasmoutput; const p: tnode;const todef: tdef);
+    procedure tcg.g_rangecheck(list: taasmoutput; const l:tlocation;fromdef,todef: tdef);
     { generate range checking code for the value at location p. The type     }
     { generate range checking code for the value at location p. The type     }
     { type used is checked against todefs ranges. fromdef (p.resulttype.def) }
     { type used is checked against todefs ranges. fromdef (p.resulttype.def) }
     { is the original type used at that location. When both defs are equal   }
     { is the original type used at that location. When both defs are equal   }
@@ -1464,24 +1461,22 @@ unit cgobj;
       var
       var
         neglabel : tasmlabel;
         neglabel : tasmlabel;
         hreg : tregister;
         hreg : tregister;
-        fromdef : tdef;
         lto,hto,
         lto,hto,
         lfrom,hfrom : TConstExprInt;
         lfrom,hfrom : TConstExprInt;
         from_signed: boolean;
         from_signed: boolean;
       begin
       begin
         { range checking on and range checkable value? }
         { range checking on and range checkable value? }
         if not(cs_check_range in aktlocalswitches) or
         if not(cs_check_range in aktlocalswitches) or
-           not(todef.deftype in [orddef,enumdef,arraydef]) then
+           not(fromdef.deftype in [orddef,enumdef,arraydef]) then
           exit;
           exit;
-        if is_64bit(p.resulttype.def) or is_64bit(todef) then
+        if is_64bit(fromdef) or is_64bit(todef) then
           begin
           begin
-             cg64.g_rangecheck64(list,p,todef);
+             cg64.g_rangecheck64(list,l,fromdef,todef);
              exit;
              exit;
           end;
           end;
         { only check when assigning to scalar, subranges are different, }
         { only check when assigning to scalar, subranges are different, }
         { when todef=fromdef then the check is always generated         }
         { when todef=fromdef then the check is always generated         }
-        fromdef:=p.resulttype.def;
-        getrange(p.resulttype.def,lfrom,hfrom);
+        getrange(fromdef,lfrom,hfrom);
         getrange(todef,lto,hto);
         getrange(todef,lto,hto);
         { no range check if from and to are equal and are both longint/dword }
         { no range check if from and to are equal and are both longint/dword }
         { (if we have a 32bit processor) or int64/qword, since such          }
         { (if we have a 32bit processor) or int64/qword, since such          }
@@ -1553,17 +1548,10 @@ unit cgobj;
 {$ifdef newra}
 {$ifdef newra}
         hreg:=rg.getregisterint(list,OS_INT);
         hreg:=rg.getregisterint(list,OS_INT);
 {$else}
 {$else}
-        hreg := get_scratch_reg_int(list,OS_INT);
+        hreg:=get_scratch_reg_int(list,OS_INT);
 {$endif}
 {$endif}
-        if (p.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
-          a_op_const_reg_reg(list,OP_SUB,def_cgsize(p.resulttype.def),
-           aword(lto),p.location.register,hreg)
-        else
-          begin
-            a_load_ref_reg(list,def_cgsize(p.resulttype.def),
-              p.location.reference,hreg);
-            a_op_const_reg(list,OP_SUB,OS_INT,aword(lto),hreg);
-          end;
+        a_load_loc_reg(list,OS_INT,l,hreg);
+        a_op_const_reg(list,OP_SUB,OS_INT,aword(lto),hreg);
         objectlibrary.getlabel(neglabel);
         objectlibrary.getlabel(neglabel);
         a_cmp_const_reg_label(list,OS_INT,OC_BE,aword(hto-lto),hreg,neglabel);
         a_cmp_const_reg_label(list,OS_INT,OC_BE,aword(hto-lto),hreg,neglabel);
         { !!! should happen right after the compare (JM) }
         { !!! should happen right after the compare (JM) }
@@ -1596,7 +1584,7 @@ unit cgobj;
         tmpreg := get_scratch_reg_int(list,size);
         tmpreg := get_scratch_reg_int(list,size);
       {$endif}
       {$endif}
         g_flags2reg(list,size,f,tmpreg);
         g_flags2reg(list,size,f,tmpreg);
-        a_load_reg_ref(list,size,tmpreg,ref);
+        a_load_reg_ref(list,size,size,tmpreg,ref);
       {$ifdef newra}
       {$ifdef newra}
         rg.ungetregisterint(list,tmpreg);
         rg.ungetregisterint(list,tmpreg);
       {$else}
       {$else}
@@ -1667,7 +1655,7 @@ unit cgobj;
      begin
      begin
        r.enum:=R_INTREGISTER;;
        r.enum:=R_INTREGISTER;;
        r.number:=NR_FUNCTION_RETURN_REG;
        r.number:=NR_FUNCTION_RETURN_REG;
-       a_load_reg_ref(list, OS_S32, r, href);
+       a_load_reg_ref(list, OS_S32, OS_32, r, href);
      end;
      end;
 
 
 
 
@@ -1684,7 +1672,7 @@ unit cgobj;
      begin
      begin
        r.enum:=R_INTREGISTER;
        r.enum:=R_INTREGISTER;
        r.number:=NR_FUNCTION_RETURN_REG;
        r.number:=NR_FUNCTION_RETURN_REG;
-       a_load_ref_reg(list, OS_S32, href, r);
+       a_load_ref_reg(list, OS_S32, OS_S32, href, r);
      end;
      end;
 
 
 
 
@@ -1712,7 +1700,12 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.106  2003-06-03 13:01:59  daniel
+  Revision 1.107  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.106  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.105  2003/06/01 21:38:06  peter
   Revision 1.105  2003/06/01 21:38:06  peter

+ 25 - 1
compiler/i386/cgcpu.pas

@@ -112,6 +112,25 @@ unit cgcpu;
       var
       var
         op1,op2 : TAsmOp;
         op1,op2 : TAsmOp;
       begin
       begin
+        case op of
+          OP_NEG :
+            begin
+              if (regsrc.reglo.number<>regdst.reglo.number) then
+                a_load64_reg_reg(list,regsrc,regdst);
+              list.concat(taicpu.op_reg(A_NOT,S_L,regdst.reghi));
+              list.concat(taicpu.op_reg(A_NEG,S_L,regdst.reglo));
+              list.concat(taicpu.op_const_reg(A_SBB,S_L,aword(-1),regdst.reghi));
+              exit;
+            end;
+          OP_NOT :
+            begin
+              if (regsrc.reglo.number<>regdst.reglo.number) then
+                a_load64_reg_reg(list,regsrc,regdst);
+              list.concat(taicpu.op_reg(A_NOT,S_L,regdst.reghi));
+              list.concat(taicpu.op_reg(A_NOT,S_L,regdst.reglo));
+              exit;
+            end;
+        end;
         get_64bit_ops(op,op1,op2);
         get_64bit_ops(op,op1,op2);
         list.concat(taicpu.op_reg_reg(op1,S_L,regsrc.reglo,regdst.reglo));
         list.concat(taicpu.op_reg_reg(op1,S_L,regsrc.reglo,regdst.reglo));
         list.concat(taicpu.op_reg_reg(op2,S_L,regsrc.reghi,regdst.reghi));
         list.concat(taicpu.op_reg_reg(op2,S_L,regsrc.reghi,regdst.reghi));
@@ -174,7 +193,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.34  2003-06-01 21:38:06  peter
+  Revision 1.35  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.34  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 9 - 4
compiler/i386/n386cnv.pas

@@ -136,12 +136,12 @@ implementation
                 begin
                 begin
                   href:=left.location.reference;
                   href:=left.location.reference;
                   inc(href.offset,4);
                   inc(href.offset,4);
-                  cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
+                  cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,hregister);
                   exprasmlist.concat(taicpu.op_reg(A_PUSH,S_L,hregister));
                   exprasmlist.concat(taicpu.op_reg(A_PUSH,S_L,hregister));
-                  cg.a_load_ref_reg(exprasmlist,OS_32,left.location.reference,hregister);
+                  cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hregister);
                 end
                 end
                else
                else
-                cg.a_load_ref_reg(exprasmlist,left.location.size,left.location.reference,hregister);
+                cg.a_load_ref_reg(exprasmlist,left.location.size,OS_INT,left.location.reference,hregister);
              end;
              end;
            else
            else
              internalerror(2002032218);
              internalerror(2002032218);
@@ -358,7 +358,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.61  2003-04-30 20:53:32  florian
+  Revision 1.62  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.61  2003/04/30 20:53:32  florian
     * error when address of an abstract method is taken
     * error when address of an abstract method is taken
     * fixed some x86-64 problems
     * fixed some x86-64 problems
     * merged some more x86-64 and i386 code
     * merged some more x86-64 and i386 code

+ 196 - 270
compiler/i386/n386mat.pas

@@ -27,7 +27,7 @@ unit n386mat;
 interface
 interface
 
 
     uses
     uses
-      node,nmat;
+      node,nmat,ncgmat;
 
 
     type
     type
       ti386moddivnode = class(tmoddivnode)
       ti386moddivnode = class(tmoddivnode)
@@ -40,15 +40,22 @@ interface
          function first_shlshr64bitint: tnode; override;
          function first_shlshr64bitint: tnode; override;
       end;
       end;
 
 
-      ti386unaryminusnode = class(tunaryminusnode)
-         function pass_1 : tnode;override;
-         procedure pass_2;override;
+      ti386unaryminusnode = class(tcgunaryminusnode)
+{$ifdef SUPPORT_MMX}
+         procedure second_mmx;override;
+{$endif SUPPORT_MMX}
+         procedure second_float;override;
+         function pass_1:tnode;override;
       end;
       end;
 
 
-      ti386notnode = class(tnotnode)
-         procedure pass_2;override;
+      ti386notnode = class(tcgnotnode)
+         procedure second_boolean;override;
+{$ifdef SUPPORT_MMX}
+         procedure second_mmx;override;
+{$endif SUPPORT_MMX}
       end;
       end;
 
 
+
 implementation
 implementation
 
 
     uses
     uses
@@ -866,12 +873,6 @@ implementation
          if codegenerror then
          if codegenerror then
            exit;
            exit;
 
 
-         registers32:=left.registers32;
-         registersfpu:=left.registersfpu;
-{$ifdef SUPPORT_MMX}
-         registersmmx:=left.registersmmx;
-{$endif SUPPORT_MMX}
-
          if (left.resulttype.def.deftype=floatdef) then
          if (left.resulttype.def.deftype=floatdef) then
            begin
            begin
              if (registersfpu < 1) then
              if (registersfpu < 1) then
@@ -879,166 +880,111 @@ implementation
              expectloc:=LOC_FPUREGISTER;
              expectloc:=LOC_FPUREGISTER;
            end
            end
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
-         else if (cs_mmx in aktlocalswitches) and
-           is_mmx_able_array(left.resulttype.def) then
+         else
+           if (cs_mmx in aktlocalswitches) and
+              is_mmx_able_array(left.resulttype.def) then
              begin
              begin
+               registers32:=left.registers32;
+               registersfpu:=left.registersfpu;
+               registersmmx:=left.registersmmx;
                if (left.location.loc<>LOC_MMXREGISTER) and
                if (left.location.loc<>LOC_MMXREGISTER) and
                   (registersmmx<1) then
                   (registersmmx<1) then
                  registersmmx:=1;
                  registersmmx:=1;
              end
              end
 {$endif SUPPORT_MMX}
 {$endif SUPPORT_MMX}
-         else if is_64bitint(left.resulttype.def) then
-           begin
-              if (left.location.loc<>LOC_REGISTER) and
-                 (registers32<2) then
-                registers32:=2;
-              expectloc:=LOC_REGISTER;
-           end
-         else if (left.resulttype.def.deftype=orddef) then
-           begin
-              if (left.location.loc<>LOC_REGISTER) and
-                 (registers32<1) then
-                registers32:=1;
-              expectloc:=LOC_REGISTER;
-           end;
+         else
+           inherited pass_1;
       end;
       end;
 
 
 
 
-    procedure ti386unaryminusnode.pass_2;
-
-    var r:Tregister;
-
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
-      procedure do_mmx_neg;
-        var
-           op : tasmop;
-           r: Tregister;
-        begin
-           location_reset(location,LOC_MMXREGISTER,OS_NO);
-           if cs_mmx_saturation in aktlocalswitches then
-             case mmx_type(resulttype.def) of
-                mmxs8bit:
-                  op:=A_PSUBSB;
-                mmxu8bit:
-                  op:=A_PSUBUSB;
-                mmxs16bit,mmxfixed16:
-                  op:=A_PSUBSW;
-                mmxu16bit:
-                  op:=A_PSUBUSW;
-             end
-           else
-             case mmx_type(resulttype.def) of
-                mmxs8bit,mmxu8bit:
-                  op:=A_PSUBB;
-                mmxs16bit,mmxu16bit,mmxfixed16:
-                  op:=A_PSUBW;
-                mmxs32bit,mmxu32bit:
-                  op:=A_PSUBD;
-             end;
-           r.enum:=R_MM7;
-           emit_reg_reg(op,S_NO,location.register,r);
-           emit_reg_reg(A_MOVQ,S_NO,r,location.register);
-        end;
-{$endif}
-
+    procedure ti386unaryminusnode.second_mmx;
+      var
+        r : Tregister;
+        op : tasmop;
       begin
       begin
-         if is_64bitint(left.resulttype.def) then
-           begin
-              secondpass(left);
+        secondpass(left);
+        location_reset(location,LOC_MMXREGISTER,OS_NO);
+        case left.location.loc of
+          LOC_MMXREGISTER:
+            begin
+               location.register:=left.location.register;
+               r.enum:=R_MM7;
+               emit_reg_reg(A_PXOR,S_NO,r,r);
+            end;
+          LOC_CMMXREGISTER:
+            begin
+               location.register:=rg.getregistermm(exprasmlist);
+               r.enum:=R_MM7;
+               emit_reg_reg(A_PXOR,S_NO,r,r);
+               emit_reg_reg(A_MOVQ,S_NO,left.location.register,location.register);
+            end;
+          LOC_REFERENCE,
+          LOC_CREFERENCE:
+            begin
+               reference_release(exprasmlist,left.location.reference);
+               r.enum:=R_MM7;
+               location.register:=rg.getregistermm(exprasmlist);
+               emit_reg_reg(A_PXOR,S_NO,r,r);
+               emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
+            end;
+          else
+            internalerror(200203225);
+        end;
+        if cs_mmx_saturation in aktlocalswitches then
+          case mmx_type(resulttype.def) of
+             mmxs8bit:
+               op:=A_PSUBSB;
+             mmxu8bit:
+               op:=A_PSUBUSB;
+             mmxs16bit,mmxfixed16:
+               op:=A_PSUBSW;
+             mmxu16bit:
+               op:=A_PSUBUSW;
+          end
+        else
+          case mmx_type(resulttype.def) of
+             mmxs8bit,mmxu8bit:
+               op:=A_PSUBB;
+             mmxs16bit,mmxu16bit,mmxfixed16:
+               op:=A_PSUBW;
+             mmxs32bit,mmxu32bit:
+               op:=A_PSUBD;
+          end;
+        r.enum:=R_MM7;
+        emit_reg_reg(op,S_NO,location.register,r);
+        emit_reg_reg(A_MOVQ,S_NO,r,location.register);
+      end;
+{$endif SUPPORT_MMX}
 
 
-              { load left operator in a register }
-              location_copy(location,left.location);
-              location_force_reg(exprasmlist,location,OS_64,false);
 
 
-              emit_reg(A_NOT,S_L,location.registerhigh);
-              emit_reg(A_NEG,S_L,location.registerlow);
-              emit_const_reg(A_SBB,S_L,-1,location.registerhigh);
-           end
-         else
-           begin
-              secondpass(left);
-              location_reset(location,LOC_REGISTER,OS_INT);
-              case left.location.loc of
-                 LOC_REGISTER:
-                   begin
-                      location.register:=left.location.register;
-                      emit_reg(A_NEG,S_L,location.register);
-                   end;
-                 LOC_CREGISTER:
-                   begin
-                      location.register:=rg.getregisterint(exprasmlist,OS_INT);
-                      emit_reg_reg(A_MOV,S_L,left.location.register,
-                        location.register);
-                      emit_reg(A_NEG,S_L,location.register);
-                   end;
-{$ifdef SUPPORT_MMX}
-                 LOC_MMXREGISTER:
-                   begin
-                      location_copy(location,left.location);
-                      r.enum:=R_MM7;
-                      emit_reg_reg(A_PXOR,S_NO,r,r);
-                      do_mmx_neg;
-                   end;
-                 LOC_CMMXREGISTER:
-                   begin
-                      location.register:=rg.getregistermm(exprasmlist);
-                      r.enum:=R_MM7;
-                      emit_reg_reg(A_PXOR,S_NO,r,r);
-                      emit_reg_reg(A_MOVQ,S_NO,left.location.register,
-                        location.register);
-                      do_mmx_neg;
-                   end;
-{$endif SUPPORT_MMX}
-                 LOC_REFERENCE,
-                 LOC_CREFERENCE:
-                   begin
-                      reference_release(exprasmlist,left.location.reference);
-                      if (left.resulttype.def.deftype=floatdef) then
-                        begin
-                           location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
-                           location.register.enum:=R_ST;
-                           cg.a_loadfpu_ref_reg(exprasmlist,
-                              def_cgsize(left.resulttype.def),
-                              left.location.reference,location.register);
-                           emit_none(A_FCHS,S_NO);
-                        end
-{$ifdef SUPPORT_MMX}
-                      else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(left.resulttype.def) then
-                        begin
-                           r.enum:=R_MM7;
-                           location.register:=rg.getregistermm(exprasmlist);
-                           emit_reg_reg(A_PXOR,S_NO,r,r);
-                           emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
-                           do_mmx_neg;
-                        end
-{$endif SUPPORT_MMX}
-                      else
-                        begin
-                           location.register:=rg.getregisterint(exprasmlist,OS_INT);
-                           emit_ref_reg(A_MOV,S_L,left.location.reference,location.register);
-                           emit_reg(A_NEG,S_L,location.register);
-                        end;
-                   end;
-                 LOC_FPUREGISTER,LOC_CFPUREGISTER:
-                   begin
-                      { "load st,st" is ignored by the code generator }
-                      r.enum:=R_ST;
-                      cg.a_loadfpu_reg_reg(exprasmlist,left.location.register,r);
-                      location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
-                      location.register.enum:=R_ST;
-                      emit_none(A_FCHS,S_NO);
-                   end;
-                 else
-                    internalerror(200203225);
-              end;
-           end;
-         { Here was a problem...     }
-         { Operand to be negated always     }
-         { seems to be converted to signed  }
-         { 32-bit before doing neg!!     }
-         { So this is useless...     }
-         { that's not true: -2^31 gives an overflow error if it is negaded (FK) }
-         { emitoverflowcheck(p);}
+    procedure ti386unaryminusnode.second_float;
+      var
+        r : tregister;
+      begin
+        secondpass(left);
+        location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
+        case left.location.loc of
+          LOC_REFERENCE,
+          LOC_CREFERENCE:
+            begin
+              reference_release(exprasmlist,left.location.reference);
+              location.register.enum:=R_ST;
+              cg.a_loadfpu_ref_reg(exprasmlist,
+                 def_cgsize(left.resulttype.def),
+                 left.location.reference,location.register);
+              emit_none(A_FCHS,S_NO);
+            end;
+          LOC_FPUREGISTER,
+          LOC_CFPUREGISTER:
+            begin
+               { "load st,st" is ignored by the code generator }
+               r.enum:=R_ST;
+               cg.a_loadfpu_reg_reg(exprasmlist,left.location.register,r);
+               location.register.enum:=R_ST;
+               emit_none(A_FCHS,S_NO);
+            end;
+        end;
       end;
       end;
 
 
 
 
@@ -1046,124 +992,99 @@ implementation
                                TI386NOTNODE
                                TI386NOTNODE
 *****************************************************************************}
 *****************************************************************************}
 
 
-    procedure ti386notnode.pass_2;
-      const
-         flagsinvers : array[F_E..F_BE] of tresflags =
-            (F_NE,F_E,F_LE,F_GE,F_L,F_G,F_NC,F_C,
-             F_BE,F_B,F_AE,F_A);
+    procedure ti386notnode.second_boolean;
       var
       var
          hl : tasmlabel;
          hl : tasmlabel;
          opsize : topsize;
          opsize : topsize;
-{$ifdef SUPPORT_MMX}
-         r,r2 : tregister;
-{$endif SUPPORT_MMX}
       begin
       begin
-         if is_boolean(resulttype.def) then
-          begin
-            opsize:=def_opsize(resulttype.def);
-
-            if left.expectloc=LOC_JUMP then
-             begin
-               location_reset(location,LOC_JUMP,OS_NO);
-               hl:=truelabel;
-               truelabel:=falselabel;
-               falselabel:=hl;
-               secondpass(left);
-               maketojumpbool(exprasmlist,left,lr_load_regvars);
-               hl:=truelabel;
-               truelabel:=falselabel;
-               falselabel:=hl;
-             end
-            else
-             begin
-               { the second pass could change the location of left }
-               { if it is a register variable, so we've to do      }
-               { this before the case statement                    }
-               secondpass(left);
-               case left.expectloc of
-                 LOC_FLAGS :
-                   begin
-                     location_release(exprasmlist,left.location);
-                     location_reset(location,LOC_FLAGS,OS_NO);
-                     location.resflags:=flagsinvers[left.location.resflags];
-                   end;
-                 LOC_CONSTANT,
-                 LOC_REGISTER,
-                 LOC_CREGISTER,
-                 LOC_REFERENCE,
-                 LOC_CREFERENCE :
-                   begin
-                     location_force_reg(exprasmlist,left.location,def_cgsize(resulttype.def),true);
-                     emit_reg_reg(A_TEST,opsize,left.location.register,left.location.register);
-                     location_release(exprasmlist,left.location);
-                     location_reset(location,LOC_FLAGS,OS_NO);
-                     location.resflags:=F_E;
-                   end;
-                else
-                   internalerror(200203224);
+        opsize:=def_opsize(resulttype.def);
+
+        if left.expectloc=LOC_JUMP then
+         begin
+           location_reset(location,LOC_JUMP,OS_NO);
+           hl:=truelabel;
+           truelabel:=falselabel;
+           falselabel:=hl;
+           secondpass(left);
+           maketojumpbool(exprasmlist,left,lr_load_regvars);
+           hl:=truelabel;
+           truelabel:=falselabel;
+           falselabel:=hl;
+         end
+        else
+         begin
+           { the second pass could change the location of left }
+           { if it is a register variable, so we've to do      }
+           { this before the case statement                    }
+           secondpass(left);
+           case left.expectloc of
+             LOC_FLAGS :
+               begin
+                 location_release(exprasmlist,left.location);
+                 location_reset(location,LOC_FLAGS,OS_NO);
+                 location.resflags:=left.location.resflags;
+                 inverse_flags(location.resflags);
                end;
                end;
-             end;
-          end
-{$ifdef SUPPORT_MMX}
-         else
-          if (cs_mmx in aktlocalswitches) and is_mmx_able_array(left.resulttype.def) then
-           begin
-             secondpass(left);
-             location_reset(location,LOC_MMXREGISTER,OS_NO);
-             { prepare EDI }
-             r.enum:=R_INTREGISTER;
-             r.number:=NR_EDI;
-             r2.enum:=R_MM7;
-             rg.getexplicitregisterint(exprasmlist,NR_EDI);
-             emit_const_reg(A_MOV,S_L,longint($ffffffff),r);
-             { load operand }
-             case left.location.loc of
-               LOC_MMXREGISTER:
-                 location_copy(location,left.location);
-               LOC_CMMXREGISTER:
-                 begin
-                   location.register:=rg.getregistermm(exprasmlist);
-                   emit_reg_reg(A_MOVQ,S_NO,left.location.register,location.register);
-                 end;
-               LOC_REFERENCE,
-               LOC_CREFERENCE:
-                 begin
-                   location_release(exprasmlist,left.location);
-                   location.register:=rg.getregistermm(exprasmlist);
-                   emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
-                 end;
-             end;
-             { load mask }
-             emit_reg_reg(A_MOVD,S_NO,r,r2);
-             rg.ungetregisterint(exprasmlist,r);
-             { lower 32 bit }
-             emit_reg_reg(A_PXOR,S_D,r2,location.register);
-             { shift mask }
-             emit_const_reg(A_PSLLQ,S_NO,32,r2);
-             { higher 32 bit }
-             emit_reg_reg(A_PXOR,S_D,r2,location.register);
-           end
-{$endif SUPPORT_MMX}
-         else if is_64bitint(left.resulttype.def) then
-           begin
-              secondpass(left);
-              location_copy(location,left.location);
-              location_force_reg(exprasmlist,location,OS_64,false);
+             LOC_CONSTANT,
+             LOC_REGISTER,
+             LOC_CREGISTER,
+             LOC_REFERENCE,
+             LOC_CREFERENCE :
+               begin
+                 location_force_reg(exprasmlist,left.location,def_cgsize(resulttype.def),true);
+                 emit_reg_reg(A_TEST,opsize,left.location.register,left.location.register);
+                 location_release(exprasmlist,left.location);
+                 location_reset(location,LOC_FLAGS,OS_NO);
+                 location.resflags:=F_E;
+               end;
+            else
+               internalerror(200203224);
+           end;
+         end;
+      end;
 
 
-              emit_reg(A_NOT,S_L,location.registerlow);
-              emit_reg(A_NOT,S_L,location.registerhigh);
-           end
-         else
-          begin
-            secondpass(left);
-            location_copy(location,left.location);
-            location_force_reg(exprasmlist,location,def_cgsize(resulttype.def),false);
 
 
-            opsize:=def_opsize(resulttype.def);
-            emit_reg(A_NOT,opsize,location.register);
-          end;
+{$ifdef SUPPORT_MMX}
+    procedure ti386notnode.second_mmx;
+      var
+         r,r2 : tregister;
+      begin
+        secondpass(left);
+        location_reset(location,LOC_MMXREGISTER,OS_NO);
+        { prepare EDI }
+        r.enum:=R_INTREGISTER;
+        r.number:=NR_EDI;
+        r2.enum:=R_MM7;
+        rg.getexplicitregisterint(exprasmlist,NR_EDI);
+        emit_const_reg(A_MOV,S_L,longint($ffffffff),r);
+        { load operand }
+        case left.location.loc of
+          LOC_MMXREGISTER:
+            location_copy(location,left.location);
+          LOC_CMMXREGISTER:
+            begin
+              location.register:=rg.getregistermm(exprasmlist);
+              emit_reg_reg(A_MOVQ,S_NO,left.location.register,location.register);
+            end;
+          LOC_REFERENCE,
+          LOC_CREFERENCE:
+            begin
+              location_release(exprasmlist,left.location);
+              location.register:=rg.getregistermm(exprasmlist);
+              emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
+            end;
+        end;
+        { load mask }
+        emit_reg_reg(A_MOVD,S_NO,r,r2);
+        rg.ungetregisterint(exprasmlist,r);
+        { lower 32 bit }
+        emit_reg_reg(A_PXOR,S_D,r2,location.register);
+        { shift mask }
+        emit_const_reg(A_PSLLQ,S_NO,32,r2);
+        { higher 32 bit }
+        emit_reg_reg(A_PXOR,S_D,r2,location.register);
       end;
       end;
-
+{$endif SUPPORT_MMX}
 
 
 begin
 begin
    cmoddivnode:=ti386moddivnode;
    cmoddivnode:=ti386moddivnode;
@@ -1173,7 +1094,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.56  2003-06-03 13:01:59  daniel
+  Revision 1.57  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.56  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.55  2003/05/31 15:04:31  peter
   Revision 1.55  2003/05/31 15:04:31  peter

+ 7 - 2
compiler/i386/n386obj.pas

@@ -117,7 +117,7 @@ procedure ti386classheader.cgintfwrapper(asmlist: TAAsmoutput; procdef: tprocdef
     r.number:=NR_ESP;
     r.number:=NR_ESP;
     reference_reset_base(href,r,getselfoffsetfromsp(procdef));
     reference_reset_base(href,r,getselfoffsetfromsp(procdef));
     r.number:=NR_EAX;
     r.number:=NR_EAX;
-    cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,r);
+    cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,r);
   end;
   end;
 
 
   procedure loadvmttoeax;
   procedure loadvmttoeax;
@@ -247,7 +247,12 @@ initialization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.19  2003-05-15 18:58:54  peter
+  Revision 1.20  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.19  2003/05/15 18:58:54  peter
     * removed selfpointer_offset, vmtpointer_offset
     * removed selfpointer_offset, vmtpointer_offset
     * tvarsym.adjusted_address
     * tvarsym.adjusted_address
     * address in localsymtable is now in the real direction
     * address in localsymtable is now in the real direction

+ 15 - 12
compiler/i386/n386set.pas

@@ -413,8 +413,7 @@ implementation
                      LOC_REGISTER,
                      LOC_REGISTER,
                      LOC_CREGISTER:
                      LOC_CREGISTER:
                        begin
                        begin
-                          hr.enum:=R_INTREGISTER;
-                          hr.number:=(left.location.register.number and not $ff) or R_SUBWHOLE;
+                          hr:=rg.makeregsize(left.location.register,OS_INT);
                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr);
                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr);
                        end;
                        end;
                   else
                   else
@@ -619,14 +618,13 @@ implementation
         if not(jumptable_no_range) then
         if not(jumptable_no_range) then
           begin
           begin
              { case expr less than min_ => goto elselabel }
              { case expr less than min_ => goto elselabel }
-             cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_lt,aword(min_),hregister,elselabel);
+             cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_lt,aword(min_),hregister,elselabel);
              { case expr greater than max_ => goto elselabel }
              { case expr greater than max_ => goto elselabel }
-             cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_gt,aword(max_),hregister,elselabel);
+             cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_gt,aword(max_),hregister,elselabel);
           end;
           end;
         objectlibrary.getlabel(table);
         objectlibrary.getlabel(table);
         { make it a 32bit register }
         { make it a 32bit register }
-        indexreg.enum:=R_INTREGISTER;
-        indexreg.number:=(hregister.number and not $ff) or R_SUBWHOLE;
+        indexreg:=rg.makeregsize(hregister,OS_INT);
         cg.a_load_reg_reg(exprasmlist,opsize,OS_INT,hregister,indexreg);
         cg.a_load_reg_reg(exprasmlist,opsize,OS_INT,hregister,indexreg);
         { create reference }
         { create reference }
         reference_reset_symbol(href,table,0);
         reference_reset_symbol(href,table,0);
@@ -657,15 +655,15 @@ implementation
              { need we to test the first value }
              { need we to test the first value }
              if first and (t^._low>get_min_value(left.resulttype.def)) then
              if first and (t^._low>get_min_value(left.resulttype.def)) then
                begin
                begin
-                 cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_lt,aword(t^._low),hregister,elselabel);
+                 cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_lt,aword(t^._low),hregister,elselabel);
                end;
                end;
              if t^._low=t^._high then
              if t^._low=t^._high then
                begin
                begin
                   if t^._low-last=0 then
                   if t^._low-last=0 then
-                    cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ,0,hregister,t^.statement)
+                    cg.a_cmp_const_reg_label(exprasmlist, opsize, OC_EQ,0,hregister,t^.statement)
                   else
                   else
                     begin
                     begin
-                      cg.a_op_const_reg(exprasmlist, OP_SUB, OS_INT, aword(t^._low-last), hregister);
+                      cg.a_op_const_reg(exprasmlist, OP_SUB, opsize, aword(t^._low-last), hregister);
                       emitjmp(C_Z,t^.statement);
                       emitjmp(C_Z,t^.statement);
                     end;
                     end;
                   last:=t^._low;
                   last:=t^._low;
@@ -680,7 +678,7 @@ implementation
                     begin
                     begin
                        { have we to ajust the first value ? }
                        { have we to ajust the first value ? }
                        if (t^._low>get_min_value(left.resulttype.def)) then
                        if (t^._low>get_min_value(left.resulttype.def)) then
-                         cg.a_op_const_reg(exprasmlist, OP_SUB, OS_INT, longint(t^._low), hregister);
+                         cg.a_op_const_reg(exprasmlist, OP_SUB, opsize, longint(t^._low), hregister);
                     end
                     end
                   else
                   else
                     begin
                     begin
@@ -688,7 +686,7 @@ implementation
                       { present label then the lower limit can be checked    }
                       { present label then the lower limit can be checked    }
                       { immediately. else check the range in between:       }
                       { immediately. else check the range in between:       }
 
 
-                      cg.a_op_const_reg(exprasmlist, OP_SUB, OS_INT, longint(t^._low-last), hregister);
+                      cg.a_op_const_reg(exprasmlist, OP_SUB, opsize, longint(t^._low-last), hregister);
                       { no jump necessary here if the new range starts at }
                       { no jump necessary here if the new range starts at }
                       { at the value following the previous one           }
                       { at the value following the previous one           }
                       if ((t^._low-last) <> 1) or
                       if ((t^._low-last) <> 1) or
@@ -739,7 +737,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.60  2003-06-01 21:38:06  peter
+  Revision 1.61  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.60  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 10 - 83
compiler/i386/rgcpu.pas

@@ -110,68 +110,6 @@ unit rgcpu;
        globals,verbose,
        globals,verbose,
        tgobj;
        tgobj;
 
 
-{************************************************************************}
-{                         routine helpers                                }
-{************************************************************************}
-  const
-    reg2reg32 : array[firstreg..lastreg] of Toldregister = (R_NO,
-      R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
-      R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
-      R_EAX,R_ECX,R_EDX,R_EBX,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
-    );
-    reg2reg16 : array[firstreg..lastreg] of Toldregister = (R_NO,
-      R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
-      R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
-      R_AX,R_CX,R_DX,R_BX,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
-    );
-    reg2reg8 : array[firstreg..lastreg] of Toldregister = (R_NO,
-      R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
-      R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
-      R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
-      R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
-    );
-
-    { convert a register to a specfied register size }
-    function changeregsize(r:tregister;size:topsize):tregister;
-      var
-        reg : tregister;
-      begin
-        case size of
-          S_B :
-            reg.enum:=reg2reg8[r.enum];
-          S_W :
-            reg.enum:=reg2reg16[r.enum];
-          S_L :
-            reg.enum:=reg2reg32[r.enum];
-          else
-            internalerror(200204101);
-        end;
-        if reg.enum=R_NO then
-         internalerror(200204102);
-        changeregsize:=reg;
-      end;
-
-
 {************************************************************************}
 {************************************************************************}
 {                               trgcpu                                   }
 {                               trgcpu                                   }
 {************************************************************************}
 {************************************************************************}
@@ -564,27 +502,11 @@ unit rgcpu;
 
 
 
 
     function trgcpu.makeregsize(reg: tregister; size: tcgsize): tregister;
     function trgcpu.makeregsize(reg: tregister; size: tcgsize): tregister;
-
-      var
-        _result : topsize;
       begin
       begin
-        case size of
-          OS_32,OS_S32:
-            begin
-              _result := S_L;
-            end;
-          OS_8,OS_S8:
-            begin
-              _result := S_B;
-            end;
-          OS_16,OS_S16:
-            begin
-              _result := S_W;
-            end;
-          else
-            internalerror(2001092312);
-        end;
-        makeregsize := changeregsize(reg,_result);
+        if reg.enum<>R_INTREGISTER then
+          internalerror(200306032);
+        result.enum:=R_INTREGISTER;
+        result.number:=(reg.number and (not $ff)) or cgsize2subreg(size);
       end;
       end;
 
 
 
 
@@ -595,7 +517,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.24  2003-06-03 13:01:59  daniel
+  Revision 1.25  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.24  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.23  2003/06/01 21:38:06  peter
   Revision 1.23  2003/06/01 21:38:06  peter

+ 22 - 15
compiler/ncgcal.pas

@@ -166,7 +166,7 @@ implementation
                     {$endif}
                     {$endif}
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
+                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
                     {$ifdef newra}
                     {$ifdef newra}
                        rg.ungetregisterint(exprasmlist,tmpreg);
                        rg.ungetregisterint(exprasmlist,tmpreg);
                     {$else}
                     {$else}
@@ -205,7 +205,7 @@ implementation
                   if calloption=pocall_inline then
                   if calloption=pocall_inline then
                     begin
                     begin
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                       cg.a_load_loc_ref(exprasmlist,left.location,href);
+                       cg.a_load_loc_ref(exprasmlist,OS_ADDR,left.location,href);
                     end
                     end
                   else
                   else
                     cg.a_param_loc(exprasmlist,left.location,paraitem.paraloc);
                     cg.a_param_loc(exprasmlist,left.location,paraitem.paraloc);
@@ -225,7 +225,7 @@ implementation
                      {$endif newra}
                      {$endif newra}
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                        cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                        reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
+                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
                      {$ifdef newra}
                      {$ifdef newra}
                        rg.ungetregisterint(exprasmlist,tmpreg);
                        rg.ungetregisterint(exprasmlist,tmpreg);
                      {$else}
                      {$else}
@@ -263,7 +263,7 @@ implementation
                 {$endif}
                 {$endif}
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                    reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                    reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                   cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
+                   cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
                 {$ifdef newra}
                 {$ifdef newra}
                    rg.ungetregisterint(exprasmlist,tmpreg);
                    rg.ungetregisterint(exprasmlist,tmpreg);
                 {$else}
                 {$else}
@@ -293,7 +293,7 @@ implementation
                        begin
                        begin
                          tg.GetTemp(exprasmlist,tcgsize2size[left.location.size],tt_normal,href);
                          tg.GetTemp(exprasmlist,tcgsize2size[left.location.size],tt_normal,href);
                          if not (left.location.size in [OS_64,OS_S64]) then
                          if not (left.location.size in [OS_64,OS_S64]) then
-                           cg.a_load_loc_ref(exprasmlist,left.location,href)
+                           cg.a_load_loc_ref(exprasmlist,left.location.size,left.location,href)
                          else
                          else
                            cg64.a_load64_loc_ref(exprasmlist,left.location,href);
                            cg64.a_load64_loc_ref(exprasmlist,left.location,href);
                          location_reset(left.location,LOC_REFERENCE,left.location.size);
                          location_reset(left.location,LOC_REFERENCE,left.location.size);
@@ -313,7 +313,7 @@ implementation
                      {$endif}
                      {$endif}
                         cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                         cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                         reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                         reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                        cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
+                        cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
                      {$ifdef newra}
                      {$ifdef newra}
                         rg.ungetregisterint(exprasmlist,tmpreg);
                         rg.ungetregisterint(exprasmlist,tmpreg);
                      {$else}
                      {$else}
@@ -391,12 +391,12 @@ implementation
           begin
           begin
             hregister:=rg.getaddressregister(exprasmlist);
             hregister:=rg.getaddressregister(exprasmlist);
             reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
             reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
-            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+            cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
             i:=current_procdef.parast.symtablelevel;
             i:=current_procdef.parast.symtablelevel;
             while (i>tprocdef(procdefinition).parast.symtablelevel) do
             while (i>tprocdef(procdefinition).parast.symtablelevel) do
               begin
               begin
                 reference_reset_base(href,hregister,current_procinfo.framepointer_offset);
                 reference_reset_base(href,hregister,current_procinfo.framepointer_offset);
-                cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                 dec(i);
                 dec(i);
               end;
               end;
             cg.a_param_reg(exprasmlist,OS_ADDR,hregister,paramanager.getintparaloc(1));
             cg.a_param_reg(exprasmlist,OS_ADDR,hregister,paramanager.getintparaloc(1));
@@ -409,7 +409,6 @@ implementation
       var
       var
         cgsize : tcgsize;
         cgsize : tcgsize;
         r,hregister : tregister;
         r,hregister : tregister;
-        nr:Tnewregister;
       begin
       begin
         { structured results are easy to handle.... }
         { structured results are easy to handle.... }
         { needed also when result_no_used !! }
         { needed also when result_no_used !! }
@@ -429,7 +428,7 @@ implementation
             r.enum:=R_INTREGISTER;
             r.enum:=R_INTREGISTER;
             r.number:=NR_FUNCTION_RETURN_REG;
             r.number:=NR_FUNCTION_RETURN_REG;
             cg.a_reg_alloc(exprasmlist,r);
             cg.a_reg_alloc(exprasmlist,r);
-            cg.a_load_reg_ref(exprasmlist,OS_ADDR,r,location.reference);
+            cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,r,location.reference);
             cg.a_reg_dealloc(exprasmlist,r);
             cg.a_reg_dealloc(exprasmlist,r);
           end
           end
         else
         else
@@ -504,9 +503,9 @@ implementation
                     begin
                     begin
                       {Move the function result to a free register, preferably the
                       {Move the function result to a free register, preferably the
                        FUNCTION_RESULT_REG, so no move is necessary.}
                        FUNCTION_RESULT_REG, so no move is necessary.}
-                      nr:=(RS_FUNCTION_RESULT_REG shl 8) or cgsize2subreg(cgsize);
                       r.enum:=R_INTREGISTER;
                       r.enum:=R_INTREGISTER;
-                      r.number:=nr;
+                      r.number:=NR_FUNCTION_RESULT_REG;
+                      r:=rg.makeregsize(r,cgsize);
 {$ifdef newra}
 {$ifdef newra}
 {                      rg.getexplicitregisterint(exprasmlist,nr);}
 {                      rg.getexplicitregisterint(exprasmlist,nr);}
                       rg.ungetregisterint(exprasmlist,r);
                       rg.ungetregisterint(exprasmlist,r);
@@ -514,7 +513,10 @@ implementation
 {$else newra}
 {$else newra}
                       cg.a_reg_alloc(exprasmlist,r);
                       cg.a_reg_alloc(exprasmlist,r);
                       if RS_FUNCTION_RESULT_REG in rg.unusedregsint then
                       if RS_FUNCTION_RESULT_REG in rg.unusedregsint then
-                        location.register:=rg.getexplicitregisterint(exprasmlist,nr)
+                        begin
+                          location.register:=rg.makeregsize(rg.getexplicitregisterint(
+                             exprasmlist,NR_FUNCTION_RESULT_REG),cgsize);
+                        end
                       else
                       else
                         location.register:=rg.getregisterint(exprasmlist,cgsize);
                         location.register:=rg.getregisterint(exprasmlist,cgsize);
 {$endif newra}
 {$endif newra}
@@ -858,7 +860,7 @@ implementation
                 end
                 end
               else
               else
                 rg.ungetregisterint(exprasmlist,right.location.register);
                 rg.ungetregisterint(exprasmlist,right.location.register);
-              
+
               reference_release(exprasmlist,helpref);
               reference_release(exprasmlist,helpref);
               location_freetemp(exprasmlist,right.location);
               location_freetemp(exprasmlist,right.location);
               for i:=first_supreg to last_supreg do
               for i:=first_supreg to last_supreg do
@@ -1378,7 +1380,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.83  2003-06-03 20:27:02  daniel
+  Revision 1.84  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.83  2003/06/03 20:27:02  daniel
     * Restored original methodpointer code for non newra case
     * Restored original methodpointer code for non newra case
 
 
   Revision 1.82  2003/06/03 13:01:59  daniel
   Revision 1.82  2003/06/03 13:01:59  daniel

+ 13 - 8
compiler/ncgcnv.pas

@@ -83,7 +83,7 @@ interface
 
 
         { insert range check if not explicit conversion }
         { insert range check if not explicit conversion }
         if not(nf_explicit in flags) then
         if not(nf_explicit in flags) then
-          cg.g_rangecheck(exprasmlist,left,resulttype.def);
+          cg.g_rangecheck(exprasmlist,left.location,left.resulttype.def,resulttype.def);
 
 
         { is the result size smaller? when typecasting from void
         { is the result size smaller? when typecasting from void
           we always reuse the current location, because there is
           we always reuse the current location, because there is
@@ -143,7 +143,7 @@ interface
                else
                else
                 begin
                 begin
                   location.register:=rg.getaddressregister(exprasmlist);
                   location.register:=rg.getaddressregister(exprasmlist);
-                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,location.register);
+                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                 end;
                 end;
              end;
              end;
            st_longstring:
            st_longstring:
@@ -167,7 +167,7 @@ interface
 {$ifdef fpc}
 {$ifdef fpc}
 {$warning Todo: convert widestrings to ascii when typecasting them to pchars}
 {$warning Todo: convert widestrings to ascii when typecasting them to pchars}
 {$endif}
 {$endif}
-                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
+                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_INT,left.location.reference,
                     location.register);
                     location.register);
                 end;
                 end;
              end;
              end;
@@ -236,7 +236,7 @@ interface
             begin
             begin
               location_release(exprasmlist,left.location);
               location_release(exprasmlist,left.location);
               location.reference.base:=rg.getaddressregister(exprasmlist);
               location.reference.base:=rg.getaddressregister(exprasmlist);
-              cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
+              cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,
                 location.reference.base);
                 location.reference.base);
               location_freetemp(exprasmlist,left.location);
               location_freetemp(exprasmlist,left.location);
             end;
             end;
@@ -253,7 +253,7 @@ interface
            st_shortstring :
            st_shortstring :
              begin
              begin
                tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
                tg.GetTemp(exprasmlist,256,tt_normal,location.reference);
-               cg.a_load_loc_ref(exprasmlist,left.location,
+               cg.a_load_loc_ref(exprasmlist,left.location.size,left.location,
                  location.reference);
                  location.reference);
                location_release(exprasmlist,left.location);
                location_release(exprasmlist,left.location);
                location_freetemp(exprasmlist,left.location);
                location_freetemp(exprasmlist,left.location);
@@ -377,7 +377,7 @@ interface
               begin
               begin
                 location_release(exprasmlist,left.location);
                 location_release(exprasmlist,left.location);
                 location.register:=rg.getaddressregister(exprasmlist);
                 location.register:=rg.getaddressregister(exprasmlist);
-                cg.a_load_ref_reg(exprasmlist,OS_32,left.location.reference,location.register);
+                cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                 location_freetemp(exprasmlist,left.location);
                 location_freetemp(exprasmlist,left.location);
               end;
               end;
             else
             else
@@ -403,7 +403,7 @@ interface
               begin
               begin
                  location_release(exprasmlist,left.location);
                  location_release(exprasmlist,left.location);
                  location.register:=rg.getaddressregister(exprasmlist);
                  location.register:=rg.getaddressregister(exprasmlist);
-                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,location.register);
+                 cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.register);
                  location_freetemp(exprasmlist,left.location);
                  location_freetemp(exprasmlist,left.location);
               end;
               end;
             LOC_CREGISTER:
             LOC_CREGISTER:
@@ -510,7 +510,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.43  2003-06-01 21:38:06  peter
+  Revision 1.44  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.43  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 8 - 5
compiler/ncgflw.pas

@@ -391,8 +391,7 @@ implementation
               if (right.location.loc=LOC_REGISTER) or
               if (right.location.loc=LOC_REGISTER) or
                  (right.location.loc=LOC_CREGISTER) then
                  (right.location.loc=LOC_CREGISTER) then
                 begin
                 begin
-                   cg.a_load_reg_ref(exprasmlist,opsize,
-                     right.location.register,temp1);
+                   cg.a_load_reg_ref(exprasmlist,opsize,opsize,right.location.register,temp1);
                    rg.ungetregisterint(exprasmlist,right.location.register);
                    rg.ungetregisterint(exprasmlist,right.location.register);
                  end
                  end
               else
               else
@@ -1156,8 +1155,7 @@ implementation
          { what a hack ! }
          { what a hack ! }
          if assigned(exceptsymtable) then
          if assigned(exceptsymtable) then
            tvarsym(exceptsymtable.symindex.first).address:=ref.offset;
            tvarsym(exceptsymtable.symindex.first).address:=ref.offset;
-         cg.a_load_reg_ref(exprasmlist, OS_ADDR, r, ref);
-
+         cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,r,ref);
 
 
          { in the case that another exception is risen }
          { in the case that another exception is risen }
          { we've to destroy the old one                }
          { we've to destroy the old one                }
@@ -1421,7 +1419,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.67  2003-06-01 21:38:06  peter
+  Revision 1.68  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.67  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 17 - 11
compiler/ncginl.pas

@@ -251,7 +251,7 @@ implementation
                    begin
                    begin
                      { load VMT pointer }
                      { load VMT pointer }
                      reference_reset_base(hrefvmt,left.location.register,tobjectdef(left.resulttype.def).vmt_offset);
                      reference_reset_base(hrefvmt,left.location.register,tobjectdef(left.resulttype.def).vmt_offset);
-                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,hrefvmt,hregister);
+                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                    end
                    end
                 end;
                 end;
               LOC_REFERENCE,
               LOC_REFERENCE,
@@ -260,18 +260,18 @@ implementation
                   if is_class(left.resulttype.def) then
                   if is_class(left.resulttype.def) then
                    begin
                    begin
                      { deref class }
                      { deref class }
-                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
+                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                      cg.g_maybe_testself(exprasmlist,hregister);
                      cg.g_maybe_testself(exprasmlist,hregister);
                      { load VMT pointer }
                      { load VMT pointer }
                      reference_reset_base(hrefvmt,hregister,tobjectdef(left.resulttype.def).vmt_offset);
                      reference_reset_base(hrefvmt,hregister,tobjectdef(left.resulttype.def).vmt_offset);
-                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,hrefvmt,hregister);
+                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                    end
                    end
                   else
                   else
                    begin
                    begin
                      { load VMT pointer, but not for classrefdefs }
                      { load VMT pointer, but not for classrefdefs }
                      if (left.resulttype.def.deftype=objectdef) then
                      if (left.resulttype.def.deftype=objectdef) then
                        inc(left.location.reference.offset,tobjectdef(left.resulttype.def).vmt_offset);
                        inc(left.location.reference.offset,tobjectdef(left.resulttype.def).vmt_offset);
-                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
+                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                    end;
                    end;
                 end;
                 end;
               else
               else
@@ -284,7 +284,7 @@ implementation
              reference_reset_base(href,hregister,0);
              reference_reset_base(href,hregister,0);
              rg.ungetaddressregister(exprasmlist,hregister);
              rg.ungetaddressregister(exprasmlist,hregister);
              hregister:=rg.getregisterint(exprasmlist,OS_INT);
              hregister:=rg.getregisterint(exprasmlist,OS_INT);
-             cg.a_load_ref_reg(exprasmlist,OS_INT,href,hregister);
+             cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,href,hregister);
            end;
            end;
         location.register:=hregister;
         location.register:=hregister;
      end;
      end;
@@ -315,7 +315,7 @@ implementation
            objectlibrary.getlabel(lengthlab);
            objectlibrary.getlabel(lengthlab);
            cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,lengthlab);
            cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,lengthlab);
            reference_reset_base(href,hregister,-8);
            reference_reset_base(href,hregister,-8);
-           cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
+           cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,hregister);
            cg.a_label(exprasmlist,lengthlab);
            cg.a_label(exprasmlist,lengthlab);
            location_reset(location,LOC_REGISTER,OS_32);
            location_reset(location,LOC_REGISTER,OS_32);
            location.register:=hregister;
            location.register:=hregister;
@@ -349,7 +349,7 @@ implementation
         else
         else
           cg.a_op_const_reg(exprasmlist,cgop,location.size,1,location.register);
           cg.a_op_const_reg(exprasmlist,cgop,location.size,1,location.register);
 
 
-        cg.g_rangecheck(exprasmlist,self,resulttype.def);
+        cg.g_rangecheck(exprasmlist,location,resulttype.def,resulttype.def);
       end;
       end;
 
 
 
 
@@ -435,8 +435,9 @@ implementation
                location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
                location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
              end;
              end;
           location_release(exprasmlist,tcallparanode(left).left.location);
           location_release(exprasmlist,tcallparanode(left).left.location);
-          cg.g_overflowcheck(exprasmlist,tcallparanode(left).left);
-          cg.g_rangecheck(exprasmlist,tcallparanode(left).left,tcallparanode(left).left.resulttype.def);
+          cg.g_overflowcheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).resulttype.def);
+          cg.g_rangecheck(exprasmlist,tcallparanode(left).left.location,tcallparanode(left).left.resulttype.def,
+              tcallparanode(left).left.resulttype.def);
         end;
         end;
 
 
 
 
@@ -536,7 +537,7 @@ implementation
                  LOC_REFERENCE:
                  LOC_REFERENCE:
                    begin
                    begin
                      cgsize := def_cgsize(tcallparanode(tcallparanode(left).right).left.resulttype.def);
                      cgsize := def_cgsize(tcallparanode(tcallparanode(left).right).left.resulttype.def);
-                     cg.a_load_ref_reg(exprasmlist,cgsize,
+                     cg.a_load_ref_reg(exprasmlist,cgsize,cgsize,
                        tcallparanode(tcallparanode(left).right).left.location.reference,hregister);
                        tcallparanode(tcallparanode(left).right).left.location.reference,hregister);
                    end;
                    end;
                else
                else
@@ -681,7 +682,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.34  2003-06-01 21:38:06  peter
+  Revision 1.35  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.34  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 24 - 20
compiler/ncgld.pas

@@ -119,7 +119,7 @@ implementation
                     begin
                     begin
                        hregister:=rg.getaddressregister(exprasmlist);
                        hregister:=rg.getaddressregister(exprasmlist);
                        location.reference.symbol:=objectlibrary.newasmsymboldata(tvarsym(symtableentry).mangledname);
                        location.reference.symbol:=objectlibrary.newasmsymboldata(tvarsym(symtableentry).mangledname);
-                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,location.reference,hregister);
+                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,location.reference,hregister);
                        reference_reset_base(location.reference,hregister,0);
                        reference_reset_base(location.reference,hregister,0);
                     end
                     end
                   { external variable }
                   { external variable }
@@ -135,7 +135,7 @@ implementation
                        { we've to allocate the register before we save the used registers }
                        { we've to allocate the register before we save the used registers }
                        hregister:=rg.getaddressregister(exprasmlist);
                        hregister:=rg.getaddressregister(exprasmlist);
                        reference_reset_symbol(href,objectlibrary.newasmsymboldata('FPC_THREADVAR_RELOCATE'),0);
                        reference_reset_symbol(href,objectlibrary.newasmsymboldata('FPC_THREADVAR_RELOCATE'),0);
-                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                        cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_NE,0,hregister,dorelocatelab);
                        cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_NE,0,hregister,dorelocatelab);
                        { no relocation needed, load the address of the variable only, the
                        { no relocation needed, load the address of the variable only, the
                          layout of a threadvar is (4 bytes pointer):
                          layout of a threadvar is (4 bytes pointer):
@@ -189,7 +189,7 @@ implementation
                                if (supreg in general_superregisters) and
                                if (supreg in general_superregisters) and
                                   not (supreg in rg.regvar_loaded_int) then
                                   not (supreg in rg.regvar_loaded_int) then
                                  load_regvar(exprasmlist,tvarsym(symtableentry));
                                  load_regvar(exprasmlist,tvarsym(symtableentry));
-                               location_reset(location,LOC_CREGISTER,cg.reg_cgsize(tvarsym(symtableentry).reg));
+                               location_reset(location,LOC_CREGISTER,def_cgsize(resulttype.def));
                                location.register:=tvarsym(symtableentry).reg;
                                location.register:=tvarsym(symtableentry).reg;
                                exclude(rg.unusedregsint,supreg);
                                exclude(rg.unusedregsint,supreg);
                              end
                              end
@@ -212,7 +212,7 @@ implementation
                                        hregister:=rg.getaddressregister(exprasmlist);
                                        hregister:=rg.getaddressregister(exprasmlist);
                                        { make a reference }
                                        { make a reference }
                                        reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
                                        reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
-                                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                                        { walk parents }
                                        { walk parents }
                                        i:=current_procdef.parast.symtablelevel-1;
                                        i:=current_procdef.parast.symtablelevel-1;
                                        while (i>symtable.symtablelevel) do
                                        while (i>symtable.symtablelevel) do
@@ -223,7 +223,7 @@ implementation
 {$else powerpc}
 {$else powerpc}
                                             reference_reset_base(href,hregister,target_info.first_parm_offset);
                                             reference_reset_base(href,hregister,target_info.first_parm_offset);
 {$endif powerpc}
 {$endif powerpc}
-                                            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                                            cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                                             dec(i);
                                             dec(i);
                                          end;
                                          end;
                                        location.reference.base:=hregister;
                                        location.reference.base:=hregister;
@@ -298,7 +298,7 @@ implementation
                            begin
                            begin
                               hregister:=rg.getaddressregister(exprasmlist);
                               hregister:=rg.getaddressregister(exprasmlist);
                               if is_class_or_interface(left.resulttype.def) then
                               if is_class_or_interface(left.resulttype.def) then
-                                cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister)
+                                cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,hregister)
                               else
                               else
                                 cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,hregister);
                                 cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,hregister);
                               location_release(exprasmlist,left.location);
                               location_release(exprasmlist,left.location);
@@ -311,7 +311,7 @@ implementation
                       { store the class instance address }
                       { store the class instance address }
                       href:=location.reference;
                       href:=location.reference;
                       inc(href.offset,POINTER_SIZE);
                       inc(href.offset,POINTER_SIZE);
-                      cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
+                      cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,href);
 
 
                       { virtual method ? }
                       { virtual method ? }
                       if (po_virtualmethod in procdef.procoptions) then
                       if (po_virtualmethod in procdef.procoptions) then
@@ -320,7 +320,7 @@ implementation
                           reference_reset_base(href,hregister,0);
                           reference_reset_base(href,hregister,0);
                           reference_release(exprasmlist,href);
                           reference_release(exprasmlist,href);
                           hregister:=rg.getaddressregister(exprasmlist);
                           hregister:=rg.getaddressregister(exprasmlist);
-                          cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                          cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
 
 
 
 
                           reference_reset_base(href,hregister,
                           reference_reset_base(href,hregister,
@@ -329,9 +329,9 @@ implementation
 
 
                           { load method address }
                           { load method address }
                           hregister:=rg.getaddressregister(exprasmlist);
                           hregister:=rg.getaddressregister(exprasmlist);
-                          cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                          cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister);
                           { ... and store it }
                           { ... and store it }
-                          cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
+                          cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
                           rg.ungetaddressregister(exprasmlist,hregister);
                           rg.ungetaddressregister(exprasmlist,hregister);
                         end
                         end
                       else
                       else
@@ -346,7 +346,7 @@ implementation
                           hregister:=cg.get_scratch_reg_address(exprasmlist);
                           hregister:=cg.get_scratch_reg_address(exprasmlist);
                         {$endif}
                         {$endif}
                           cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
                           cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
-                          cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
+                          cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,hregister,location.reference);
                         {$ifdef newra}
                         {$ifdef newra}
                           rg.ungetregisterint(exprasmlist,hregister);
                           rg.ungetregisterint(exprasmlist,hregister);
                         {$else newra}
                         {$else newra}
@@ -517,13 +517,12 @@ implementation
                       LOC_REGISTER,
                       LOC_REGISTER,
                       LOC_CREGISTER :
                       LOC_CREGISTER :
                         begin
                         begin
-                          r.enum:=R_INTREGISTER;
-                          r.number:=(right.location.register.number and not $ff) or R_SUBL;
-                          cg.a_load_reg_ref(exprasmlist,OS_8,r,href);
+                          r:=rg.makeregsize(right.location.register,OS_8);
+                          cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,r,href);
                         end;
                         end;
                       LOC_REFERENCE,
                       LOC_REFERENCE,
                       LOC_CREFERENCE :
                       LOC_CREFERENCE :
-                        cg.a_load_ref_ref(exprasmlist,OS_8,right.location.reference,href);
+                        cg.a_load_ref_ref(exprasmlist,OS_8,OS_8,right.location.reference,href);
                       else
                       else
                         internalerror(200205111);
                         internalerror(200205111);
                     end;
                     end;
@@ -554,7 +553,7 @@ implementation
                          cg64.a_load64_ref_reg(exprasmlist,
                          cg64.a_load64_ref_reg(exprasmlist,
                              right.location.reference,left.location.register64{$ifdef newra},false{$endif})
                              right.location.reference,left.location.register64{$ifdef newra},false{$endif})
                         else
                         else
-                         cg.a_load_ref_reg(exprasmlist,cgsize,
+                         cg.a_load_ref_reg(exprasmlist,cgsize,cgsize,
                              right.location.reference,left.location.register);
                              right.location.reference,left.location.register);
                         location_release(exprasmlist,right.location);
                         location_release(exprasmlist,right.location);
                       end;
                       end;
@@ -870,7 +869,7 @@ implementation
                        tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                        tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                      {$endif}
                      {$endif}
                        cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
                        cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
-                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
+                       cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,tmpreg,href);
                      {$ifdef newra}
                      {$ifdef newra}
                        rg.ungetregisterint(exprasmlist,tmpreg);
                        rg.ungetregisterint(exprasmlist,tmpreg);
                      {$else}
                      {$else}
@@ -883,7 +882,7 @@ implementation
                     else
                     else
                      begin
                      begin
                        location_release(exprasmlist,hp.left.location);
                        location_release(exprasmlist,hp.left.location);
-                       cg.a_load_loc_ref(exprasmlist,hp.left.location,href);
+                       cg.a_load_loc_ref(exprasmlist,OS_ADDR,hp.left.location,href);
                      end;
                      end;
                     { update href to the vtype field and write it }
                     { update href to the vtype field and write it }
                     dec(href.offset,4);
                     dec(href.offset,4);
@@ -917,7 +916,7 @@ implementation
                        if hp.left.location.size in [OS_64,OS_S64] then
                        if hp.left.location.size in [OS_64,OS_S64] then
                          cg64.a_load64_loc_ref(exprasmlist,hp.left.location,href)
                          cg64.a_load64_loc_ref(exprasmlist,hp.left.location,href)
                        else
                        else
-                         cg.a_load_loc_ref(exprasmlist,hp.left.location,href);
+                         cg.a_load_loc_ref(exprasmlist,hp.left.location.size,hp.left.location,href);
                      end;
                      end;
                  end;
                  end;
                  inc(href.offset,elesize);
                  inc(href.offset,elesize);
@@ -935,7 +934,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.65  2003-06-03 13:01:59  daniel
+  Revision 1.66  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.65  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.64  2003/05/30 23:57:08  peter
   Revision 1.64  2003/05/30 23:57:08  peter

+ 107 - 93
compiler/ncgmat.pas

@@ -31,7 +31,6 @@ interface
 
 
 type
 type
       tcgunaryminusnode = class(tunaryminusnode)
       tcgunaryminusnode = class(tunaryminusnode)
-         procedure pass_2;override;
       protected
       protected
          { This routine is called to change the sign of the
          { This routine is called to change the sign of the
            floating point value in the floating point
            floating point value in the floating point
@@ -44,6 +43,14 @@ type
            in IEEE-754 format.
            in IEEE-754 format.
          }
          }
          procedure emit_float_sign_change(r: tregister; _size : tcgsize);virtual;
          procedure emit_float_sign_change(r: tregister; _size : tcgsize);virtual;
+{$ifdef SUPPORT_MMX}
+         procedure second_mmx;virtual;abstract;
+{$endif SUPPORT_MMX}
+         procedure second_64bit;virtual;
+         procedure second_integer;virtual;
+         procedure second_float;virtual;
+      public
+         procedure pass_2;override;
       end;
       end;
 
 
       tcgmoddivnode = class(tmoddivnode)
       tcgmoddivnode = class(tmoddivnode)
@@ -96,6 +103,10 @@ type
       tcgnotnode = class(tnotnode)
       tcgnotnode = class(tnotnode)
       protected
       protected
          procedure second_boolean;virtual;abstract;
          procedure second_boolean;virtual;abstract;
+{$ifdef SUPPORT_MMX}
+         procedure second_mmx;virtual;abstract;
+{$endif SUPPORT_MMX}
+         procedure second_64bit;virtual;
          procedure second_integer;virtual;
          procedure second_integer;virtual;
       public
       public
          procedure pass_2;override;
          procedure pass_2;override;
@@ -116,10 +127,11 @@ implementation
 {*****************************************************************************
 {*****************************************************************************
                           TCGUNARYMINUSNODE
                           TCGUNARYMINUSNODE
 *****************************************************************************}
 *****************************************************************************}
+
     procedure tcgunaryminusnode.emit_float_sign_change(r: tregister; _size : tcgsize);
     procedure tcgunaryminusnode.emit_float_sign_change(r: tregister; _size : tcgsize);
-     var
-       href : treference;
-       hreg : tregister;
+      var
+        href : treference;
+        hreg : tregister;
       begin
       begin
         { get a temporary memory reference to store the floating
         { get a temporary memory reference to store the floating
           point value
           point value
@@ -141,7 +153,7 @@ implementation
            internalerror(20020814);
            internalerror(20020814);
         hreg := rg.getregisterint(exprasmlist,OS_32);
         hreg := rg.getregisterint(exprasmlist,OS_32);
         { load value }
         { load value }
-        cg.a_load_ref_reg(exprasmlist,OS_32,href,hreg);
+        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,hreg);
         { bitwise complement copied value }
         { bitwise complement copied value }
         cg.a_op_reg_reg(exprasmlist,OP_NOT,OS_32,hreg,hreg);
         cg.a_op_reg_reg(exprasmlist,OP_NOT,OS_32,hreg,hreg);
         { sign-bit is bit 31/63 of single/double }
         { sign-bit is bit 31/63 of single/double }
@@ -162,81 +174,73 @@ implementation
       end;
       end;
 
 
 
 
-    procedure tcgunaryminusnode.pass_2;
+    procedure tcgunaryminusnode.second_64bit;
+      begin
+        secondpass(left);
+        { load left operator in a register }
+        location_copy(location,left.location);
+        location_force_reg(exprasmlist,location,OS_64,false);
+        cg64.a_op64_loc_reg(exprasmlist,OP_NEG,
+           location,joinreg64(location.registerlow,location.registerhigh));
+      end;
 
 
 
 
+    procedure tcgunaryminusnode.second_float;
       begin
       begin
-         if is_64bit(left.resulttype.def) then
-           begin
-              secondpass(left);
+        secondpass(left);
+        location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
+        case left.location.loc of
+          LOC_REFERENCE,
+          LOC_CREFERENCE :
+            begin
+              reference_release(exprasmlist,left.location.reference);
+              location.register:=rg.getregisterfpu(exprasmlist,location.size);
+              cg.a_loadfpu_ref_reg(exprasmlist,
+                 def_cgsize(left.resulttype.def),
+                 left.location.reference,location.register);
+              emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
+            end;
+          LOC_FPUREGISTER:
+            begin
+               location.register:=left.location.register;
+               emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
+            end;
+          LOC_CFPUREGISTER:
+            begin
+               location.register:=rg.getregisterfpu(exprasmlist,location.size);
+               cg.a_loadfpu_reg_reg(exprasmlist,left.location.register,location.register);
+               emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
+            end;
+          else
+            internalerror(200306021);
+        end;
+      end;
 
 
-              { load left operator in a register }
-              location_copy(location,left.location);
-              location_force_reg(exprasmlist,location,OS_64,false);
-              cg64.a_op64_loc_reg(exprasmlist,OP_NEG,
-                 location,joinreg64(location.registerlow,location.registerhigh));
-           end
+
+    procedure tcgunaryminusnode.second_integer;
+      begin
+        secondpass(left);
+        { load left operator in a register }
+        location_copy(location,left.location);
+        location_force_reg(exprasmlist,location,OS_INT,false);
+        cg.a_op_reg_reg(exprasmlist,OP_NEG,OS_INT,location.register,location.register);
+      end;
+
+
+    procedure tcgunaryminusnode.pass_2;
+      begin
+         if is_64bit(left.resulttype.def) then
+           second_64bit
+{$ifdef SUPPORT_MMX}
          else
          else
-           begin
-              secondpass(left);
-              location_reset(location,LOC_REGISTER,OS_INT);
-              case left.location.loc of
-                 LOC_REGISTER:
-                   begin
-                      location.register:=left.location.register;
-                      cg.a_op_reg_reg(exprasmlist,OP_NEG,OS_INT,location.register,
-                         location.register);
-                   end;
-                 LOC_CREGISTER:
-                   begin
-                      location.register:=rg.getregisterint(exprasmlist,OS_INT);
-                      cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,left.location.register,
-                        location.register);
-                      cg.a_op_reg_reg(exprasmlist,OP_NEG,OS_INT,location.register,
-                         location.register);
-                   end;
-                 LOC_REFERENCE,
-                 LOC_CREFERENCE:
-                   begin
-                      reference_release(exprasmlist,left.location.reference);
-                      if (left.resulttype.def.deftype=floatdef) then
-                        begin
-                           location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
-                           location.register:=rg.getregisterfpu(exprasmlist,location.size);
-                           cg.a_loadfpu_ref_reg(exprasmlist,
-                              def_cgsize(left.resulttype.def),
-                              left.location.reference,location.register);
-                           emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
-                        end
-                      else
-                        begin
-                           location.register:=rg.getregisterint(exprasmlist,OS_INT);
-                           { why is the size is OS_INT, since in pass_1 we convert
-                             everything to a signed natural value anyways
-                           }
-                           cg.a_load_ref_reg(exprasmlist,OS_INT,
-                               left.location.reference,location.register);
-                           cg.a_op_reg_reg(exprasmlist,OP_NEG,OS_INT,location.register,
-                               location.register);
-                        end;
-                   end;
-                 LOC_FPUREGISTER:
-                   begin
-                      location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
-                      location.register:=left.location.register;
-                      emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
-                   end;
-                 LOC_CFPUREGISTER:
-                   begin
-                      location_reset(location,LOC_FPUREGISTER,def_cgsize(resulttype.def));
-                      location.register:=rg.getregisterfpu(exprasmlist,location.size);
-                      cg.a_loadfpu_reg_reg(exprasmlist,left.location.register,location.register);
-                      emit_float_sign_change(location.register,def_cgsize(left.resulttype.def));
-                   end;
-                 else
-                    internalerror(200203225);
-              end;
-           end;
+           if (cs_mmx in aktlocalswitches) and is_mmx_able_array(left.resulttype.def) then
+             second_mmx
+{$endif SUPPORT_MMX}
+         else
+           if (left.resulttype.def.deftype=floatdef) then
+             second_float
+         else
+           second_integer;
       end;
       end;
 
 
 
 
@@ -341,7 +345,7 @@ implementation
               location_reset(location,LOC_REGISTER,OS_INT);
               location_reset(location,LOC_REGISTER,OS_INT);
               location.register:=hreg1;
               location.register:=hreg1;
            end;
            end;
-        cg.g_overflowcheck(exprasmlist,self);
+        cg.g_overflowcheck(exprasmlist,location,resulttype.def);
       end;
       end;
 
 
 
 
@@ -468,24 +472,23 @@ implementation
                                TCGNOTNODE
                                TCGNOTNODE
 *****************************************************************************}
 *****************************************************************************}
 
 
+    procedure tcgnotnode.second_64bit;
+      begin
+        secondpass(left);
+        location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false);
+        location_copy(location,left.location);
+        { perform the NOT operation }
+        cg64.a_op64_reg_reg(exprasmlist,OP_NOT,left.location.register64,location.register64);
+      end;
+
+
     procedure tcgnotnode.second_integer;
     procedure tcgnotnode.second_integer;
       begin
       begin
-        if is_64bit(left.resulttype.def) then
-          begin
-            secondpass(left);
-            location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false);
-            location_copy(location,left.location);
-            { perform the NOT operation }
-            cg64.a_op64_reg_reg(exprasmlist,OP_NOT,left.location.register64,location.register64);
-          end
-        else
-          begin
-            secondpass(left);
-            location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false);
-            location_copy(location,left.location);
-            { perform the NOT operation }
-            cg.a_op_reg_reg(exprasmlist,OP_NOT,location.size,location.register,location.register);
-         end;
+        secondpass(left);
+        location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false);
+        location_copy(location,left.location);
+        { perform the NOT operation }
+        cg.a_op_reg_reg(exprasmlist,OP_NOT,location.size,location.register,location.register);
       end;
       end;
 
 
 
 
@@ -493,6 +496,12 @@ implementation
       begin
       begin
         if is_boolean(resulttype.def) then
         if is_boolean(resulttype.def) then
           second_boolean
           second_boolean
+{$ifdef SUPPORT_MMX}
+        else if (cs_mmx in aktlocalswitches) and is_mmx_able_array(left.resulttype.def) then
+          second_mmx
+{$endif SUPPORT_MMX}
+        else if is_64bit(left.resulttype.def) then
+          second_64bit
         else
         else
           second_integer;
           second_integer;
       end;
       end;
@@ -505,7 +514,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.12  2003-06-01 21:38:06  peter
+  Revision 1.13  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.12  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 13 - 8
compiler/ncgmem.pas

@@ -154,7 +154,7 @@ implementation
             reference_release(exprasmlist,href);
             reference_release(exprasmlist,href);
             location.register:=rg.getaddressregister(exprasmlist);
             location.register:=rg.getaddressregister(exprasmlist);
             cg.g_maybe_testself(exprasmlist,href.base);
             cg.g_maybe_testself(exprasmlist,href.base);
-            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,location.register);
+            cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,location.register);
           end
           end
          else
          else
           begin
           begin
@@ -195,7 +195,7 @@ implementation
             assigned(tloadnode(left).symtableentry) and
             assigned(tloadnode(left).symtableentry) and
             (tloadnode(left).symtableentry.typ=varsym) and
             (tloadnode(left).symtableentry.typ=varsym) and
             (tvarsym(tloadnode(left).symtableentry).vartype.def.deftype=procvardef) then
             (tvarsym(tloadnode(left).symtableentry).vartype.def.deftype=procvardef) then
-           cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
+           cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,
              location.register)
              location.register)
          else
          else
           begin
           begin
@@ -312,7 +312,7 @@ implementation
          else if is_interfacecom(left.resulttype.def) then
          else if is_interfacecom(left.resulttype.def) then
            begin
            begin
               tg.GetTemp(exprasmlist,pointer_size,tt_interfacecom,location.reference);
               tg.GetTemp(exprasmlist,pointer_size,tt_interfacecom,location.reference);
-              cg.a_load_loc_ref(exprasmlist,left.location,location.reference);
+              cg.a_load_loc_ref(exprasmlist,OS_ADDR,left.location,location.reference);
              { implicit deferencing also for interfaces }
              { implicit deferencing also for interfaces }
              if (cs_gdb_heaptrc in aktglobalswitches) and
              if (cs_gdb_heaptrc in aktglobalswitches) and
                 (cs_checkpointer in aktglobalswitches) and
                 (cs_checkpointer in aktglobalswitches) and
@@ -538,7 +538,7 @@ implementation
             {$endif}
             {$endif}
             end
             end
          else
          else
-           cg.g_rangecheck(exprasmlist,right,left.resulttype.def);
+           cg.g_rangecheck(exprasmlist,right.location,right.resulttype.def,left.resulttype.def);
        end;
        end;
 
 
 
 
@@ -611,8 +611,8 @@ implementation
                 LOC_REFERENCE :
                 LOC_REFERENCE :
                   begin
                   begin
                     location_release(exprasmlist,left.location);
                     location_release(exprasmlist,left.location);
-                    location.reference.base:=rg.getregisterint(exprasmlist,OS_INT);
-                    cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,location.reference.base);
+                    location.reference.base:=rg.getaddressregister(exprasmlist);
+                    cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.reference,location.reference.base);
                   end;
                   end;
                 else
                 else
                   internalerror(2002032218);
                   internalerror(2002032218);
@@ -667,7 +667,7 @@ implementation
                   begin
                   begin
                      location_release(exprasmlist,left.location);
                      location_release(exprasmlist,left.location);
                      location.reference.base:=rg.getaddressregister(exprasmlist);
                      location.reference.base:=rg.getaddressregister(exprasmlist);
-                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,
+                     cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,
                       left.location.reference,location.reference.base);
                       left.location.reference,location.reference.base);
                   end;
                   end;
                 else
                 else
@@ -937,7 +937,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.58  2003-06-03 13:01:59  daniel
+  Revision 1.59  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.58  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.57  2003/06/02 22:35:45  florian
   Revision 1.57  2003/06/02 22:35:45  florian

+ 10 - 5
compiler/ncgopt.pas

@@ -122,7 +122,7 @@ begin
         reference_release(exprasmlist,right.location.reference);
         reference_release(exprasmlist,right.location.reference);
         { get register for the char }
         { get register for the char }
         hreg := rg.getregisterint(exprasmlist,OS_8);
         hreg := rg.getregisterint(exprasmlist,OS_8);
-        cg.a_load_ref_reg(exprasmlist,OS_8,right.location.reference,hreg);
+        cg.a_load_ref_reg(exprasmlist,OS_8,OS_8,right.location.reference,hreg);
         { I don't think a temp char exists, but it won't hurt (JM) }
         { I don't think a temp char exists, but it won't hurt (JM) }
         tg.ungetiftemp(exprasmlist,right.location.reference);
         tg.ungetiftemp(exprasmlist,right.location.reference);
       end
       end
@@ -130,7 +130,7 @@ begin
 
 
   { load the current string length }
   { load the current string length }
   lengthreg := rg.getregisterint(exprasmlist,OS_INT);
   lengthreg := rg.getregisterint(exprasmlist,OS_INT);
-  cg.a_load_ref_reg(exprasmlist,OS_8,left.location.reference,lengthreg);
+  cg.a_load_ref_reg(exprasmlist,OS_8,OS_INT,left.location.reference,lengthreg);
 
 
   { do we have to check the length ? }
   { do we have to check the length ? }
   if tg.istemp(left.location.reference) then
   if tg.istemp(left.location.reference) then
@@ -181,7 +181,7 @@ begin
     begin
     begin
       { no new_reference(href2) because it's only }
       { no new_reference(href2) because it's only }
       { used once (JM)                            }
       { used once (JM)                            }
-      cg.a_load_reg_ref(exprasmlist,OS_8,hreg,href2);
+      cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,hreg,href2);
       rg.ungetregisterint(exprasmlist,hreg);
       rg.ungetregisterint(exprasmlist,hreg);
     end
     end
   else
   else
@@ -189,7 +189,7 @@ begin
   lengthreg.number:=(lengthreg.number and not $ff) or R_SUBL;
   lengthreg.number:=(lengthreg.number and not $ff) or R_SUBL;
   { increase the string length }
   { increase the string length }
   cg.a_op_const_reg(exprasmlist,OP_ADD,OS_8,1,lengthreg);
   cg.a_op_const_reg(exprasmlist,OP_ADD,OS_8,1,lengthreg);
-  cg.a_load_reg_ref(exprasmlist,OS_8,lengthreg,left.location.reference);
+  cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,lengthreg,left.location.reference);
   rg.ungetregisterint(exprasmlist,lengthreg);
   rg.ungetregisterint(exprasmlist,lengthreg);
   if checklength then
   if checklength then
     cg.a_label(exprasmlist,l);
     cg.a_label(exprasmlist,l);
@@ -202,7 +202,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.5  2003-06-03 13:01:59  daniel
+  Revision 1.6  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.5  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.4  2003/06/01 21:38:06  peter
   Revision 1.4  2003/06/01 21:38:06  peter

+ 73 - 73
compiler/ncgset.pas

@@ -283,7 +283,7 @@ implementation
          { location is always LOC_JUMP }
          { location is always LOC_JUMP }
          location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def));
          location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def));
          { allocate a register for the result }
          { allocate a register for the result }
-         location.register := rg.getregisterint(exprasmlist,OS_INT);
+         location.register := rg.getregisterint(exprasmlist,location.size);
 
 
          if genjumps then
          if genjumps then
           begin
           begin
@@ -291,7 +291,7 @@ implementation
             objectlibrary.getlabel(l);
             objectlibrary.getlabel(l);
 
 
             { clear the register value, indicating result is FALSE }
             { clear the register value, indicating result is FALSE }
-            cg.a_load_const_reg(exprasmlist,OS_INT,0,location.register);
+            cg.a_load_const_reg(exprasmlist,location.size,0,location.register);
             opsize := def_cgsize(left.resulttype.def);
             opsize := def_cgsize(left.resulttype.def);
             { If register is used, use only lower 8 bits }
             { If register is used, use only lower 8 bits }
             if left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
             if left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
@@ -317,13 +317,13 @@ implementation
             else
             else
              begin
              begin
                { load the value in a register }
                { load the value in a register }
+               opsize := OS_INT;
              {$ifdef newra}
              {$ifdef newra}
-               pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
+               pleftreg:=rg.getregisterint(exprasmlist,opsize);
              {$else}
              {$else}
-               pleftreg := cg.get_scratch_reg_int(exprasmlist,OS_INT);
+               pleftreg := cg.get_scratch_reg_int(exprasmlist,opsize);
              {$endif}
              {$endif}
-               opsize := OS_INT;
-               cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,pleftreg);
+               cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),opsize,left.location.reference,pleftreg);
              end;
              end;
 
 
 
 
@@ -362,7 +362,7 @@ implementation
                         begin
                         begin
                           { otherwise, the value is already in a register   }
                           { otherwise, the value is already in a register   }
                           { that can be modified                            }
                           { that can be modified                            }
-                          cg.a_op_const_reg(exprasmlist,OP_SUB,OS_INT,
+                          cg.a_op_const_reg(exprasmlist,OP_SUB,opsize,
                              setparts[i].start-adjustment,pleftreg)
                              setparts[i].start-adjustment,pleftreg)
                         end;
                         end;
                     { new total value substracted from x:           }
                     { new total value substracted from x:           }
@@ -396,7 +396,7 @@ implementation
              { Now place the end label if IN success }
              { Now place the end label if IN success }
              cg.a_label(exprasmlist,l);
              cg.a_label(exprasmlist,l);
              { result register is 1 }
              { result register is 1 }
-             cg.a_load_const_reg(exprasmlist,OS_INT,1,location.register);
+             cg.a_load_const_reg(exprasmlist,location.size,1,location.register);
              { in case value is not found }
              { in case value is not found }
              cg.a_label(exprasmlist,l3);
              cg.a_label(exprasmlist,l3);
              case left.location.loc of
              case left.location.loc of
@@ -432,7 +432,7 @@ implementation
                if left.nodetype=ordconstn then
                if left.nodetype=ordconstn then
                 begin
                 begin
                   { clear the register value, indicating result is FALSE }
                   { clear the register value, indicating result is FALSE }
-                  cg.a_load_const_reg(exprasmlist,OS_INT,0,location.register);
+                  cg.a_load_const_reg(exprasmlist,location.size,0,location.register);
                   case right.location.loc of
                   case right.location.loc of
                     LOC_REGISTER:
                     LOC_REGISTER:
                       hr:=right.location.register;
                       hr:=right.location.register;
@@ -440,7 +440,7 @@ implementation
                       begin
                       begin
                          hr:=rg.getregisterint(exprasmlist,OS_INT);
                          hr:=rg.getregisterint(exprasmlist,OS_INT);
                          { load set value into register }
                          { load set value into register }
-                         cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,
+                         cg.a_load_reg_reg(exprasmlist,right.location.size,OS_INT,
                             right.location.register,hr);
                             right.location.register,hr);
                          location_release(exprasmlist,right.location);
                          location_release(exprasmlist,right.location);
                       end;
                       end;
@@ -449,7 +449,7 @@ implementation
                       begin
                       begin
                          hr:=rg.getregisterint(exprasmlist,OS_INT);
                          hr:=rg.getregisterint(exprasmlist,OS_INT);
                          { load set value into register }
                          { load set value into register }
-                         cg.a_load_ref_reg(exprasmlist,OS_32,
+                         cg.a_load_ref_reg(exprasmlist,OS_INT,opsize,
                             right.location.reference,hr);
                             right.location.reference,hr);
                          location_release(exprasmlist,right.location);
                          location_release(exprasmlist,right.location);
                       end;
                       end;
@@ -470,8 +470,7 @@ implementation
                      LOC_REGISTER,
                      LOC_REGISTER,
                      LOC_CREGISTER:
                      LOC_CREGISTER:
                        begin
                        begin
-                          hr3.enum:=R_INTREGISTER;
-                          hr3.number:=(left.location.register.number and not $ff) or R_SUBWHOLE;
+                          hr3:=rg.makeregsize(left.location.register,OS_INT);
                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr3);
                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_INT,left.location.register,hr3);
                         {$ifdef newra}
                         {$ifdef newra}
                           hr:=rg.getregisterint(exprasmlist,OS_INT);
                           hr:=rg.getregisterint(exprasmlist,OS_INT);
@@ -487,34 +486,30 @@ implementation
                     {$else}
                     {$else}
                       hr:=cg.get_scratch_reg_int(exprasmlist,OS_INT);
                       hr:=cg.get_scratch_reg_int(exprasmlist,OS_INT);
                     {$endif}
                     {$endif}
-                      cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),
+                      cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),OS_INT,
                          left.location.reference,hr);
                          left.location.reference,hr);
                       location_release(exprasmlist,left.location);
                       location_release(exprasmlist,left.location);
                     end;
                     end;
                   end;
                   end;
 
 
                   case right.location.loc of
                   case right.location.loc of
-                 LOC_REGISTER,
-                LOC_CREGISTER :
-                          begin
-                            hr2:=right.location.register;
-                          end;
-                   LOC_CONSTANT :
-                       begin
-                         hr2:=rg.getregisterint(exprasmlist,OS_32);
-                         cg.a_load_const_reg(exprasmlist,OS_32,
-                            right.location.value,hr2);
-                       end;
-                   LOC_CREFERENCE,
-                   LOC_REFERENCE :
-                       begin
-                         location_release(exprasmlist,right.location);
-                         hr2:=rg.getregisterint(exprasmlist,OS_32);
-                         cg.a_load_ref_reg(exprasmlist, OS_32,
-                           right.location.reference,hr2);
-                       end;
-                     else
-                       internalerror(2002032210);
+                    LOC_REGISTER,
+                    LOC_CREGISTER :
+                      hr2:=right.location.register;
+                    LOC_CONSTANT :
+                      begin
+                        hr2:=rg.getregisterint(exprasmlist,OS_INT);
+                        cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
+                      end;
+                    LOC_CREFERENCE,
+                    LOC_REFERENCE :
+                      begin
+                        location_release(exprasmlist,right.location);
+                        hr2:=rg.getregisterint(exprasmlist,OS_INT);
+                        cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,right.location.reference,hr2);
+                      end;
+                    else
+                      internalerror(2002032210);
                   end;
                   end;
                   { emit bit test operation }
                   { emit bit test operation }
                   emit_bit_test_reg_reg(exprasmlist,hr,hr2,location.register);
                   emit_bit_test_reg_reg(exprasmlist,hr,hr2,location.register);
@@ -564,19 +559,19 @@ implementation
                           hr2:=rg.getregisterint(exprasmlist,OS_INT);
                           hr2:=rg.getregisterint(exprasmlist,OS_INT);
                           cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
                           cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
                        end;
                        end;
-                     LOC_REFERENCE,LOC_CREFERENCE:
+                     LOC_REFERENCE,
+                     LOC_CREFERENCE:
                        begin
                        begin
                           cg.a_cmp_const_ref_label(exprasmlist,OS_8,OC_BE,31,left.location.reference,l);
                           cg.a_cmp_const_ref_label(exprasmlist,OS_8,OC_BE,31,left.location.reference,l);
                           cg.a_jmp_always(exprasmlist,l2);
                           cg.a_jmp_always(exprasmlist,l2);
                           cg.a_label(exprasmlist,l);
                           cg.a_label(exprasmlist,l);
                           location_release(exprasmlist,left.location);
                           location_release(exprasmlist,left.location);
-                          hr:=rg.getregisterint(exprasmlist,OS_32);
-                          cg.a_load_ref_reg(exprasmlist,OS_32,left.location.reference,hr);
+                          hr:=rg.getregisterint(exprasmlist,OS_INT);
+                          cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,left.location.reference,hr);
                         { We have to load the value into a register because
                         { We have to load the value into a register because
                           btl does not accept values only refs or regs (PFV) }
                           btl does not accept values only refs or regs (PFV) }
                           hr2:=rg.getregisterint(exprasmlist,OS_INT);
                           hr2:=rg.getregisterint(exprasmlist,OS_INT);
-                          cg.a_load_const_reg(exprasmlist,OS_INT,
-                            right.location.value,hr2);
+                          cg.a_load_const_reg(exprasmlist,OS_INT,right.location.value,hr2);
                        end;
                        end;
                      else
                      else
                        internalerror(2002081002);
                        internalerror(2002081002);
@@ -598,7 +593,7 @@ implementation
                   else
                   else
                     { adjust for endianess differences }
                     { adjust for endianess differences }
                     inc(right.location.reference.offset,(tordconstnode(left).value shr 3) xor 3);
                     inc(right.location.reference.offset,(tordconstnode(left).value shr 3) xor 3);
-                  cg.a_load_ref_reg(exprasmlist,OS_8,right.location.reference, location.register);
+                  cg.a_load_ref_reg(exprasmlist,OS_8,location.size,right.location.reference, location.register);
                   location_release(exprasmlist,right.location);
                   location_release(exprasmlist,right.location);
                   cg.a_op_const_reg(exprasmlist,OP_SHR,location.size,tordconstnode(left).value and 7,
                   cg.a_op_const_reg(exprasmlist,OP_SHR,location.size,tordconstnode(left).value and 7,
                     location.register);
                     location.register);
@@ -678,16 +673,16 @@ implementation
            { need we to test the first value }
            { need we to test the first value }
            if first and (t^._low>get_min_value(left.resulttype.def)) then
            if first and (t^._low>get_min_value(left.resulttype.def)) then
              begin
              begin
-                cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_lt,aword(t^._low),hregister,elselabel);
+                cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_lt,aword(t^._low),hregister,elselabel);
              end;
              end;
            if t^._low=t^._high then
            if t^._low=t^._high then
              begin
              begin
                 if t^._low-last=0 then
                 if t^._low-last=0 then
-                  cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ,0,hregister,t^.statement)
+                  cg.a_cmp_const_reg_label(exprasmlist, opsize, OC_EQ,0,hregister,t^.statement)
                 else
                 else
                   begin
                   begin
                       gensub(longint(t^._low-last));
                       gensub(longint(t^._low-last));
-                      cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ,aword(t^._low-last),scratch_reg,t^.statement);
+                      cg.a_cmp_const_reg_label(exprasmlist, opsize, OC_EQ,aword(t^._low-last),scratch_reg,t^.statement);
                   end;
                   end;
                 last:=t^._low;
                 last:=t^._low;
              end
              end
@@ -708,10 +703,10 @@ implementation
                     { present label then the lower limit can be checked    }
                     { present label then the lower limit can be checked    }
                     { immediately. else check the range in between:       }
                     { immediately. else check the range in between:       }
                     gensub(longint(t^._low-last));
                     gensub(longint(t^._low-last));
-                    cg.a_cmp_const_reg_label(exprasmlist, OS_INT,jmp_lt,aword(t^._low-last),scratch_reg,elselabel);
+                    cg.a_cmp_const_reg_label(exprasmlist, opsize,jmp_lt,aword(t^._low-last),scratch_reg,elselabel);
                   end;
                   end;
                 gensub(longint(t^._high-t^._low));
                 gensub(longint(t^._high-t^._low));
-                cg.a_cmp_const_reg_label(exprasmlist, OS_INT,jmp_le,aword(t^._high-t^._low),scratch_reg,t^.statement);
+                cg.a_cmp_const_reg_label(exprasmlist, opsize,jmp_le,aword(t^._high-t^._low),scratch_reg,t^.statement);
                 last:=t^._high;
                 last:=t^._high;
              end;
              end;
            first:=false;
            first:=false;
@@ -728,9 +723,9 @@ implementation
               last:=0;
               last:=0;
               first:=true;
               first:=true;
             {$ifdef newra}
             {$ifdef newra}
-              scratch_reg:=rg.getregisterint(exprasmlist,OS_INT);
+              scratch_reg:=rg.getregisterint(exprasmlist,opsize);
             {$else newra}
             {$else newra}
-              scratch_reg := cg.get_scratch_reg_int(exprasmlist,OS_INT);
+              scratch_reg := cg.get_scratch_reg_int(exprasmlist,opsize);
             {$endif}
             {$endif}
               genitem(hp);
               genitem(hp);
             {$ifdef newra}
             {$ifdef newra}
@@ -763,17 +758,17 @@ implementation
                   begin
                   begin
                      objectlibrary.getlabel(l1);
                      objectlibrary.getlabel(l1);
 {$ifdef Delphi}
 {$ifdef Delphi}
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_NE, hi((t^._low)),hregister2,l1);
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ, lo((t^._low)),hregister, t^.statement);
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_NE, hi((t^._low)),hregister2,l1);
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_EQ, lo((t^._low)),hregister, t^.statement);
 {$else}
 {$else}
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_NE, aword(hi(int64(t^._low))),hregister2,l1);
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ, aword(lo(int64(t^._low))),hregister, t^.statement);
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_NE, aword(hi(int64(t^._low))),hregister2,l1);
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_EQ, aword(lo(int64(t^._low))),hregister, t^.statement);
 {$endif}
 {$endif}
                      cg.a_label(exprasmlist,l1);
                      cg.a_label(exprasmlist,l1);
                   end
                   end
                 else
                 else
                   begin
                   begin
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_EQ, aword(t^._low),hregister, t^.statement);
+                     cg.a_cmp_const_reg_label(exprasmlist, opsize, OC_EQ, aword(t^._low),hregister, t^.statement);
                      last:=t^._low;
                      last:=t^._low;
                   end;
                   end;
              end
              end
@@ -788,25 +783,25 @@ implementation
                        begin
                        begin
                           objectlibrary.getlabel(l1);
                           objectlibrary.getlabel(l1);
 {$ifdef Delphi}
 {$ifdef Delphi}
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_lt, aword(hi((t^._low))),
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_lt, aword(hi((t^._low))),
                                hregister2, elselabel);
                                hregister2, elselabel);
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_gt, aword(hi((t^._low))),
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_gt, aword(hi((t^._low))),
                                hregister2, l1);
                                hregister2, l1);
                           { the comparisation of the low dword must be always unsigned! }
                           { the comparisation of the low dword must be always unsigned! }
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_B, aword(lo((t^._low))), hregister, elselabel);
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_B, aword(lo((t^._low))), hregister, elselabel);
 {$else}
 {$else}
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_lt, aword(hi(int64(t^._low))),
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_lt, aword(hi(int64(t^._low))),
                                hregister2, elselabel);
                                hregister2, elselabel);
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_gt, aword(hi(int64(t^._low))),
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_gt, aword(hi(int64(t^._low))),
                                hregister2, l1);
                                hregister2, l1);
                           { the comparisation of the low dword must be always unsigned! }
                           { the comparisation of the low dword must be always unsigned! }
-                          cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_B, aword(lo(int64(t^._low))), hregister, elselabel);
+                          cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_B, aword(lo(int64(t^._low))), hregister, elselabel);
 {$endif}
 {$endif}
                           cg.a_label(exprasmlist,l1);
                           cg.a_label(exprasmlist,l1);
                        end
                        end
                      else
                      else
                        begin
                        begin
-                        cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_lt, aword(t^._low), hregister,
+                        cg.a_cmp_const_reg_label(exprasmlist, opsize, jmp_lt, aword(t^._low), hregister,
                            elselabel);
                            elselabel);
                        end;
                        end;
                   end;
                   end;
@@ -815,23 +810,23 @@ implementation
                   begin
                   begin
                      objectlibrary.getlabel(l1);
                      objectlibrary.getlabel(l1);
 {$ifdef Delphi}
 {$ifdef Delphi}
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_lt, aword(hi(t^._high)), hregister2,
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_lt, aword(hi(t^._high)), hregister2,
                            t^.statement);
                            t^.statement);
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_gt, aword(hi(t^._high)), hregister2,
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_gt, aword(hi(t^._high)), hregister2,
                            l1);
                            l1);
-                    cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_BE, aword(lo(t^._high)), hregister, t^.statement);
+                    cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_BE, aword(lo(t^._high)), hregister, t^.statement);
 {$else}
 {$else}
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_lt, aword(hi(int64(t^._high))), hregister2,
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_lt, aword(hi(int64(t^._high))), hregister2,
                            t^.statement);
                            t^.statement);
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_gt, aword(hi(int64(t^._high))), hregister2,
+                     cg.a_cmp_const_reg_label(exprasmlist, OS_32, jmp_gt, aword(hi(int64(t^._high))), hregister2,
                            l1);
                            l1);
-                    cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_BE, aword(lo(int64(t^._high))), hregister, t^.statement);
+                    cg.a_cmp_const_reg_label(exprasmlist, OS_32, OC_BE, aword(lo(int64(t^._high))), hregister, t^.statement);
 {$endif}
 {$endif}
                     cg.a_label(exprasmlist,l1);
                     cg.a_label(exprasmlist,l1);
                   end
                   end
                 else
                 else
                   begin
                   begin
-                     cg.a_cmp_const_reg_label(exprasmlist, OS_INT, jmp_le, aword(t^._high), hregister, t^.statement);
+                     cg.a_cmp_const_reg_label(exprasmlist, opsize, jmp_le, aword(t^._high), hregister, t^.statement);
                   end;
                   end;
 
 
                 last:=t^._high;
                 last:=t^._high;
@@ -869,19 +864,19 @@ implementation
           begin
           begin
              if greaterlabel=lesslabel then
              if greaterlabel=lesslabel then
                begin
                begin
-                 cg.a_cmp_const_reg_label(exprasmlist, OS_INT, OC_NE,p^._low,hregister, lesslabel);
+                 cg.a_cmp_const_reg_label(exprasmlist, opsize, OC_NE,p^._low,hregister, lesslabel);
                end
                end
              else
              else
                begin
                begin
-                 cg.a_cmp_const_reg_label(exprasmlist,OS_INT, jmp_lt,p^._low,hregister, lesslabel);
-                 cg.a_cmp_const_reg_label(exprasmlist,OS_INT, jmp_gt,p^._low,hregister, greaterlabel);
+                 cg.a_cmp_const_reg_label(exprasmlist,opsize, jmp_lt,p^._low,hregister, lesslabel);
+                 cg.a_cmp_const_reg_label(exprasmlist,opsize, jmp_gt,p^._low,hregister, greaterlabel);
                end;
                end;
              cg.a_jmp_always(exprasmlist,p^.statement);
              cg.a_jmp_always(exprasmlist,p^.statement);
           end
           end
         else
         else
           begin
           begin
-             cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_lt,p^._low, hregister, lesslabel);
-             cg.a_cmp_const_reg_label(exprasmlist,OS_INT,jmp_gt,p^._high,hregister, greaterlabel);
+             cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_lt,p^._low, hregister, lesslabel);
+             cg.a_cmp_const_reg_label(exprasmlist,opsize,jmp_gt,p^._high,hregister, greaterlabel);
              cg.a_jmp_always(exprasmlist,p^.statement);
              cg.a_jmp_always(exprasmlist,p^.statement);
           end;
           end;
          if assigned(p^.less) then
          if assigned(p^.less) then
@@ -1121,7 +1116,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.39  2003-06-01 21:38:06  peter
+  Revision 1.40  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.39  2003/06/01 21:38:06  peter
     * getregisterfpu size parameter added
     * getregisterfpu size parameter added
     * op_const_reg size parameter added
     * op_const_reg size parameter added
     * sparc updates
     * sparc updates

+ 32 - 56
compiler/ncgutil.pas

@@ -64,7 +64,7 @@ interface
                               const locpara : tparalocation);
                               const locpara : tparalocation);
 
 
     procedure genentrycode(list:TAAsmoutput;inlined:boolean);
     procedure genentrycode(list:TAAsmoutput;inlined:boolean);
-    procedure gen_stackalloc_code(list:Taasmoutput;stackframe:cardinal);
+    procedure gen_stackalloc_code(list:Taasmoutput;stackframe:longint);
     procedure genexitcode(list:Taasmoutput;inlined:boolean);
     procedure genexitcode(list:Taasmoutput;inlined:boolean);
 
 
     procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint);
     procedure geninlineentrycode(list : TAAsmoutput;stackframe:longint);
@@ -430,7 +430,7 @@ implementation
                   rg.isaddressregister(hregister)} then
                   rg.isaddressregister(hregister)} then
                  hregister:=rg.getregisterint(list,dst_size);
                  hregister:=rg.getregisterint(list,dst_size);
              end;
              end;
-           hregister.number:=(hregister.number and not $ff) or cgsize2subreg(dst_size);
+           hregister:=rg.makeregsize(hregister,dst_size);
         {$ifdef newra}
         {$ifdef newra}
            rg.add_constraints(hregister.number);
            rg.add_constraints(hregister.number);
         {$endif}
         {$endif}
@@ -456,7 +456,7 @@ implementation
                  if (TCGSize2Size[dst_size]<TCGSize2Size[l.size]) then
                  if (TCGSize2Size[dst_size]<TCGSize2Size[l.size]) then
                   begin
                   begin
                     if (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
                     if (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
-                      l.register.number:=(l.register.number and not $ff) or cgsize2subreg(dst_size);
+                      l.register:=rg.makeregsize(l.register,dst_size);
                     { for big endian systems, the reference's offset must }
                     { for big endian systems, the reference's offset must }
                     { be increased in this case, since they have the      }
                     { be increased in this case, since they have the      }
                     { MSB first in memory and e.g. byte(word_var) should  }
                     { MSB first in memory and e.g. byte(word_var) should  }
@@ -665,9 +665,9 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,r);
               if l.size in [OS_64,OS_S64] then
               if l.size in [OS_64,OS_S64] then
-               cg64.a_load64_loc_ref(list,l,r)
+                cg64.a_load64_loc_ref(list,l,r)
               else
               else
-               cg.a_load_loc_ref(list,l,r);
+                cg.a_load_loc_ref(list,l.size,l,r);
               location_release(list,l);
               location_release(list,l);
               location_reset(l,LOC_REFERENCE,l.size);
               location_reset(l,LOC_REFERENCE,l.size);
               l.reference:=r;
               l.reference:=r;
@@ -709,7 +709,7 @@ implementation
 {$endif cpu64bit}
 {$endif cpu64bit}
                   begin
                   begin
                     tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,s.ref);
                     tg.GetTemp(list,TCGSize2Size[l.size],tt_normal,s.ref);
-                    cg.a_load_reg_ref(list,l.size,l.register,s.ref);
+                    cg.a_load_reg_ref(list,l.size,l.size,l.register,s.ref);
                   end;
                   end;
                  location_release(list,l);
                  location_release(list,l);
                  s.saved:=true;
                  s.saved:=true;
@@ -739,7 +739,7 @@ implementation
                      end;
                      end;
                     { save base register }
                     { save base register }
                     tg.GetTemp(list,TCGSize2Size[OS_ADDR],tt_normal,s.ref);
                     tg.GetTemp(list,TCGSize2Size[OS_ADDR],tt_normal,s.ref);
-                    cg.a_load_reg_ref(list,OS_ADDR,l.reference.base,s.ref);
+                    cg.a_load_reg_ref(list,OS_ADDR,OS_ADDR,l.reference.base,s.ref);
                     { release }
                     { release }
                     location_release(list,l);
                     location_release(list,l);
                     s.saved:=true;
                     s.saved:=true;
@@ -773,7 +773,7 @@ implementation
 {$endif cpu64bit}
 {$endif cpu64bit}
                begin
                begin
                  l.register:=rg.getregisterint(list,OS_INT);
                  l.register:=rg.getregisterint(list,OS_INT);
-                 cg.a_load_ref_reg(list,OS_INT,s.ref,l.register);
+                 cg.a_load_ref_reg(list,OS_INT,OS_INT,s.ref,l.register);
                end;
                end;
             end;
             end;
           LOC_CREFERENCE,
           LOC_CREFERENCE,
@@ -781,7 +781,7 @@ implementation
             begin
             begin
               reference_reset(l.reference);
               reference_reset(l.reference);
               l.reference.base:=rg.getaddressregister(list);
               l.reference.base:=rg.getaddressregister(list);
-              cg.a_load_ref_reg(list,OS_ADDR,s.ref,l.reference.base);
+              cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,s.ref,l.reference.base);
             end;
             end;
         end;
         end;
         tg.ungetiftemp(list,s.ref);
         tg.ungetiftemp(list,s.ref);
@@ -888,7 +888,7 @@ implementation
                         if calloption=pocall_inline then
                         if calloption=pocall_inline then
                          begin
                          begin
                            reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
                            reference_reset_base(href,current_procinfo.framepointer,para_offset-pushedparasize);
-                           cg.a_load_ref_ref(list,cgsize,tempreference,href);
+                           cg.a_load_ref_ref(list,cgsize,cgsize,tempreference,href);
                          end
                          end
                         else
                         else
                          cg.a_param_ref(list,cgsize,tempreference,locpara);
                          cg.a_param_ref(list,cgsize,tempreference,locpara);
@@ -949,28 +949,6 @@ implementation
                      end
                      end
                     else
                     else
                      begin
                      begin
-                       case cgsize of
-                         OS_8,OS_S8 :
-                           begin
-                             if alignment=4 then
-                              cgsize:=OS_32
-                             else
-                              cgsize:=OS_16;
-                           end;
-                         OS_16,OS_S16 :
-                           begin
-                             if alignment=4 then
-                              cgsize:=OS_32;
-                           end;
-                       end;
-                       { update register to use to match alignment }
-                       if p.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
-                        begin
-                          if p.location.register.enum<>R_INTREGISTER then
-                            internalerror(200302024);
-                          hreg:=p.location.register;
-                          p.location.register.number:=(p.location.register.number and not $ff) or cgsize2subreg(cgsize);
-                        end;
                        inc(pushedparasize,alignment);
                        inc(pushedparasize,alignment);
                        if calloption=pocall_inline then
                        if calloption=pocall_inline then
                         begin
                         begin
@@ -981,13 +959,10 @@ implementation
                               cg.g_concatcopy(list,p.location.reference,href,size,false,false)
                               cg.g_concatcopy(list,p.location.reference,href,size,false,false)
                             end
                             end
                           else
                           else
-                            cg.a_load_loc_ref(list,p.location,href);
+                            cg.a_load_loc_ref(list,p.location.size,p.location,href);
                         end
                         end
                        else
                        else
                         cg.a_param_loc(list,p.location,locpara);
                         cg.a_param_loc(list,p.location,locpara);
-                       { restore old register }
-                       if p.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
-                         p.location.register:=hreg;
                      end;
                      end;
                     location_release(list,p.location);
                     location_release(list,p.location);
                   end;
                   end;
@@ -1143,7 +1118,7 @@ implementation
                {$else}
                {$else}
                  tmpreg:=cg.get_scratch_reg_address(list);
                  tmpreg:=cg.get_scratch_reg_address(list);
                {$endif}
                {$endif}
-                 cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
+                 cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,tmpreg);
                  reference_reset_base(href,tmpreg,0);
                  reference_reset_base(href,tmpreg,0);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
                {$ifdef newra}
                {$ifdef newra}
@@ -1239,7 +1214,6 @@ implementation
 
 
     procedure initretvalue(list:taasmoutput);
     procedure initretvalue(list:taasmoutput);
       var
       var
-        paraloc : tparalocation;
         href    : treference;
         href    : treference;
       begin
       begin
         if not is_void(current_procdef.rettype.def) then
         if not is_void(current_procdef.rettype.def) then
@@ -1257,7 +1231,7 @@ implementation
                   cg.g_initialize(list,current_procdef.rettype.def,href,paramanager.ret_in_param(current_procdef.rettype.def,current_procdef.proccalloption));
                   cg.g_initialize(list,current_procdef.rettype.def,href,paramanager.ret_in_param(current_procdef.rettype.def,current_procdef.proccalloption));
                   { load the pointer to the initialized retvalue in te register }
                   { load the pointer to the initialized retvalue in te register }
                   if (tvarsym(current_procdef.funcretsym).reg.enum <> R_NO) then
                   if (tvarsym(current_procdef.funcretsym).reg.enum <> R_NO) then
-                    cg.a_load_ref_reg(list,OS_ADDR,href,tvarsym(current_procdef.funcretsym).reg);
+                    cg.a_load_ref_reg(list,OS_ADDR,def_cgsize(current_procdef.rettype.def),href,tvarsym(current_procdef.funcretsym).reg);
                end;
                end;
           end;
           end;
       end;
       end;
@@ -1283,7 +1257,7 @@ implementation
                    location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                    location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                resloc.register := ressym.reg;
                resloc.register := ressym.reg;
              end
              end
-           else 
+           else
              begin
              begin
                location_reset(resloc,LOC_REFERENCE,def_cgsize(current_procdef.rettype.def));
                location_reset(resloc,LOC_REFERENCE,def_cgsize(current_procdef.rettype.def));
                reference_reset_base(resloc.reference,current_procinfo.framepointer,tvarsym(current_procdef.funcretsym).adjusted_address);
                reference_reset_base(resloc.reference,current_procinfo.framepointer,tvarsym(current_procdef.funcretsym).adjusted_address);
@@ -1312,7 +1286,8 @@ implementation
 {$endif cpu64bit}
 {$endif cpu64bit}
                   begin
                   begin
                     hreg.enum:=R_INTREGISTER;
                     hreg.enum:=R_INTREGISTER;
-                    hreg.number:=(RS_FUNCTION_RETURN_REG shl 8) or cgsize2subreg(resloc.size);
+                    hreg.number:=NR_FUNCTION_RETURN_REG;
+                    hreg:=rg.makeregsize(hreg,resloc.size);
                     cg.a_load_loc_reg(list,resloc.size,resloc,hreg);
                     cg.a_load_loc_reg(list,resloc.size,resloc,hreg);
                   end;
                   end;
                end;
                end;
@@ -1400,7 +1375,7 @@ implementation
                          LOC_CREFERENCE:
                          LOC_CREFERENCE:
                            begin
                            begin
                              reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).adjusted_address);
                              reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).adjusted_address);
-                             cg.a_load_ref_reg(list,hp.paraloc.size,href,tvarsym(hp.parasym).reg);
+                             cg.a_load_ref_reg(list,hp.paraloc.size,hp.paraloc.size,href,tvarsym(hp.parasym).reg);
                            end;
                            end;
                          else
                          else
                            internalerror(2003053010);
                            internalerror(2003053010);
@@ -1414,7 +1389,7 @@ implementation
                            LOC_CREGISTER,
                            LOC_CREGISTER,
                            LOC_REGISTER:
                            LOC_REGISTER:
                             if not(hp.paraloc.size in [OS_S64,OS_64]) then
                             if not(hp.paraloc.size in [OS_S64,OS_64]) then
-                               cg.a_load_reg_ref(list,hp.paraloc.size,hp.paraloc.register,href)
+                               cg.a_load_reg_ref(list,hp.paraloc.size,hp.paraloc.size,hp.paraloc.register,href)
                             else
                             else
                                cg64.a_load64_reg_ref(list,hp.paraloc.register64,href);
                                cg64.a_load64_reg_ref(list,hp.paraloc.register64,href);
                            LOC_FPUREGISTER,
                            LOC_FPUREGISTER,
@@ -1448,7 +1423,7 @@ implementation
            tg.GetTemp(list,POINTER_SIZE,tt_noreuse,current_procinfo.save_stackptr_ref);
            tg.GetTemp(list,POINTER_SIZE,tt_noreuse,current_procinfo.save_stackptr_ref);
            rsp.enum:=R_INTREGISTER;
            rsp.enum:=R_INTREGISTER;
            rsp.number:=NR_STACK_POINTER_REG;
            rsp.number:=NR_STACK_POINTER_REG;
-           cg.a_load_reg_ref(list,OS_ADDR,rsp,current_procinfo.save_stackptr_ref);
+           cg.a_load_reg_ref(list,OS_ADDR,OS_ADDR,rsp,current_procinfo.save_stackptr_ref);
          end;
          end;
 
 
         { the actual profile code can clobber some registers,
         { the actual profile code can clobber some registers,
@@ -1533,7 +1508,7 @@ implementation
 
 
       end;
       end;
 
 
-    procedure gen_stackalloc_code(list:Taasmoutput;stackframe:cardinal);
+    procedure gen_stackalloc_code(list:Taasmoutput;stackframe:longint);
 
 
     var hs:string;
     var hs:string;
 
 
@@ -1617,14 +1592,10 @@ implementation
         srsym : tsym;
         srsym : tsym;
         usesacc,
         usesacc,
         usesacchi,
         usesacchi,
-        usesself,usesfpu : boolean;
-        pd : tprocdef;
-        rsp,tmpreg,r  : Tregister;
-        retsize:cardinal;
-        nostackframe:boolean;
+        usesfpu : boolean;
+        rsp,r : Tregister;
+        retsize : longint;
       begin
       begin
-{        nostackframe:=current_procinfo.framepointer.number=NR_STACK_POINTER_REG;}
-
         if aktexitlabel.is_used then
         if aktexitlabel.is_used then
           cg.a_label(list,aktexitlabel);
           cg.a_label(list,aktexitlabel);
 
 
@@ -1685,7 +1656,7 @@ implementation
                 if not assigned(srsym) then
                 if not assigned(srsym) then
                   internalerror(200305058);
                   internalerror(200305058);
                 reference_reset_base(href,current_procinfo.framepointer,tvarsym(srsym).adjusted_address);
                 reference_reset_base(href,current_procinfo.framepointer,tvarsym(srsym).adjusted_address);
-                cg.a_load_ref_reg(list,OS_ADDR,href,r);
+                cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,r);
                 cg.a_reg_dealloc(list,r);
                 cg.a_reg_dealloc(list,r);
                 usesacc:=true;
                 usesacc:=true;
               end
               end
@@ -1709,7 +1680,7 @@ implementation
          begin
          begin
            rsp.enum:=R_INTREGISTER;
            rsp.enum:=R_INTREGISTER;
            rsp.number:=NR_STACK_POINTER_REG;
            rsp.number:=NR_STACK_POINTER_REG;
-           cg.a_load_ref_reg(list,OS_ADDR,current_procinfo.save_stackptr_ref,rsp);
+           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,current_procinfo.save_stackptr_ref,rsp);
            tg.UngetTemp(list,current_procinfo.save_stackptr_ref);
            tg.UngetTemp(list,current_procinfo.save_stackptr_ref);
          end;
          end;
 
 
@@ -1850,7 +1821,7 @@ implementation
                    location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                    location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                resloc.register := ressym.reg;
                resloc.register := ressym.reg;
              end
              end
-           else   
+           else
              begin
              begin
                location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                location_reset(resloc,LOC_CREGISTER,def_cgsize(current_procdef.rettype.def));
                reference_reset_base(resloc.reference,current_procinfo.framepointer,tvarsym(current_procdef.funcretsym).adjusted_address);
                reference_reset_base(resloc.reference,current_procinfo.framepointer,tvarsym(current_procdef.funcretsym).adjusted_address);
@@ -1971,7 +1942,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.120  2003-06-03 15:49:49  jonas
+  Revision 1.121  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.120  2003/06/03 15:49:49  jonas
     * fixed ref/loc problems
     * fixed ref/loc problems
 
 
   Revision 1.119  2003/06/03 15:06:37  daniel
   Revision 1.119  2003/06/03 15:06:37  daniel

+ 13 - 5
compiler/regvars.pas

@@ -307,6 +307,7 @@ implementation
     procedure store_regvar(asml: TAAsmoutput; reg: tregister);
     procedure store_regvar(asml: TAAsmoutput; reg: tregister);
     var
     var
       i: longint;
       i: longint;
+      cgsize : tcgsize;
       r : tregister;
       r : tregister;
       hr: treference;
       hr: treference;
       regvarinfo: pregvarinfo;
       regvarinfo: pregvarinfo;
@@ -330,7 +331,8 @@ implementation
                     if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
                     if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
                       begin
                       begin
                         reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
                         reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
-                        cg.a_load_reg_ref(asml,def_cgsize(vsym.vartype.def),vsym.reg,hr);
+                        cgsize:=def_cgsize(vsym.vartype.def);
+                        cg.a_load_reg_ref(asml,cgsize,cgsize,vsym.reg,hr);
                       end;
                       end;
                     asml.concat(tai_regalloc.dealloc(vsym.reg));
                     asml.concat(tai_regalloc.dealloc(vsym.reg));
                     exclude(rg.regvar_loaded_int,reg.number shr 8);
                     exclude(rg.regvar_loaded_int,reg.number shr 8);
@@ -354,7 +356,8 @@ implementation
                         if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
                         if not(vsym.varspez in [vs_const,vs_var,vs_out]) then
                           begin
                           begin
                             reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
                             reference_reset_base(hr,current_procinfo.framepointer,vsym.adjusted_address);
-                            cg.a_load_reg_ref(asml,def_cgsize(vsym.vartype.def),vsym.reg,hr);
+                            cgsize:=def_cgsize(vsym.vartype.def);
+                            cg.a_load_reg_ref(asml,cgsize,cgsize,vsym.reg,hr);
                           end;
                           end;
                         asml.concat(tai_regalloc.dealloc(vsym.reg));
                         asml.concat(tai_regalloc.dealloc(vsym.reg));
                         rg.regvar_loaded_other[r.enum] := false;
                         rg.regvar_loaded_other[r.enum] := false;
@@ -389,7 +392,7 @@ implementation
                 opsize := OS_ADDR
                 opsize := OS_ADDR
               else
               else
                 opsize := def_cgsize(vsym.vartype.def);
                 opsize := def_cgsize(vsym.vartype.def);
-              cg.a_load_ref_reg(asml,opsize,hr,reg);
+              cg.a_load_ref_reg(asml,opsize,opsize,hr,reg);
               include(rg.regvar_loaded_int,reg.number shr 8);
               include(rg.regvar_loaded_int,reg.number shr 8);
             end;
             end;
         end
         end
@@ -406,7 +409,7 @@ implementation
                 opsize := OS_ADDR
                 opsize := OS_ADDR
               else
               else
                 opsize := def_cgsize(vsym.vartype.def);
                 opsize := def_cgsize(vsym.vartype.def);
-              cg.a_load_ref_reg(asml,opsize,hr,reg);
+              cg.a_load_ref_reg(asml,opsize,opsize,hr,reg);
               rg.regvar_loaded_other[r.enum] := true;
               rg.regvar_loaded_other[r.enum] := true;
             end;
             end;
         end;
         end;
@@ -608,7 +611,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.54  2003-06-03 13:01:59  daniel
+  Revision 1.55  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.54  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.53  2003/05/31 20:33:57  jonas
   Revision 1.53  2003/05/31 20:33:57  jonas

+ 11 - 6
compiler/rgobj.pas

@@ -464,7 +464,7 @@ unit rgobj;
      procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
      procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
      procedure location_release(list: taasmoutput; const l : tlocation);
      procedure location_release(list: taasmoutput; const l : tlocation);
      procedure location_freetemp(list: taasmoutput; const l : tlocation);
      procedure location_freetemp(list: taasmoutput; const l : tlocation);
-     procedure location_copy(var destloc,sourceloc : tlocation);
+     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
      procedure location_swap(var destloc,sourceloc : tlocation);
      procedure location_swap(var destloc,sourceloc : tlocation);
 
 
     type
     type
@@ -990,7 +990,7 @@ unit rgobj;
               saved[r].ofs:=hr.offset;
               saved[r].ofs:=hr.offset;
               r2.enum:=R_INTREGISTER;
               r2.enum:=R_INTREGISTER;
               r2.number:=r shl 8 or R_SUBWHOLE;
               r2.number:=r shl 8 or R_SUBWHOLE;
-              cg.a_load_reg_ref(list,OS_INT,r2,hr);
+              cg.a_load_reg_ref(list,OS_INT,OS_INT,r2,hr);
               cg.a_reg_dealloc(list,r2);
               cg.a_reg_dealloc(list,r2);
               include(unusedregsint,r);
               include(unusedregsint,r);
               inc(countunusedregsint);
               inc(countunusedregsint);
@@ -1080,7 +1080,7 @@ unit rgobj;
                 r2.enum:=R_INTREGISTER;
                 r2.enum:=R_INTREGISTER;
                 r2.number:=r shl 8 or R_SUBWHOLE;
                 r2.number:=r shl 8 or R_SUBWHOLE;
                 cg.a_reg_alloc(list,r2);
                 cg.a_reg_alloc(list,r2);
-                cg.a_load_ref_reg(list,OS_INT,hr,r2);
+                cg.a_load_ref_reg(list,OS_INT,OS_INT,hr,r2);
                 if not (r in unusedregsint) then
                 if not (r in unusedregsint) then
                   { internalerror(10)
                   { internalerror(10)
                     in n386cal we always save/restore the reg *state*
                     in n386cal we always save/restore the reg *state*
@@ -2050,7 +2050,7 @@ unit rgobj;
     {Remove node u from the interference graph and remove all collected
     {Remove node u from the interference graph and remove all collected
      move instructions it is associated with.}
      move instructions it is associated with.}
 
 
-    var i:byte; 
+    var i:byte;
         j,k,count:cardinal;
         j,k,count:cardinal;
         v:Tsuperregister;
         v:Tsuperregister;
         m,n:Tmoveins;
         m,n:Tmoveins;
@@ -2439,7 +2439,7 @@ unit rgobj;
       end;
       end;
 
 
 
 
-    procedure location_copy(var destloc,sourceloc : tlocation);
+    procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
       begin
       begin
         destloc:=sourceloc;
         destloc:=sourceloc;
       end;
       end;
@@ -2463,7 +2463,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.49  2003-06-03 13:01:59  daniel
+  Revision 1.50  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.49  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.48  2003/06/01 21:38:06  peter
   Revision 1.48  2003/06/01 21:38:06  peter

+ 203 - 216
compiler/x86/cgx86.pas

@@ -34,7 +34,7 @@ unit cgx86;
        cginfo,cgbase,cgobj,
        cginfo,cgbase,cgobj,
        aasmbase,aasmtai,aasmcpu,
        aasmbase,aasmtai,aasmcpu,
        cpubase,cpuinfo,
        cpubase,cpuinfo,
-       node,symconst;
+       symconst,symtype;
 
 
     type
     type
       tcgx86 = class(tcg)
       tcgx86 = class(tcg)
@@ -67,11 +67,11 @@ unit cgx86;
           size: tcgsize; src1, src2, dst: tregister); override;
           size: tcgsize; src1, src2, dst: tregister); override;
 
 
         { move instructions }
         { move instructions }
-        procedure a_load_const_reg(list : taasmoutput; size: tcgsize; a : aword;reg : tregister);override;
-        procedure a_load_const_ref(list : taasmoutput; size: tcgsize; a : aword;const ref : treference);override;
-        procedure a_load_reg_ref(list : taasmoutput; size: tcgsize; reg : tregister;const ref : treference);override;
-        procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref : treference;reg : tregister);override;
-        procedure a_load_reg_reg(list : taasmoutput;fromsize,tosize : tcgsize;reg1,reg2 : tregister);override;
+        procedure a_load_const_reg(list : taasmoutput; tosize: tcgsize; a : aword;reg : tregister);override;
+        procedure a_load_const_ref(list : taasmoutput; tosize: tcgsize; a : aword;const ref : treference);override;
+        procedure a_load_reg_ref(list : taasmoutput;fromsize,tosize: tcgsize; reg : tregister;const ref : treference);override;
+        procedure a_load_ref_reg(list : taasmoutput;fromsize,tosize: tcgsize;const ref : treference;reg : tregister);override;
+        procedure a_load_reg_reg(list : taasmoutput;fromsize,tosize: tcgsize;reg1,reg2 : tregister);override;
         procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);override;
         procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);override;
 
 
         { fpu move instructions }
         { fpu move instructions }
@@ -121,11 +121,13 @@ unit cgx86;
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_save_all_registers(list : taasmoutput);override;
         procedure g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean);override;
         procedure g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean);override;
 
 
-        procedure g_overflowcheck(list: taasmoutput; const p: tnode);override;
+        procedure g_overflowcheck(list: taasmoutput; const l:tlocation;def:tdef);override;
 
 
-      private
+      protected
         procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
         procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
-        procedure sizes2load(s1 : tcgsize;s2 : topsize; var op: tasmop; var s3: topsize);
+        procedure check_register_size(size:tcgsize;reg:tregister);
+      private
+        procedure sizes2load(s1,s2 : tcgsize;var op: tasmop; var s3: topsize);
 
 
         procedure floatload(list: taasmoutput; t : tcgsize;const ref : treference);
         procedure floatload(list: taasmoutput; t : tcgsize;const ref : treference);
         procedure floatstore(list: taasmoutput; t : tcgsize;const ref : treference);
         procedure floatstore(list: taasmoutput; t : tcgsize;const ref : treference);
@@ -164,23 +166,24 @@ unit cgx86;
                        This is private property, keep out! :)
                        This is private property, keep out! :)
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure tcgx86.sizes2load(s1 : tcgsize;s2: topsize; var op: tasmop; var s3: topsize);
+    procedure tcgx86.sizes2load(s1,s2 : tcgsize; var op: tasmop; var s3: topsize);
 
 
        begin
        begin
          case s2 of
          case s2 of
-           S_B:
+           OS_8,OS_S8 :
              if S1 in [OS_8,OS_S8] then
              if S1 in [OS_8,OS_S8] then
                s3 := S_B
                s3 := S_B
              else internalerror(200109221);
              else internalerror(200109221);
-           S_W:
+           OS_16,OS_S16:
              case s1 of
              case s1 of
                OS_8,OS_S8:
                OS_8,OS_S8:
                  s3 := S_BW;
                  s3 := S_BW;
                OS_16,OS_S16:
                OS_16,OS_S16:
                  s3 := S_W;
                  s3 := S_W;
-               else internalerror(200109222);
+               else
+                 internalerror(200109222);
              end;
              end;
-           S_L:
+           OS_32,OS_S32:
              case s1 of
              case s1 of
                OS_8,OS_S8:
                OS_8,OS_S8:
                  s3 := S_BL;
                  s3 := S_BL;
@@ -188,11 +191,11 @@ unit cgx86;
                  s3 := S_WL;
                  s3 := S_WL;
                OS_32,OS_S32:
                OS_32,OS_S32:
                  s3 := S_L;
                  s3 := S_L;
-               else internalerror(200109223);
+               else
+                 internalerror(200109223);
              end;
              end;
 {$ifdef x86_64}
 {$ifdef x86_64}
-           S_D,
-           S_Q:
+           OS_64,OS_S64:
              case s1 of
              case s1 of
                OS_8,OS_S8:
                OS_8,OS_S8:
                  s3 := S_BQ;
                  s3 := S_BQ;
@@ -202,10 +205,12 @@ unit cgx86;
                  s3 := S_LQ;
                  s3 := S_LQ;
                OS_64,OS_S64:
                OS_64,OS_S64:
                  s3 := S_Q;
                  s3 := S_Q;
-               else internalerror(200304302);
+               else
+                 internalerror(200304302);
              end;
              end;
 {$endif x86_64}
 {$endif x86_64}
-           else internalerror(200109227);
+           else
+             internalerror(200109227);
          end;
          end;
          if s3 in [S_B,S_W,S_L,S_Q] then
          if s3 in [S_B,S_W,S_L,S_Q] then
            op := A_MOV
            op := A_MOV
@@ -303,6 +308,15 @@ unit cgx86;
       end;
       end;
 
 
 
 
+    procedure tcgx86.check_register_size(size:tcgsize;reg:tregister);
+      begin
+        if (reg.enum<>R_INTREGISTER) then
+          internalerror(200301081);
+        if TCGSize2OpSize[size]<>TCGSize2OpSize[reg_cgsize(reg)] then
+          internalerror(200306031);
+      end;
+
+
 {****************************************************************************
 {****************************************************************************
                               Assembler code
                               Assembler code
 ****************************************************************************}
 ****************************************************************************}
@@ -331,6 +345,7 @@ unit cgx86;
 
 
     procedure tcgx86.a_param_reg(list : taasmoutput;size : tcgsize;r : tregister;const locpara : tparalocation);
     procedure tcgx86.a_param_reg(list : taasmoutput;size : tcgsize;r : tregister;const locpara : tparalocation);
       begin
       begin
+        check_register_size(size,r);
         case size of
         case size of
           OS_8,OS_S8,
           OS_8,OS_S8,
           OS_16,OS_S16:
           OS_16,OS_S16:
@@ -375,26 +390,25 @@ unit cgx86;
     procedure tcgx86.a_param_ref(list : taasmoutput;size : tcgsize;const r : treference;const locpara : tparalocation);
     procedure tcgx86.a_param_ref(list : taasmoutput;size : tcgsize;const r : treference;const locpara : tparalocation);
 
 
       var
       var
-        tmpreg: tregister;
+        pushsize : tcgsize;
+        tmpreg : tregister;
 
 
       begin
       begin
         case size of
         case size of
           OS_8,OS_S8,
           OS_8,OS_S8,
           OS_16,OS_S16:
           OS_16,OS_S16:
             begin
             begin
-            {$ifdef newra}
               if target_info.alignment.paraalign = 2 then
               if target_info.alignment.paraalign = 2 then
-                tmpreg:=rg.getregisterint(list,OS_16)
+                pushsize:=OS_16
               else
               else
-                tmpreg:=rg.getregisterint(list,OS_32);
+                pushsize:=OS_32;
+            {$ifdef newra}
+              tmpreg:=rg.getregisterint(list,pushsize)
             {$else}
             {$else}
-              if target_info.alignment.paraalign = 2 then
-                tmpreg:=get_scratch_reg_int(list,OS_16)
-              else
-                tmpreg:=get_scratch_reg_int(list,OS_32);
+              tmpreg:=get_scratch_reg_int(list,pushsize);
             {$endif}
             {$endif}
-              a_load_ref_reg(list,size,r,tmpreg);
-              list.concat(taicpu.op_reg(A_PUSH,S_L,tmpreg));
+              a_load_ref_reg(list,size,pushsize,r,tmpreg);
+              list.concat(taicpu.op_reg(A_PUSH,TCgsize2opsize[pushsize],tmpreg));
             {$ifdef newra}
             {$ifdef newra}
               rg.ungetregisterint(list,tmpreg);
               rg.ungetregisterint(list,tmpreg);
             {$else}
             {$else}
@@ -474,41 +488,41 @@ unit cgx86;
 
 
 {********************** load instructions ********************}
 {********************** load instructions ********************}
 
 
-    procedure tcgx86.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
+    procedure tcgx86.a_load_const_reg(list : taasmoutput; tosize: TCGSize; a : aword; reg : TRegister);
 
 
       begin
       begin
+        check_register_size(tosize,reg);
         { the optimizer will change it to "xor reg,reg" when loading zero, }
         { the optimizer will change it to "xor reg,reg" when loading zero, }
         { no need to do it here too (JM)                                   }
         { no need to do it here too (JM)                                   }
-        list.concat(taicpu.op_const_reg(A_MOV,TCGSize2OpSize[size],a,reg))
+        list.concat(taicpu.op_const_reg(A_MOV,TCGSize2OpSize[tosize],a,reg))
       end;
       end;
 
 
 
 
-    procedure tcgx86.a_load_const_ref(list : taasmoutput; size: tcgsize; a : aword;const ref : treference);
+    procedure tcgx86.a_load_const_ref(list : taasmoutput; tosize: tcgsize; a : aword;const ref : treference);
 
 
       begin
       begin
-          list.concat(taicpu.op_const_ref(A_MOV,TCGSize2OpSize[size],a,ref));
+          list.concat(taicpu.op_const_ref(A_MOV,TCGSize2OpSize[tosize],a,ref));
       end;
       end;
 
 
 
 
-    procedure tcgx86.a_load_reg_ref(list : taasmoutput; size: TCGSize; reg : tregister;const ref : treference);
-
+    procedure tcgx86.a_load_reg_ref(list : taasmoutput; fromsize,tosize: TCGSize; reg : tregister;const ref : treference);
+      var
+        op: tasmop;
+        s: topsize;
       begin
       begin
-        list.concat(taicpu.op_reg_ref(A_MOV,TCGSize2OpSize[size],reg,
-          ref));
+        check_register_size(fromsize,reg);
+        sizes2load(fromsize,tosize,op,s);
+        list.concat(taicpu.op_reg_ref(op,s,reg,ref));
       end;
       end;
 
 
 
 
-    procedure tcgx86.a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref: treference;reg : tregister);
-
+    procedure tcgx86.a_load_ref_reg(list : taasmoutput;fromsize,tosize : tcgsize;const ref: treference;reg : tregister);
       var
       var
         op: tasmop;
         op: tasmop;
-        o,s: topsize;
-
+        s: topsize;
       begin
       begin
-        if reg.enum<>R_INTREGISTER then
-          internalerror(200302058);
-        o:=reg2opsize(reg);
-        sizes2load(size,o,op,s);
+        check_register_size(tosize,reg);
+        sizes2load(fromsize,tosize,op,s);
         list.concat(taicpu.op_ref_reg(op,s,ref,reg));
         list.concat(taicpu.op_ref_reg(op,s,ref,reg));
       end;
       end;
 
 
@@ -522,13 +536,10 @@ unit cgx86;
         instr:Taicpu;
         instr:Taicpu;
 
 
       begin
       begin
-        if (reg1.enum=R_INTREGISTER) and (reg2.enum=R_INTREGISTER) then
-          begin
-            sizes2load(fromsize,reg2opsize(reg2),op,s);
-            eq:=(reg1.number shr 8)=(reg2.number shr 8);
-          end
-        else
-          internalerror(200301081);
+        check_register_size(fromsize,reg1);
+        check_register_size(tosize,reg2);
+        sizes2load(fromsize,tosize,op,s);
+        eq:=(reg1.number shr 8)=(reg2.number shr 8);
         if eq then
         if eq then
          begin
          begin
            { "mov reg1, reg1" doesn't make sense }
            { "mov reg1, reg1" doesn't make sense }
@@ -651,8 +662,7 @@ unit cgx86;
         power: longint;
         power: longint;
 
 
       begin
       begin
-        if reg.enum<>R_INTREGISTER then
-          internalerror(200302034);
+        check_register_size(size,reg);
         case op of
         case op of
           OP_DIV, OP_IDIV:
           OP_DIV, OP_IDIV:
             begin
             begin
@@ -822,18 +832,15 @@ unit cgx86;
           instr:Taicpu;
           instr:Taicpu;
 
 
         begin
         begin
-          if src.enum<>R_INTREGISTER then
-            internalerror(200302025);
-          if dst.enum<>R_INTREGISTER then
-            internalerror(200302025);
+          check_register_size(size,src);
+          check_register_size(size,dst);
           r.enum:=R_INTREGISTER;
           r.enum:=R_INTREGISTER;
           dstsize := tcgsize2opsize[size];
           dstsize := tcgsize2opsize[size];
-          dst.number:=(dst.number and not $ff) or cgsize2subreg(size);
           case op of
           case op of
             OP_NEG,OP_NOT:
             OP_NEG,OP_NOT:
               begin
               begin
-                if src.number <> NR_NO then
-                  internalerror(200112291);
+                if src.number<>dst.number then
+                  a_load_reg_reg(list,size,size,src,dst);
                 list.concat(taicpu.op_reg(TOpCG2AsmOp[op],dstsize,dst));
                 list.concat(taicpu.op_reg(TOpCG2AsmOp[op],dstsize,dst));
               end;
               end;
             OP_MUL,OP_DIV,OP_IDIV:
             OP_MUL,OP_DIV,OP_IDIV:
@@ -917,68 +924,62 @@ unit cgx86;
         end;
         end;
 
 
 
 
-     procedure tcgx86.a_op_ref_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; const ref: TReference; reg: TRegister);
-       begin
-          case op of
-            OP_NEG,OP_NOT,OP_IMUL:
-              begin
-                inherited a_op_ref_reg(list,op,size,ref,reg);
-              end;
-            OP_MUL,OP_DIV,OP_IDIV:
-              { special stuff, needs separate handling inside code }
-              { generator                                          }
-              internalerror(200109239);
-            else
-              begin
-                reg := rg.makeregsize(reg,size);
-                list.concat(taicpu.op_ref_reg(TOpCG2AsmOp[op],tcgsize2opsize[size],ref,reg));
-              end;
-          end;
-       end;
+    procedure tcgx86.a_op_ref_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; const ref: TReference; reg: TRegister);
+      begin
+        check_register_size(size,reg);
+        case op of
+          OP_NEG,OP_NOT,OP_IMUL:
+            begin
+              inherited a_op_ref_reg(list,op,size,ref,reg);
+            end;
+          OP_MUL,OP_DIV,OP_IDIV:
+            { special stuff, needs separate handling inside code }
+            { generator                                          }
+            internalerror(200109239);
+          else
+            begin
+              reg := rg.makeregsize(reg,size);
+              list.concat(taicpu.op_ref_reg(TOpCG2AsmOp[op],tcgsize2opsize[size],ref,reg));
+            end;
+        end;
+      end;
 
 
 
 
-     procedure tcgx86.a_op_reg_ref(list : taasmoutput; Op: TOpCG; size: TCGSize;reg: TRegister; const ref: TReference);
-       begin
-         if reg.enum<>R_INTREGISTER then
-          internalerror(200302036);
-         case op of
-           OP_NEG,OP_NOT:
-             begin
-               if reg.number<>NR_NO then
-                 internalerror(200109237);
-               list.concat(taicpu.op_ref(TOpCG2AsmOp[op],tcgsize2opsize[size],ref));
-             end;
-           OP_IMUL:
-             begin
-               { this one needs a load/imul/store, which is the default }
-               inherited a_op_ref_reg(list,op,size,ref,reg);
-             end;
-           OP_MUL,OP_DIV,OP_IDIV:
-             { special stuff, needs separate handling inside code }
-             { generator                                          }
-             internalerror(200109238);
-           else
-             begin
-               list.concat(taicpu.op_reg_ref(TOpCG2AsmOp[op],tcgsize2opsize[size],reg,ref));
-             end;
-         end;
-       end;
+    procedure tcgx86.a_op_reg_ref(list : taasmoutput; Op: TOpCG; size: TCGSize;reg: TRegister; const ref: TReference);
+      begin
+        check_register_size(size,reg);
+        case op of
+          OP_NEG,OP_NOT:
+            begin
+              if reg.number<>NR_NO then
+                internalerror(200109237);
+              list.concat(taicpu.op_ref(TOpCG2AsmOp[op],tcgsize2opsize[size],ref));
+            end;
+          OP_IMUL:
+            begin
+              { this one needs a load/imul/store, which is the default }
+              inherited a_op_ref_reg(list,op,size,ref,reg);
+            end;
+          OP_MUL,OP_DIV,OP_IDIV:
+            { special stuff, needs separate handling inside code }
+            { generator                                          }
+            internalerror(200109238);
+          else
+            begin
+              list.concat(taicpu.op_reg_ref(TOpCG2AsmOp[op],tcgsize2opsize[size],reg,ref));
+            end;
+        end;
+      end;
 
 
 
 
-    procedure tcgx86.a_op_const_reg_reg(list: taasmoutput; op: TOpCg;
-        size: tcgsize; a: aword; src, dst: tregister);
+    procedure tcgx86.a_op_const_reg_reg(list: taasmoutput; op: TOpCg; size: tcgsize; a: aword; src, dst: tregister);
       var
       var
         tmpref: treference;
         tmpref: treference;
         power: longint;
         power: longint;
-        opsize: topsize;
       begin
       begin
-        if src.enum<>R_INTREGISTER then
-          internalerror(200302057);
-        if dst.enum<>R_INTREGISTER then
-          internalerror(200302057);
-        opsize := reg2opsize(src);
-        if (opsize <> S_L) or
-           not (size in [OS_32,OS_S32]) then
+        check_register_size(size,src);
+        check_register_size(size,dst);
+        if not (size in [OS_32,OS_S32]) then
           begin
           begin
             inherited a_op_const_reg_reg(list,op,size,a,src,dst);
             inherited a_op_const_reg_reg(list,op,size,a,src,dst);
             exit;
             exit;
@@ -1016,22 +1017,15 @@ unit cgx86;
         end;
         end;
       end;
       end;
 
 
-    procedure tcgx86.a_op_reg_reg_reg(list: taasmoutput; op: TOpCg;
-        size: tcgsize; src1, src2, dst: tregister);
+
+    procedure tcgx86.a_op_reg_reg_reg(list: taasmoutput; op: TOpCg;size: tcgsize; src1, src2, dst: tregister);
       var
       var
         tmpref: treference;
         tmpref: treference;
-        opsize: topsize;
       begin
       begin
-        if src1.enum>lastreg then
-          internalerror(200201081);
-        if src2.enum>lastreg then
-          internalerror(200201081);
-        if dst.enum>lastreg then
-          internalerror(200201081);
-        opsize := reg2opsize(src1);
-        if (opsize <> S_L) or
-           (reg2opsize(src2) <> S_L) or
-           not (size in [OS_32,OS_S32]) then
+        check_register_size(size,src1);
+        check_register_size(size,src2);
+        check_register_size(size,dst);
+        if not(size in [OS_32,OS_S32]) then
           begin
           begin
             inherited a_op_reg_reg_reg(list,op,size,src1,src2,dst);
             inherited a_op_reg_reg_reg(list,op,size,src1,src2,dst);
             exit;
             exit;
@@ -1058,72 +1052,65 @@ unit cgx86;
 
 
 {*************** compare instructructions ****************}
 {*************** compare instructructions ****************}
 
 
-      procedure tcgx86.a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
-        l : tasmlabel);
-
-        begin
-          if reg.enum=R_INTREGISTER then
-            begin
-              if (a = 0) then
-                list.concat(taicpu.op_reg_reg(A_TEST,tcgsize2opsize[size],reg,reg))
-              else
-                list.concat(taicpu.op_const_reg(A_CMP,tcgsize2opsize[size],a,reg));
-            end
-          else
-            internalerror(200303131);
-          a_jmp_cond(list,cmp_op,l);
-        end;
+    procedure tcgx86.a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
+      l : tasmlabel);
 
 
+      begin
+        if reg.enum=R_INTREGISTER then
+          begin
+            if (a = 0) then
+              list.concat(taicpu.op_reg_reg(A_TEST,tcgsize2opsize[size],reg,reg))
+            else
+              list.concat(taicpu.op_const_reg(A_CMP,tcgsize2opsize[size],a,reg));
+          end
+        else
+          internalerror(200303131);
+        a_jmp_cond(list,cmp_op,l);
+      end;
 
 
-      procedure tcgx86.a_cmp_const_ref_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;const ref : treference;
-        l : tasmlabel);
 
 
-        begin
-          list.concat(taicpu.op_const_ref(A_CMP,TCgSize2OpSize[size],a,ref));
-          a_jmp_cond(list,cmp_op,l);
-        end;
+    procedure tcgx86.a_cmp_const_ref_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;const ref : treference;
+      l : tasmlabel);
 
 
-      procedure tcgx86.a_cmp_reg_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;
-        reg1,reg2 : tregister;l : tasmlabel);
+      begin
+        list.concat(taicpu.op_const_ref(A_CMP,TCgSize2OpSize[size],a,ref));
+        a_jmp_cond(list,cmp_op,l);
+      end;
 
 
-        begin
-          if reg1.enum<>R_INTREGISTER then
-            internalerror(200101081);
-          if reg2.enum<>R_INTREGISTER then
-            internalerror(200101081);
-          if reg2opsize(reg1) <> reg2opsize(reg2) then
-            internalerror(200109226);
-          list.concat(taicpu.op_reg_reg(A_CMP,reg2opsize(reg1),reg1,reg2));
-          a_jmp_cond(list,cmp_op,l);
-        end;
 
 
+    procedure tcgx86.a_cmp_reg_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;
+      reg1,reg2 : tregister;l : tasmlabel);
 
 
-     procedure tcgx86.a_cmp_ref_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;const ref: treference; reg : tregister;l : tasmlabel);
-        begin
-          if reg.enum<>R_INTREGISTER then
-            internalerror(200302059);
-          reg.number:=(reg.number and not $ff) or cgsize2subreg(size);
-          list.concat(taicpu.op_ref_reg(A_CMP,tcgsize2opsize[size],ref,reg));
-          a_jmp_cond(list,cmp_op,l);
-        end;
+      begin
+        check_register_size(size,reg1);
+        check_register_size(size,reg2);
+        list.concat(taicpu.op_reg_reg(A_CMP,TCgSize2OpSize[size],reg1,reg2));
+        a_jmp_cond(list,cmp_op,l);
+      end;
 
 
 
 
-     procedure tcgx86.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
+    procedure tcgx86.a_cmp_ref_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;const ref: treference; reg : tregister;l : tasmlabel);
+      begin
+        check_register_size(size,reg);
+        list.concat(taicpu.op_ref_reg(A_CMP,TCgSize2OpSize[size],ref,reg));
+        a_jmp_cond(list,cmp_op,l);
+      end;
 
 
-       var
-         ai : taicpu;
 
 
-       begin
-         if cond=OC_None then
-           ai := Taicpu.Op_sym(A_JMP,S_NO,l)
-         else
-           begin
-             ai:=Taicpu.Op_sym(A_Jcc,S_NO,l);
-             ai.SetCondition(TOpCmp2AsmCond[cond]);
-           end;
-         ai.is_jmp:=true;
-         list.concat(ai);
-       end;
+    procedure tcgx86.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
+      var
+        ai : taicpu;
+      begin
+        if cond=OC_None then
+          ai := Taicpu.Op_sym(A_JMP,S_NO,l)
+        else
+          begin
+            ai:=Taicpu.Op_sym(A_Jcc,S_NO,l);
+            ai.SetCondition(TOpCmp2AsmCond[cond]);
+          end;
+        ai.is_jmp:=true;
+        list.concat(ai);
+      end;
 
 
 
 
      procedure tcgx86.a_jmp_flags(list : taasmoutput;const f : TResFlags;l: tasmlabel);
      procedure tcgx86.a_jmp_flags(list : taasmoutput;const f : TResFlags;l: tasmlabel);
@@ -1137,26 +1124,21 @@ unit cgx86;
        end;
        end;
 
 
 
 
-     procedure tcgx86.g_flags2reg(list: taasmoutput; size: TCgSize; const f: tresflags; reg: TRegister);
-
-       var
-         ai : taicpu;
-         hreg : tregister;
-       begin
-          if reg.enum<>R_INTREGISTER then
-            internalerror(200202031);
-          hreg.enum:=R_INTREGISTER;
-          hreg.number:=(reg.number and not $ff) or R_SUBL;
-          ai:=Taicpu.op_reg(A_SETcc,S_B,hreg);
-          ai.setcondition(flags_to_cond(f));
-          list.concat(ai);
-          if (reg.number <> hreg.number) then
-            a_load_reg_reg(list,OS_8,size,hreg,reg);
-       end;
+    procedure tcgx86.g_flags2reg(list: taasmoutput; size: TCgSize; const f: tresflags; reg: TRegister);
+      var
+        ai : taicpu;
+        hreg : tregister;
+      begin
+        hreg:=rg.makeregsize(reg,OS_8);
+        ai:=Taicpu.op_reg(A_SETcc,S_B,hreg);
+        ai.setcondition(flags_to_cond(f));
+        list.concat(ai);
+        if (reg.number <> hreg.number) then
+          a_load_reg_reg(list,OS_8,size,hreg,reg);
+      end;
 
 
 
 
      procedure tcgx86.g_flags2ref(list: taasmoutput; size: TCgSize; const f: tresflags; const ref: TReference);
      procedure tcgx86.g_flags2ref(list: taasmoutput; size: TCgSize; const f: tresflags; const ref: TReference);
-
        var
        var
          ai : taicpu;
          ai : taicpu;
        begin
        begin
@@ -1311,10 +1293,10 @@ unit cgx86;
               for i:=1 to helpsize do
               for i:=1 to helpsize do
                 begin
                 begin
                    r:=rg.getexplicitregisterint(list,NR_EDI);
                    r:=rg.getexplicitregisterint(list,NR_EDI);
-                   a_load_ref_reg(list,OS_32,srcref,r);
+                   a_load_ref_reg(list,OS_32,OS_32,srcref,r);
                    If (len = 4) and delsource then
                    If (len = 4) and delsource then
                      reference_release(list,source);
                      reference_release(list,source);
-                   a_load_reg_ref(list,OS_32,r,dstref);
+                   a_load_reg_ref(list,OS_32,OS_32,r,dstref);
                    inc(srcref.offset,4);
                    inc(srcref.offset,4);
                    inc(dstref.offset,4);
                    inc(dstref.offset,4);
                    dec(len,4);
                    dec(len,4);
@@ -1323,10 +1305,10 @@ unit cgx86;
               if len>1 then
               if len>1 then
                 begin
                 begin
                    r:=rg.getexplicitregisterint(list,NR_DI);
                    r:=rg.getexplicitregisterint(list,NR_DI);
-                   a_load_ref_reg(list,OS_16,srcref,r);
+                   a_load_ref_reg(list,OS_16,OS_16,srcref,r);
                    If (len = 2) and delsource then
                    If (len = 2) and delsource then
                      reference_release(list,source);
                      reference_release(list,source);
-                   a_load_reg_ref(list,OS_16,r,dstref);
+                   a_load_reg_ref(list,OS_16,OS_16,r,dstref);
                    inc(srcref.offset,2);
                    inc(srcref.offset,2);
                    inc(dstref.offset,2);
                    inc(dstref.offset,2);
                    dec(len,2);
                    dec(len,2);
@@ -1370,10 +1352,10 @@ unit cgx86;
                        r:=rg.getexplicitregisterint(list,NR_EDI);
                        r:=rg.getexplicitregisterint(list,NR_EDI);
                        a_load_reg_reg(list,OS_32,OS_32,reg32,r);
                        a_load_reg_reg(list,OS_32,OS_32,reg32,r);
                      end;
                      end;
-                   a_load_ref_reg(list,OS_8,srcref,reg8);
+                   a_load_ref_reg(list,OS_8,OS_8,srcref,reg8);
                    If delsource and (len=1) then
                    If delsource and (len=1) then
                      reference_release(list,source);
                      reference_release(list,source);
-                   a_load_reg_ref(list,OS_8,reg8,dstref);
+                   a_load_reg_ref(list,OS_8,OS_8,reg8,dstref);
                    if swap then
                    if swap then
                      begin
                      begin
                        r.number:=NR_EDI;
                        r.number:=NR_EDI;
@@ -1391,7 +1373,7 @@ unit cgx86;
               if loadref then
               if loadref then
                 begin
                 begin
                   srcreg:=maybepush(NR_ESI,esipushed);
                   srcreg:=maybepush(NR_ESI,esipushed);
-                  a_load_ref_reg(list,OS_ADDR,source,srcreg)
+                  a_load_ref_reg(list,OS_ADDR,OS_ADDR,source,srcreg)
                 end
                 end
               else
               else
                 begin
                 begin
@@ -1585,11 +1567,11 @@ unit cgx86;
 
 
         { load count }
         { load count }
         r2.number:=NR_ECX;
         r2.number:=NR_ECX;
-        a_load_ref_reg(list,OS_INT,lenref,r2);
+        a_load_ref_reg(list,OS_INT,OS_INT,lenref,r2);
 
 
         { load source }
         { load source }
         r2.number:=NR_ESI;
         r2.number:=NR_ESI;
-        a_load_ref_reg(list,OS_INT,ref,r2);
+        a_load_ref_reg(list,OS_INT,OS_INT,ref,r2);
 
 
         { scheduled .... }
         { scheduled .... }
         r2.number:=NR_ECX;
         r2.number:=NR_ECX;
@@ -1627,7 +1609,7 @@ unit cgx86;
         list.concat(Taicpu.op_reg(A_POP,S_L,r2));
         list.concat(Taicpu.op_reg(A_POP,S_L,r2));
 
 
         { patch the new address }
         { patch the new address }
-        a_load_reg_ref(list,OS_INT,rsp,ref);
+        a_load_reg_ref(list,OS_INT,OS_INT,rsp,ref);
       end;
       end;
 
 
 
 
@@ -1924,7 +1906,7 @@ unit cgx86;
 
 
 
 
     { produces if necessary overflowcode }
     { produces if necessary overflowcode }
-    procedure tcgx86.g_overflowcheck(list: taasmoutput; const p: tnode);
+    procedure tcgx86.g_overflowcheck(list: taasmoutput; const l:tlocation;def:tdef);
       var
       var
          hl : tasmlabel;
          hl : tasmlabel;
          ai : taicpu;
          ai : taicpu;
@@ -1933,10 +1915,10 @@ unit cgx86;
          if not(cs_check_overflow in aktlocalswitches) then
          if not(cs_check_overflow in aktlocalswitches) then
           exit;
           exit;
          objectlibrary.getlabel(hl);
          objectlibrary.getlabel(hl);
-         if not ((p.resulttype.def.deftype=pointerdef) or
-                ((p.resulttype.def.deftype=orddef) and
-                 (torddef(p.resulttype.def).typ in [u64bit,u16bit,u32bit,u8bit,uchar,
-                                                    bool8bit,bool16bit,bool32bit]))) then
+         if not ((def.deftype=pointerdef) or
+                ((def.deftype=orddef) and
+                 (torddef(def).typ in [u64bit,u16bit,u32bit,u8bit,uchar,
+                                       bool8bit,bool16bit,bool32bit]))) then
            cond:=C_NO
            cond:=C_NO
          else
          else
            cond:=C_NB;
            cond:=C_NB;
@@ -1953,7 +1935,12 @@ unit cgx86;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.50  2003-06-03 13:01:59  daniel
+  Revision 1.51  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.50  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.49  2003/06/01 21:38:07  peter
   Revision 1.49  2003/06/01 21:38:07  peter

+ 16 - 1
compiler/x86/cpubase.pas

@@ -543,6 +543,7 @@ uses
     function cgsize2subreg(s:Tcgsize):Tsubregister;
     function cgsize2subreg(s:Tcgsize):Tsubregister;
     function reg2opsize(r:tregister):topsize;
     function reg2opsize(r:tregister):topsize;
     function is_calljmp(o:tasmop):boolean;
     function is_calljmp(o:tasmop):boolean;
+    procedure inverse_flags(var f: TResFlags);
     function flags_to_cond(const f: TResFlags) : TAsmCond;
     function flags_to_cond(const f: TResFlags) : TAsmCond;
 
 
 
 
@@ -704,6 +705,15 @@ implementation
       end;
       end;
 
 
 
 
+    procedure inverse_flags(var f: TResFlags);
+      const
+        inv_flags: array[TResFlags] of TResFlags =
+          (F_NE,F_E,F_LE,F_GE,F_L,F_G,F_NC,F_C,F_BE,F_B,F_AE,F_A);
+      begin
+        f:=inv_flags[f];
+      end;
+
+
     function flags_to_cond(const f: TResFlags) : TAsmCond;
     function flags_to_cond(const f: TResFlags) : TAsmCond;
       const
       const
         flags_2_cond : array[TResFlags] of TAsmCond =
         flags_2_cond : array[TResFlags] of TAsmCond =
@@ -716,7 +726,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.6  2003-06-03 13:01:59  daniel
+  Revision 1.7  2003-06-03 21:11:09  peter
+    * cg.a_load_* get a from and to size specifier
+    * makeregsize only accepts newregister
+    * i386 uses generic tcgnotnode,tcgunaryminus
+
+  Revision 1.6  2003/06/03 13:01:59  daniel
     * Register allocator finished
     * Register allocator finished
 
 
   Revision 1.5  2003/05/30 23:57:08  peter
   Revision 1.5  2003/05/30 23:57:08  peter