From d4a818c8ae654272bfd880c667de2f318355f838 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 19 Aug 2006 11:11:37 +0000 Subject: [PATCH] * support for subsets which are not a multiple of 8 bits git-svn-id: trunk@4442 - --- compiler/powerpc/cgcpu.pas | 14 +++++++++----- compiler/powerpc64/cgcpu.pas | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/compiler/powerpc/cgcpu.pas b/compiler/powerpc/cgcpu.pas index cb444229fe..20ccc950dc 100644 --- a/compiler/powerpc/cgcpu.pas +++ b/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)) diff --git a/compiler/powerpc64/cgcpu.pas b/compiler/powerpc64/cgcpu.pas index 4a22f7db0e..72d84893ae 100644 --- a/compiler/powerpc64/cgcpu.pas +++ b/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);