* 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:
Jonas Maebe 2014-03-06 21:40:04 +00:00
parent e9268a0a14
commit 672c96a811

View File

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