Browse Source

+ implemented sign extension in tcgz80.a_load_ref_reg

git-svn-id: branches/z80@44651 -
nickysn 5 years ago
parent
commit
6fea99ac9d
1 changed files with 22 additions and 107 deletions
  1. 22 107
      compiler/z80/cgcpu.pas

+ 22 - 107
compiler/z80/cgcpu.pas

@@ -1264,113 +1264,28 @@ unit cgcpu;
                end;
            end
          else
-           list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_load_ref_reg')));
-
-         //conv_done:=false;
-         //if tosize<>fromsize then
-         //  begin
-         //    conv_done:=true;
-         //    if tcgsize2size[tosize]<=tcgsize2size[fromsize] then
-         //      fromsize:=tosize;
-         //    case fromsize of
-         //      OS_8:
-         //        begin
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //          for i:=2 to tcgsize2size[tosize] do
-         //            begin
-         //              reg:=GetNextReg(reg);
-         //              emit_mov(list,reg,NR_R1);
-         //            end;
-         //        end;
-         //      OS_S8:
-         //        begin
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //          tmpreg:=reg;
-         //
-         //          if tcgsize2size[tosize]>1 then
-         //            begin
-         //              reg:=GetNextReg(reg);
-         //              emit_mov(list,reg,NR_R1);
-         //              list.concat(taicpu.op_reg_const(A_SBRC,tmpreg,7));
-         //              list.concat(taicpu.op_reg(A_COM,reg));
-         //              tmpreg:=reg;
-         //              for i:=3 to tcgsize2size[tosize] do
-         //                begin
-         //                  reg:=GetNextReg(reg);
-         //                  emit_mov(list,reg,tmpreg);
-         //                end;
-         //            end;
-         //        end;
-         //      OS_16:
-         //        begin
-         //          if not(QuickRef) then
-         //            href.addressmode:=AM_POSTINCREMENT;
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //
-         //          if QuickRef then
-         //            inc(href.offset);
-         //          href.addressmode:=AM_UNCHANGED;
-         //
-         //          reg:=GetNextReg(reg);
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //
-         //          for i:=3 to tcgsize2size[tosize] do
-         //            begin
-         //              reg:=GetNextReg(reg);
-         //              emit_mov(list,reg,NR_R1);
-         //            end;
-         //        end;
-         //      OS_S16:
-         //        begin
-         //          if not(QuickRef) then
-         //            href.addressmode:=AM_POSTINCREMENT;
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //          if QuickRef then
-         //            inc(href.offset);
-         //          href.addressmode:=AM_UNCHANGED;
-         //
-         //          reg:=GetNextReg(reg);
-         //          list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //          tmpreg:=reg;
-         //
-         //          reg:=GetNextReg(reg);
-         //          emit_mov(list,reg,NR_R1);
-         //          list.concat(taicpu.op_reg_const(A_SBRC,tmpreg,7));
-         //          list.concat(taicpu.op_reg(A_COM,reg));
-         //          tmpreg:=reg;
-         //          for i:=4 to tcgsize2size[tosize] do
-         //            begin
-         //              reg:=GetNextReg(reg);
-         //              emit_mov(list,reg,tmpreg);
-         //            end;
-         //        end;
-         //      else
-         //        conv_done:=false;
-         //    end;
-         //  end;
-         //if not conv_done then
-         //  begin
-         //    for i:=1 to tcgsize2size[fromsize] do
-         //      begin
-         //        if not(QuickRef) and (i<tcgsize2size[fromsize]) then
-         //          href.addressmode:=AM_POSTINCREMENT
-         //        else
-         //          href.addressmode:=AM_UNCHANGED;
-         //
-         //        list.concat(taicpu.op_reg_ref(GetLoad(href),reg,href));
-         //
-         //        if QuickRef then
-         //          inc(href.offset);
-         //
-         //        reg:=GetNextReg(reg);
-         //      end;
-         //  end;
-         //
-         //if not(QuickRef) then
-         //  begin
-         //    ungetcpuregister(list,href.base);
-         //    ungetcpuregister(list,GetNextReg(href.base));
-         //  end;
+           begin
+             getcpuregister(list,NR_A);
+             for i:=1 to tcgsize2size[fromsize] do
+               begin
+                 list.concat(taicpu.op_reg_ref(A_LD,NR_A,href));
+                 a_load_reg_reg(list,OS_8,OS_8,NR_A,reg);
+
+                 if i<>tcgsize2size[fromsize] then
+                   inc(href.offset);
+                 if i<>tcgsize2size[tosize] then
+                   reg:=GetNextReg(reg);
+               end;
+             list.concat(taicpu.op_none(A_RLA));
+             list.concat(taicpu.op_reg_reg(A_SBC,NR_A,NR_A));
+             for i:=tcgsize2size[fromsize]+1 to tcgsize2size[tosize] do
+               begin
+                 emit_mov(list,reg,NR_A);
+                 if i<>tcgsize2size[tosize] then
+                   reg:=GetNextReg(reg);
+               end;
+             ungetcpuregister(list,NR_A);
+           end;
        end;