mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 21:29:43 +02:00
* support for subsets which are not a multiple of 8 bits
git-svn-id: trunk@4442 -
This commit is contained in:
parent
2534fc6636
commit
d4a818c8ae
@ -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))
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user