mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 05:39:26 +02:00
* write elements of bitpacked arrays grouped per the number of bits that
will be used to load them afterwards instead of always per byte so we can use that loadsize as the array element type in llvm declarations (-> less casting required) git-svn-id: branches/hlcgllvm@26977 -
This commit is contained in:
parent
e9268a0a14
commit
672c96a811
@ -350,12 +350,10 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
|
||||
inc(bp.curbitoffset,bp.packedbitsize);
|
||||
end;
|
||||
|
||||
{$pop}
|
||||
|
||||
procedure flush_packed_value(list: tasmlist; var bp: tbitpackedval);
|
||||
var
|
||||
bitstowrite: longint;
|
||||
writeval : byte;
|
||||
writeval : AInt;
|
||||
begin
|
||||
if (bp.curbitoffset < AIntBits) then
|
||||
begin
|
||||
@ -368,27 +366,35 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
|
||||
bitstowrite:=AIntBits;
|
||||
dec(bp.curbitoffset,AIntBits);
|
||||
end;
|
||||
while (bitstowrite>=8) do
|
||||
while (bitstowrite>=bp.loadbitsize) do
|
||||
begin
|
||||
if (target_info.endian=endian_little) then
|
||||
begin
|
||||
{ write lowest byte }
|
||||
writeval:=byte(bp.curval);
|
||||
bp.curval:=bp.curval shr 8;
|
||||
{ write lowest "loadbitsize" bits }
|
||||
writeval:=bp.curval and (aint(-1) shr ((sizeof(aint)*8)-bp.loadbitsize));
|
||||
bp.curval:=bp.curval shr bp.loadbitsize;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ write highest byte }
|
||||
writeval:=bp.curval shr (AIntBits-8);
|
||||
bp.curval:=(bp.curval and (not($ff shl (AIntBits-8)))) shl 8;
|
||||
{ write highest "loadbitsize" bits }
|
||||
writeval:=bp.curval shr (AIntBits-bp.loadbitsize);
|
||||
bp.curval:=bp.curval shl bp.loadbitsize;
|
||||
end;
|
||||
list.concat(tai_const.create_8bit(writeval));
|
||||
dec(bitstowrite,8);
|
||||
case bp.loadbitsize of
|
||||
8: list.concat(tai_const.create_8bit(writeval));
|
||||
16: list.concat(tai_const.create_16bit(writeval));
|
||||
32: list.concat(tai_const.create_32bit(writeval));
|
||||
64: list.concat(tai_const.create_64bit(writeval));
|
||||
else
|
||||
internalerror(2013111101);
|
||||
end;
|
||||
dec(bitstowrite,bp.loadbitsize);
|
||||
end;
|
||||
bp.curval:=bp.nextval;
|
||||
bp.nextval:=0;
|
||||
end;
|
||||
|
||||
{$pop}
|
||||
|
||||
|
||||
{ parses a packed array constant }
|
||||
|
Loading…
Reference in New Issue
Block a user