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

git-svn-id: trunk@4442 -
This commit is contained in:
Jonas Maebe 2006-08-19 11:11:37 +00:00
parent 2534fc6636
commit d4a818c8ae
2 changed files with 11 additions and 7 deletions
compiler
powerpc
powerpc64

View File

@ -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))

View File

@ -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);