mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 11:48:34 +02:00
+ tcgsubscriptnode.pass_generate_code makes use of a_loadmm_reg_intreg to avoid location_force_mem calls
git-svn-id: trunk@37373 -
This commit is contained in:
parent
f0c237a159
commit
6f338bb4b5
@ -342,6 +342,7 @@ implementation
|
||||
pd : tprocdef;
|
||||
sym : tsym;
|
||||
st : tsymtable;
|
||||
hreg : TRegister;
|
||||
begin
|
||||
sym:=nil;
|
||||
secondpass(left);
|
||||
@ -447,7 +448,7 @@ implementation
|
||||
memory as well }
|
||||
((left.location.size in [OS_PAIR,OS_SPAIR]) and
|
||||
(vs.fieldoffset div sizeof(aword)<>(vs.fieldoffset+vs.getsize-1) div sizeof(aword))) or
|
||||
(location.loc in [LOC_MMREGISTER,LOC_FPUREGISTER,LOC_CMMREGISTER,LOC_CFPUREGISTER,
|
||||
(location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER,
|
||||
{ actually, we should be able to "subscript" a constant, but this would require some code
|
||||
which enables dumping and reading constants from a temporary memory buffer. This
|
||||
must be done a CPU dependent way, so it is not easy and probably not worth the effort (FK)
|
||||
@ -456,6 +457,20 @@ implementation
|
||||
hlcg.location_force_mem(current_asmdata.CurrAsmList,location,left.resultdef)
|
||||
else
|
||||
begin
|
||||
if (location.loc in [LOC_MMREGISTER,LOC_CMMREGISTER]) then
|
||||
if (tcgsize2size[location.size]<=tcgsize2size[OS_INT]) then
|
||||
begin
|
||||
hreg:=cg.getintregister(current_asmdata.CurrAsmList,location.size);
|
||||
cg.a_loadmm_reg_intreg(current_asmdata.CurrAsmList,reg_cgsize(left.location.register),location.size,
|
||||
left.location.register,hreg,mms_movescalar);
|
||||
location_reset(left.location,LOC_REGISTER,int_cgsize(tcgsize2size[left.location.size]));
|
||||
left.location.register:=hreg;
|
||||
{ copy again, we changed left.location }
|
||||
location_copy(location,left.location);
|
||||
end
|
||||
else
|
||||
hlcg.location_force_mem(current_asmdata.CurrAsmList,location,left.resultdef);
|
||||
|
||||
if (left.location.loc = LOC_REGISTER) then
|
||||
location.loc := LOC_SUBSETREG
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user