Browse Source

* support for subsets which are not a multiple of 8 bits

git-svn-id: trunk@4442 -
Jonas Maebe 19 years ago
parent
commit
d4a818c8ae
2 changed files with 11 additions and 7 deletions
  1. 9 5
      compiler/powerpc/cgcpu.pas
  2. 2 2
      compiler/powerpc64/cgcpu.pas

+ 9 - 5
compiler/powerpc/cgcpu.pas

@@ -556,12 +556,16 @@ const
      procedure tcgppc.a_load_subsetreg_reg(list : TAsmList; subsetsize, tosize: tcgsize; const sreg: tsubsetregister; destreg: tregister);
      procedure tcgppc.a_load_subsetreg_reg(list : TAsmList; subsetsize, tosize: tcgsize; const sreg: tsubsetregister; destreg: tregister);
 
 
        begin
        begin
-         if (tcgsize2size[subsetsize] <> sizeof(aint)) then
+         if (sreg.bitlen <> sizeof(aint)*8) then
            begin
            begin
              list.concat(taicpu.op_reg_reg_const_const_const(A_RLWINM,destreg,
              list.concat(taicpu.op_reg_reg_const_const_const(A_RLWINM,destreg,
                sreg.subsetreg,(32-sreg.startbit) and 31,32-sreg.bitlen,31));
                sreg.subsetreg,(32-sreg.startbit) and 31,32-sreg.bitlen,31));
-             a_load_reg_reg(list,tcgsize2unsigned[subsetsize],subsetsize,destreg,destreg);
-             a_load_reg_reg(list,subsetsize,tosize,destreg,destreg);
+             { types with a negative lower bound are always a base type (8, 16, 32 bits) }
+             if ((sreg.bitlen mod 8) = 0) then
+               begin
+                 a_load_reg_reg(list,tcgsize2unsigned[subsetsize],subsetsize,destreg,destreg);
+                 a_load_reg_reg(list,subsetsize,tosize,destreg,destreg);
+               end;
            end
            end
          else
          else
            a_load_reg_reg(list,subsetsize,tosize,sreg.subsetreg,destreg);
            a_load_reg_reg(list,subsetsize,tosize,sreg.subsetreg,destreg);
@@ -571,7 +575,7 @@ const
      procedure tcgppc.a_load_reg_subsetreg(list : TAsmList; fromsize, subsetsize: tcgsize; fromreg: tregister; const sreg: tsubsetregister);
      procedure tcgppc.a_load_reg_subsetreg(list : TAsmList; fromsize, subsetsize: tcgsize; fromreg: tregister; const sreg: tsubsetregister);
 
 
        begin
        begin
-         if ((tcgsize2size[subsetsize]) <> sizeof(aint)) then
+         if (sreg.bitlen <> sizeof(aint) * 8) then
            list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,sreg.subsetreg,fromreg,
            list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,sreg.subsetreg,fromreg,
              sreg.startbit,32-sreg.startbit-sreg.bitlen,31-sreg.startbit))
              sreg.startbit,32-sreg.startbit-sreg.bitlen,31-sreg.startbit))
          else
          else
@@ -582,7 +586,7 @@ const
        procedure tcgppc.a_load_subsetreg_subsetreg(list: TAsmlist; fromsubsetsize, tosubsetsize: tcgsize; const fromsreg, tosreg: tsubsetregister);
        procedure tcgppc.a_load_subsetreg_subsetreg(list: TAsmlist; fromsubsetsize, tosubsetsize: tcgsize; const fromsreg, tosreg: tsubsetregister);
 
 
          begin
          begin
-           if (tcgsize2size[fromsubsetsize] >= tcgsize2size[tosubsetsize]) then
+           if (fromsreg.bitlen >= tosreg.bitlen) then
              list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,tosreg.subsetreg, fromsreg.subsetreg,
              list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,tosreg.subsetreg, fromsreg.subsetreg,
                 (tosreg.startbit-fromsreg.startbit) and 31,
                 (tosreg.startbit-fromsreg.startbit) and 31,
                 32-tosreg.startbit-tosreg.bitlen,31-tosreg.startbit))
                 32-tosreg.startbit-tosreg.bitlen,31-tosreg.startbit))

+ 2 - 2
compiler/powerpc64/cgcpu.pas

@@ -887,7 +887,7 @@ begin
     extend the sign correctly. (The latter is actually required only for signed subsets and if that
     extend the sign correctly. (The latter is actually required only for signed subsets and if that
    subset is not >= the tosize). }
    subset is not >= the tosize). }
   extrdi_startbit := 64 - (sreg.bitlen + sreg.startbit);
   extrdi_startbit := 64 - (sreg.bitlen + sreg.startbit);
-  if (sreg.startbit <> 0) then begin
+  if (sreg.bitlen <> sizeof(aint)*8) then begin
     list.concat(taicpu.op_reg_reg_const_const(A_EXTRDI, destreg, sreg.subsetreg, sreg.bitlen, extrdi_startbit));
     list.concat(taicpu.op_reg_reg_const_const(A_EXTRDI, destreg, sreg.subsetreg, sreg.bitlen, extrdi_startbit));
     a_load_reg_reg(list, tcgsize2unsigned[subsetsize], subsetsize, destreg, destreg);
     a_load_reg_reg(list, tcgsize2unsigned[subsetsize], subsetsize, destreg, destreg);
     a_load_reg_reg(list, subsetsize, tosize, destreg, destreg);
     a_load_reg_reg(list, subsetsize, tosize, destreg, destreg);
@@ -902,7 +902,7 @@ begin
   list.concat(tai_comment.create(strpnew('a_load_reg_subsetreg fromsize = ' + cgsize2string(fromsize) + ' subsetregsize = ' + cgsize2string(sreg.subsetregsize) + ' subsetsize = ' + cgsize2string(subsetsize) + ' startbit = ' + IntToStr(sreg.startbit))));
   list.concat(tai_comment.create(strpnew('a_load_reg_subsetreg fromsize = ' + cgsize2string(fromsize) + ' subsetregsize = ' + cgsize2string(sreg.subsetregsize) + ' subsetsize = ' + cgsize2string(subsetsize) + ' startbit = ' + IntToStr(sreg.startbit))));
   {$endif}
   {$endif}
   { simply use the INSRDI instruction }
   { simply use the INSRDI instruction }
-  if (tcgsize2size[subsetsize] <> sizeof(aint)) then
+  if (sreg.bitlen <> sizeof(aint)*8) then
     list.concat(taicpu.op_reg_reg_const_const(A_INSRDI, sreg.subsetreg, fromreg, sreg.bitlen, (64 - (sreg.startbit + sreg.bitlen)) and 63))
     list.concat(taicpu.op_reg_reg_const_const(A_INSRDI, sreg.subsetreg, fromreg, sreg.bitlen, (64 - (sreg.startbit + sreg.bitlen)) and 63))
   else
   else
     a_load_reg_reg(list, fromsize, subsetsize, fromreg, sreg.subsetreg);
     a_load_reg_reg(list, fromsize, subsetsize, fromreg, sreg.subsetreg);