Browse Source

+ 6502-specific implementation of GetIntRegister and GetNextReg that make use of the 16-bit virtual zero page registers

Nikolay Nikolov 1 month ago
parent
commit
4ed159da24
1 changed files with 51 additions and 0 deletions
  1. 51 0
      compiler/mos6502/cgcpu.pas

+ 51 - 0
compiler/mos6502/cgcpu.pas

@@ -48,8 +48,10 @@ unit cgcpu;
         procedure getcpuregisters(list:TAsmList;regs:tregisterlist);
         procedure getcpuregisters(list:TAsmList;regs:tregisterlist);
         procedure ungetcpuregisters(list:TAsmList;regs:tregisterlist);
         procedure ungetcpuregisters(list:TAsmList;regs:tregisterlist);
 
 
+        function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
         function getaddressregister(list:TAsmList):TRegister;override;
         function getaddressregister(list:TAsmList):TRegister;override;
 
 
+        function GetNextReg(const r: TRegister): TRegister;override;
         function GetOffsetReg(const r: TRegister;ofs : shortint): TRegister;override;
         function GetOffsetReg(const r: TRegister;ofs : shortint): TRegister;override;
         function GetOffsetReg64(const r,rhi: TRegister;ofs : shortint): TRegister;override;
         function GetOffsetReg64(const r,rhi: TRegister;ofs : shortint): TRegister;override;
 
 
@@ -221,12 +223,61 @@ unit cgcpu;
       end;
       end;
 
 
 
 
+    function tcgmos6502.getintregister(list: TAsmList; size: Tcgsize): Tregister;
+      begin
+        if not assigned(rg[R_INTREGISTER]) then
+          internalerror(200312122);
+        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);
+              has_next_reg[getsupreg(Result)]:=true;
+              { 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;
+      end;
+
+
     function tcgmos6502.getaddressregister(list: TAsmList): TRegister;
     function tcgmos6502.getaddressregister(list: TAsmList): TRegister;
       begin
       begin
        Result:=getintregister(list,OS_ADDR);
        Result:=getintregister(list,OS_ADDR);
       end;
       end;
 
 
 
 
+    function tcgmos6502.GetNextReg(const r: TRegister): TRegister;
+      begin
+        if getregtype(r)<>R_INTREGISTER then
+          internalerror(2025102801);
+        case getsubreg(r) of
+          R_SUBW:
+            begin
+              result:=r;
+              setsubreg(result,R_SUBH);
+            end;
+          R_SUBH:
+            begin
+              if getsupreg(r)<first_int_imreg then
+                internalerror(2025102802);
+              if not has_next_reg[getsupreg(r)] then
+                internalerror(2017091103);
+              result:=TRegister(longint(r)+1);
+              setsubreg(result,R_SUBW);
+            end;
+          else
+            internalerror(2025102804);
+        end;
+      end;
+
+
     function tcgmos6502.GetOffsetReg(const r: TRegister; ofs: shortint): TRegister;
     function tcgmos6502.GetOffsetReg(const r: TRegister; ofs: shortint): TRegister;
       var
       var
         i: Integer;
         i: Integer;