瀏覽代碼

* integrated the getintregister() implementation for 8-bit and 16-bit alus from
the avr and i8086 code generators into the base tcg class (so it can be reused
by other 8-bit and 16-bit targets)

git-svn-id: trunk@37181 -

nickysn 7 年之前
父節點
當前提交
cf28b202eb
共有 3 個文件被更改,包括 61 次插入67 次删除
  1. 0 45
      compiler/avr/cgcpu.pas
  2. 61 0
      compiler/cgobj.pas
  3. 0 22
      compiler/i8086/cgcpu.pas

+ 0 - 45
compiler/avr/cgcpu.pas

@@ -44,7 +44,6 @@ unit cgcpu;
         procedure init_register_allocators;override;
         procedure done_register_allocators;override;
 
-        function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
         function getaddressregister(list:TAsmList):TRegister;override;
 
         function GetHigh(const r : TRegister) : TRegister;inline;
@@ -157,50 +156,6 @@ unit cgcpu;
       end;
 
 
-    function tcgavr.getintregister(list: TAsmList; size: Tcgsize): Tregister;
-      var
-        tmp1,tmp2,tmp3 : TRegister;
-      begin
-        case size of
-          OS_8,OS_S8:
-            Result:=inherited getintregister(list, size);
-          OS_16,OS_S16:
-            begin
-              Result:=inherited getintregister(list, OS_8);
-              { ensure that the high register can be retrieved by
-                GetNextReg
-              }
-              if inherited getintregister(list, OS_8)<>GetNextReg(Result) then
-                internalerror(2011021331);
-            end;
-          OS_32,OS_S32:
-            begin
-              Result:=inherited getintregister(list, OS_8);
-              tmp1:=inherited getintregister(list, OS_8);
-              { ensure that the high register can be retrieved by
-                GetNextReg
-              }
-              if tmp1<>GetNextReg(Result) then
-                internalerror(2011021332);
-              tmp2:=inherited getintregister(list, OS_8);
-              { ensure that the upper register can be retrieved by
-                GetNextReg
-              }
-              if tmp2<>GetNextReg(tmp1) then
-                internalerror(2011021333);
-              tmp3:=inherited getintregister(list, OS_8);
-              { ensure that the upper register can be retrieved by
-                GetNextReg
-              }
-              if tmp3<>GetNextReg(tmp2) then
-                internalerror(2011021334);
-            end;
-          else
-            internalerror(2011021330);
-        end;
-      end;
-
-
     function tcgavr.getaddressregister(list: TAsmList): TRegister;
       begin
        Result:=getintregister(list,OS_ADDR);

+ 61 - 0
compiler/cgobj.pas

@@ -611,10 +611,71 @@ implementation
     {$endif}
 
     function tcg.getintregister(list:TAsmList;size:Tcgsize):Tregister;
+{$ifdef cpu8bitalu}
+      var
+        tmp1,tmp2,tmp3 : TRegister;
+{$endif cpu8bitalu}
       begin
         if not assigned(rg[R_INTREGISTER]) then
           internalerror(200312122);
+{$if defined(cpu8bitalu)}
+        case size of
+          OS_8,OS_S8:
+            Result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
+          OS_16,OS_S16:
+            begin
+              Result:=getintregister(list, OS_8);
+              { ensure that the high register can be retrieved by
+                GetNextReg
+              }
+              if getintregister(list, OS_8)<>GetNextReg(Result) then
+                internalerror(2011021331);
+            end;
+          OS_32,OS_S32:
+            begin
+              Result:=getintregister(list, OS_8);
+              tmp1:=getintregister(list, OS_8);
+              { ensure that the high register can be retrieved by
+                GetNextReg
+              }
+              if tmp1<>GetNextReg(Result) then
+                internalerror(2011021332);
+              tmp2:=getintregister(list, OS_8);
+              { ensure that the upper register can be retrieved by
+                GetNextReg
+              }
+              if tmp2<>GetNextReg(tmp1) then
+                internalerror(2011021333);
+              tmp3:=getintregister(list, OS_8);
+              { ensure that the upper register can be retrieved by
+                GetNextReg
+              }
+              if tmp3<>GetNextReg(tmp2) then
+                internalerror(2011021334);
+            end;
+          else
+            internalerror(2011021330);
+        end;
+{$elseif defined(cpu16bitalu)}
+        case size of
+          OS_8, OS_S8,
+          OS_16, OS_S16:
+            Result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
+          OS_32, OS_S32:
+            begin
+              Result:=getintregister(list, OS_16);
+              { ensure that the high register can be retrieved by
+                GetNextReg
+              }
+              if getintregister(list, OS_16)<>GetNextReg(Result) then
+                internalerror(2013030202);
+            end;
+          else
+            internalerror(2013030201);
+        end;
+{$elseif defined(cpu32bitalu) or defined(cpu64bitalu)}
         result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
+{$endif}
       end;
 
 

+ 0 - 22
compiler/i8086/cgcpu.pas

@@ -41,7 +41,6 @@ unit cgcpu;
         procedure init_register_allocators;override;
         procedure do_register_allocation(list:TAsmList;headertai:tai);override;
 
-        function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
         function GetNextReg(const r: TRegister): TRegister;override;
 
         procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override;
@@ -159,27 +158,6 @@ unit cgcpu;
       end;
 
 
-    function tcg8086.getintregister(list: TAsmList; size: Tcgsize): Tregister;
-      begin
-        case size of
-          OS_8, OS_S8,
-          OS_16, OS_S16:
-            Result := inherited getintregister(list, size);
-          OS_32, OS_S32:
-            begin
-              Result:=inherited getintregister(list, OS_16);
-              { ensure that the high register can be retrieved by
-                GetNextReg
-              }
-              if inherited getintregister(list, OS_16)<>GetNextReg(Result) then
-                internalerror(2013030202);
-            end;
-          else
-            internalerror(2013030201);
-        end;
-      end;
-
-
     function tcg8086.GetNextReg(const r: TRegister): TRegister;
       begin
         if getsupreg(r)<first_int_imreg then