diff --git a/compiler/nbas.pas b/compiler/nbas.pas index 778582aeff..4e5d64d2d9 100644 --- a/compiler/nbas.pas +++ b/compiler/nbas.pas @@ -90,12 +90,6 @@ interface ttempcreatenode = class; - ttemplocation = record - case loc: tcgloc of - LOC_REFERENCE: (ref: treference); - LOC_REGISTER: (reg: tregister); - end; - { to allow access to the location by temp references even after the temp has } { already been disposed and to make sure the coherency between temps and } { temp references is kept after a getcopy } @@ -110,7 +104,7 @@ interface may_be_in_reg : boolean; valid : boolean; nextref_set_hookoncopy_nil : boolean; - loc : ttemplocation; + location : tlocation; end; { a node which will create a (non)persistent temp of a given type with a given } @@ -686,7 +680,7 @@ implementation { temp must fit a single register } (tstoreddef(_restype.def).is_fpuregable or (tstoreddef(_restype.def).is_intregable and - (_size<=TCGSize2Size[OS_INT]))) and + (_size<=TCGSize2Size[OS_64]))) and { size of register operations must be known } (def_cgsize(_restype.def)<>OS_NO) and { no init/final needed } @@ -873,15 +867,23 @@ implementation function ttemprefnode.pass_1 : tnode; begin expectloc := LOC_REFERENCE; - if tempinfo^.may_be_in_reg then + if not tempinfo^.restype.def.needs_inittable and + tempinfo^.may_be_in_reg then begin - if (tempinfo^.temptype = tt_persistent) then + if tempinfo^.restype.def.deftype=floatdef then begin - { !!tell rgobj this register is now a regvar, so it can't be freed!! } - expectloc := LOC_CREGISTER + if (tempinfo^.temptype = tt_persistent) then + expectloc := LOC_CFPUREGISTER + else + expectloc := LOC_FPUREGISTER; end else - expectloc := LOC_REGISTER; + begin + if (tempinfo^.temptype = tt_persistent) then + expectloc := LOC_CREGISTER + else + expectloc := LOC_REGISTER; + end; end; result := nil; end; @@ -1024,7 +1026,10 @@ begin end. { $Log$ - Revision 1.91 2004-11-28 19:16:53 jonas + Revision 1.92 2004-12-03 16:04:47 peter + * use tlocation for tempnodes + + Revision 1.91 2004/11/28 19:16:53 jonas * fixed check for regvar-ability of tempnodes Revision 1.90 2004/11/21 17:54:59 peter diff --git a/compiler/ncgbas.pas b/compiler/ncgbas.pas index 1c95ab536d..dbdd4a57e3 100644 --- a/compiler/ncgbas.pas +++ b/compiler/ncgbas.pas @@ -365,8 +365,6 @@ interface *****************************************************************************} procedure tcgtempcreatenode.pass_2; - var - cgsize: tcgsize; begin location_reset(location,LOC_VOID,OS_NO); @@ -377,38 +375,40 @@ interface { get a (persistent) temp } if tempinfo^.restype.def.needs_inittable then begin - tg.GetTempTyped(exprasmlist,tempinfo^.restype.def,tempinfo^.temptype,tempinfo^.loc.ref); - tempinfo^.loc.loc := LOC_REFERENCE; + location_reset(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.restype.def)); + tg.GetTempTyped(exprasmlist,tempinfo^.restype.def,tempinfo^.temptype,tempinfo^.location.reference); end else if tempinfo^.may_be_in_reg then begin - cgsize := def_cgsize(tempinfo^.restype.def); - if tempinfo^.restype.def.deftype <> floatdef then + if tempinfo^.restype.def.deftype=floatdef then begin - if (TCGSize2Size[cgsize]>TCGSize2Size[OS_INT]) then - internalerror(2004020202); - tempinfo^.loc.reg := cg.getintregister(exprasmlist,cgsize); if (tempinfo^.temptype = tt_persistent) then - begin - { !!tell rgobj this register is now a regvar, so it can't be freed!! } - tempinfo^.loc.loc := LOC_CREGISTER - end + location_reset(tempinfo^.location,LOC_CFPUREGISTER,def_cgsize(tempinfo^.restype.def)) else - tempinfo^.loc.loc := LOC_REGISTER; + location_reset(tempinfo^.location,LOC_FPUREGISTER,def_cgsize(tempinfo^.restype.def)); + tempinfo^.location.register:=cg.getfpuregister(exprasmlist,tempinfo^.location.size); end else begin - tempinfo^.loc.reg := cg.getfpuregister(exprasmlist,cgsize); if (tempinfo^.temptype = tt_persistent) then - tempinfo^.loc.loc := LOC_CFPUREGISTER + location_reset(tempinfo^.location,LOC_CREGISTER,def_cgsize(tempinfo^.restype.def)) else - tempinfo^.loc.loc := LOC_FPUREGISTER; + location_reset(tempinfo^.location,LOC_REGISTER,def_cgsize(tempinfo^.restype.def)); +{$ifndef cpu64bit} + if tempinfo^.location.size in [OS_64,OS_S64] then + begin + tempinfo^.location.register64.reglo:=cg.getintregister(exprasmlist,OS_32); + tempinfo^.location.register64.reghi:=cg.getintregister(exprasmlist,OS_32); + end + else +{$endif cpu64bit} + tempinfo^.location.register:=cg.getintregister(exprasmlist,tempinfo^.location.size); end; end else begin - tg.GetTemp(exprasmlist,size,tempinfo^.temptype,tempinfo^.loc.ref); - tempinfo^.loc.loc := LOC_REFERENCE; + location_reset(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.restype.def)); + tg.GetTemp(exprasmlist,size,tempinfo^.temptype,tempinfo^.location.reference); end; tempinfo^.valid := true; end; @@ -423,28 +423,9 @@ interface { check if the temp is valid } if not tempinfo^.valid then internalerror(200108231); - case tempinfo^.loc.loc of - LOC_REFERENCE: - begin - { set the temp's location } - location_reset(location,LOC_REFERENCE,def_cgsize(tempinfo^.restype.def)); - location.reference := tempinfo^.loc.ref; - inc(location.reference.offset,offset); - end; - LOC_REGISTER, - LOC_CREGISTER, - LOC_FPUREGISTER, - LOC_CFPUREGISTER: - begin - if offset <> 0 then - internalerror(2004020205); - { LOC_CREGISTER, not LOC_REGISTER, otherwise we can't assign anything to it } - location_reset(location,tempinfo^.loc.loc,def_cgsize(tempinfo^.restype.def)); - location.register := tempinfo^.loc.reg; - end; - else - internalerror(2004020204); - end; + location:=tempinfo^.location; + if tempinfo^.location.loc=LOC_REFERENCE then + inc(location.reference.offset,offset); end; @@ -453,13 +434,13 @@ interface { check if the temp is valid } if not tempinfo^.valid then internalerror(200306081); - if (tempinfo^.loc.loc = LOC_REGISTER) then + if (tempinfo^.location.loc<>LOC_REFERENCE) then internalerror(2004020203); if (tempinfo^.temptype = tt_persistent) then - tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal); - tg.ungettemp(exprasmlist,tempinfo^.loc.ref); - tempinfo^.loc.ref := ref; - tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tempinfo^.temptype); + tg.ChangeTempType(exprasmlist,tempinfo^.location.reference,tt_normal); + tg.ungettemp(exprasmlist,tempinfo^.location.reference); + tempinfo^.location.reference := ref; + tg.ChangeTempType(exprasmlist,tempinfo^.location.reference,tempinfo^.temptype); { adapt location } location.reference := ref; inc(location.reference.offset,offset); @@ -474,22 +455,30 @@ interface begin location_reset(location,LOC_VOID,OS_NO); - case tempinfo^.loc.loc of + case tempinfo^.location.loc of LOC_REFERENCE: begin if release_to_normal then - tg.ChangeTempType(exprasmlist,tempinfo^.loc.ref,tt_normal) + tg.ChangeTempType(exprasmlist,tempinfo^.location.reference,tt_normal) else - tg.UnGetTemp(exprasmlist,tempinfo^.loc.ref); + tg.UnGetTemp(exprasmlist,tempinfo^.location.reference); end; LOC_CREGISTER, LOC_REGISTER: begin { make sure the register allocator doesn't reuse the } { register e.g. in the middle of a loop } - cg.a_reg_sync(exprasmlist,tempinfo^.loc.reg); +{$ifndef cpu64bit} + if tempinfo^.location.size in [OS_64,OS_S64] then + begin + cg.a_reg_sync(exprasmlist,tempinfo^.location.register64.reghi); + cg.a_reg_sync(exprasmlist,tempinfo^.location.register64.reglo); + end +{$endif cpu64bit} + else + cg.a_reg_sync(exprasmlist,tempinfo^.location.register); if release_to_normal then - tempinfo^.loc.loc := LOC_REGISTER; + tempinfo^.location.loc := LOC_REGISTER; end; end; end; @@ -506,7 +495,10 @@ begin end. { $Log$ - Revision 1.72 2004-12-02 19:26:15 peter + Revision 1.73 2004-12-03 16:04:47 peter + * use tlocation for tempnodes + + Revision 1.72 2004/12/02 19:26:15 peter * disable pass2inline Revision 1.71 2004/11/11 19:31:33 peter