Browse Source

* cleanup and bug fixing of unaligned data handling code by Roozbeh GHolizadeh

git-svn-id: trunk@3377 -
florian 19 years ago
parent
commit
09ad199450
1 changed files with 17 additions and 8 deletions
  1. 17 8
      compiler/arm/cgcpu.pas

+ 17 - 8
compiler/arm/cgcpu.pas

@@ -752,7 +752,7 @@ unit cgcpu;
                  begin
                  begin
                    shifterop_reset(so);so.shiftmode:=SM_LSR;so.shiftimm:=8;
                    shifterop_reset(so);so.shiftmode:=SM_LSR;so.shiftimm:=8;
                    tmpreg:=getintregister(list,OS_INT);
                    tmpreg:=getintregister(list,OS_INT);
-                   usedtmpref:=a_internal_load_reg_ref(list,OS_8,OS_8,tmpreg,Ref);
+                   usedtmpref:=a_internal_load_reg_ref(list,OS_8,OS_8,reg,Ref);
                    inc(usedtmpref.offset);
                    inc(usedtmpref.offset);
                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,tmpreg,reg,so));
                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,tmpreg,reg,so));
                    a_internal_load_reg_ref(list,OS_8,OS_8,tmpreg,usedtmpref);
                    a_internal_load_reg_ref(list,OS_8,OS_8,tmpreg,usedtmpref);
@@ -761,7 +761,6 @@ unit cgcpu;
                  begin
                  begin
                    shifterop_reset(so);so.shiftmode:=SM_LSR;so.shiftimm:=8;
                    shifterop_reset(so);so.shiftmode:=SM_LSR;so.shiftimm:=8;
                    tmpreg:=getintregister(list,OS_INT);
                    tmpreg:=getintregister(list,OS_INT);
-
                    usedtmpref:=a_internal_load_reg_ref(list,OS_8,OS_8,reg,Ref);
                    usedtmpref:=a_internal_load_reg_ref(list,OS_8,OS_8,reg,Ref);
                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,tmpreg,reg,so));
                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,tmpreg,reg,so));
                    inc(usedtmpref.offset);
                    inc(usedtmpref.offset);
@@ -786,7 +785,7 @@ unit cgcpu;
        var
        var
          oppostfix:toppostfix;
          oppostfix:toppostfix;
          usedtmpref,usedtmpref2: treference;
          usedtmpref,usedtmpref2: treference;
-         tmpreg,tmpreg2 : tregister;
+         tmpreg,tmpreg2,tmpreg3 : tregister;
          so : tshifterop;
          so : tshifterop;
        begin
        begin
          case FromSize of
          case FromSize of
@@ -810,19 +809,28 @@ unit cgcpu;
              case FromSize of
              case FromSize of
                OS_16,OS_S16:
                OS_16,OS_S16:
                  begin
                  begin
+                   a_loadaddr_ref_reg(list,ref,reg);
+                   reference_reset_base(usedtmpref,reg,0);
                    shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
                    shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
                    tmpreg:=getintregister(list,OS_INT);
                    tmpreg:=getintregister(list,OS_INT);
-                   usedtmpref:=a_internal_load_ref_reg(list,OS_8,OS_8,Ref,tmpreg);
+                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
                    inc(usedtmpref.offset);
                    inc(usedtmpref.offset);
-                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
-                   list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                   tmpreg2:=getintregister(list,OS_INT);
+                   if FromSize=OS_16 then
+                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg2)
+                   else
+                     a_internal_load_ref_reg(list,OS_S8,OS_S8,usedtmpref,tmpreg2);
+                   list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,tmpreg,tmpreg2,so));
                  end;
                  end;
                OS_32,OS_S32:
                OS_32,OS_S32:
                  begin
                  begin
-                   shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
                    tmpreg:=getintregister(list,OS_INT);
                    tmpreg:=getintregister(list,OS_INT);
                    tmpreg2:=getintregister(list,OS_INT);
                    tmpreg2:=getintregister(list,OS_INT);
-                   usedtmpref:=a_internal_load_ref_reg(list,OS_8,OS_8,Ref,reg);
+                   tmpreg3:=getintregister(list,OS_INT);
+                   shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
+                   a_loadaddr_ref_reg(list,ref,tmpreg3);
+                   reference_reset_base(usedtmpref,tmpreg3,0);
+                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
                    inc(usedtmpref.offset);
                    inc(usedtmpref.offset);
                    a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
                    a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
                    list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,tmpreg2,reg,tmpreg,so));
                    list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,tmpreg2,reg,tmpreg,so));
@@ -1373,6 +1381,7 @@ unit cgcpu;
           l : tasmlabel;
           l : tasmlabel;
         begin
         begin
           current_asmdata.getjumplabel(l);
           current_asmdata.getjumplabel(l);
+          if count<size then size:=1;
           a_load_const_reg(list,OS_INT,count div size,countreg);
           a_load_const_reg(list,OS_INT,count div size,countreg);
           cg.a_label(list,l);
           cg.a_label(list,l);
           srcref.addressmode:=AM_POSTINDEXED;
           srcref.addressmode:=AM_POSTINDEXED;