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);
 
        begin
-         if (tcgsize2size[subsetsize] <> sizeof(aint)) then
+         if (sreg.bitlen <> sizeof(aint)*8) then
            begin
              list.concat(taicpu.op_reg_reg_const_const_const(A_RLWINM,destreg,
                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
          else
            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);
 
        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,
              sreg.startbit,32-sreg.startbit-sreg.bitlen,31-sreg.startbit))
          else
@@ -582,7 +586,7 @@ const
        procedure tcgppc.a_load_subsetreg_subsetreg(list: TAsmlist; fromsubsetsize, tosubsetsize: tcgsize; const fromsreg, tosreg: tsubsetregister);
 
          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,
                 (tosreg.startbit-fromsreg.startbit) and 31,
                 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
    subset is not >= the tosize). }
   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));
     a_load_reg_reg(list, tcgsize2unsigned[subsetsize], subsetsize, 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))));
   {$endif}
   { 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))
   else
     a_load_reg_reg(list, fromsize, subsetsize, fromreg, sreg.subsetreg);