* fixed check regarding whether a field is in the first or second word of

of 2*sizeof(aword) bitpacked record that's kept in registers
    (mantis #29669)

git-svn-id: trunk@33177 -
This commit is contained in:
Jonas Maebe 2016-03-06 13:20:16 +00:00
parent 3ee5661ff1
commit 9788bb1316
3 changed files with 62 additions and 3 deletions

1
.gitattributes vendored
View File

@ -14968,6 +14968,7 @@ tests/webtbs/tw2958.pp svneol=native#text/plain
tests/webtbs/tw29585.pp svneol=native#text/plain
tests/webtbs/tw29609.pp svneol=native#text/pascal
tests/webtbs/tw2966.pp svneol=native#text/plain
tests/webtbs/tw29669.pp svneol=native#text/plain
tests/webtbs/tw2975.pp svneol=native#text/plain
tests/webtbs/tw2976.pp svneol=native#text/plain
tests/webtbs/tw2983.pp svneol=native#text/plain

View File

@ -325,6 +325,7 @@ implementation
paraloc1 : tcgpara;
tmpref: treference;
sref: tsubsetreference;
awordoffset,
offsetcorrection : aint;
pd : tprocdef;
sym : tsym;
@ -451,13 +452,18 @@ implementation
offsetcorrection:=0;
if (left.location.size in [OS_PAIR,OS_SPAIR]) then
begin
if (vs.fieldoffset>=sizeof(aword)) xor (target_info.endian=endian_big) then
if not is_packed_record_or_object(left.resultdef) then
awordoffset:=sizeof(aword)
else
awordoffset:=sizeof(aword)*8;
if (vs.fieldoffset>=awordoffset) xor (target_info.endian=endian_big) then
location.sreg.subsetreg := left.location.registerhi
else
location.sreg.subsetreg := left.location.register;
if (vs.fieldoffset>=sizeof(aword)) then
offsetcorrection:=sizeof(aword)*8;
if vs.fieldoffset>=awordoffset then
offsetcorrection := sizeof(aword)*8;
location.sreg.subsetregsize := OS_INT;
end

52
tests/webtbs/tw29669.pp Normal file
View File

@ -0,0 +1,52 @@
{$mode objfpc}
program Project1;
uses
SysUtils;
type
TPackedIdLevel1 = 0..255;
TPackedIdLevel2 = 0..65535;
TPackedIdLevel3 = 0..65535;
TPackedIdLevel4 = 0..65535;
TPackedIdLevel5 = 0..255;
TPackedId = bitpacked record
clusterId : TPackedIdLevel5;
agentId : TPackedIdLevel4;
dataSourceId : TPackedIdLevel3;
deviceId : TPackedIdLevel2;
esmId : TPackedIdLevel1;
end;
function PackedIdToStr(const ipsid : qword) : string;
begin
result := IntToStr(TPackedId(ipsid).esmId) + '-' +
IntToStr(TPackedId(ipsid).deviceId) + '-' +
IntToStr(TPackedId(ipsid).dataSourceId) + '-' +
IntToStr(TPackedId(ipsid).agentId) + '-' +
IntToStr(TPackedId(ipsid).clusterId);
if TPackedId(ipsid).clusterid<>123 then
halt(1);
if TPackedId(ipsid).agentid<>45678 then
halt(2);
if TPackedId(ipsid).datasourceid<>9012 then
halt(3);
if TPackedId(ipsid).deviceid<>34567 then
halt(4);
if TPackedId(ipsid).esmid<>89 then
halt(5);
end;
var
pi: TPackedId;
begin
pi.clusterid:=123;
pi.agentid:=45678;
pi.datasourceid:=9012;
pi.deviceid:=34567;
pi.esmid:=89;
writeln(PackedIdToStr(qword(pi)));
end.