Hi everyone,
I was wondering... is there an intrinsic in Free Pascal that swaps the pointers stored in two object or pointer variables? That is... something like "procedure SwapAddresses(var Obj1: TObject; var Obj2: TObject);" so after it is called, Obj2 now points to Obj1 and vice versa? Under x86-64, for example, it can be implemented as (Intel notation):
XOR RCX, RDX
XOR RDX, RCX
XOR RCX, RDX
Or just
XCHG RCX, RDX
Both methods take just 3 cycles to perform (faster than transferring the object data by several orders of magnitude, plus the pointers don't get dereferenced). But equivalent Pascal code that typecasts the objects or pointers into PtrUint and then uses the xor operator may not be portable (e.g. on platforms that don't have pointers and treat objects differently).
I ask this because I've noticed a slightly clever speed-up in parts of the peephole optimiser where "TmpUsedRegs" contains exactly the information required to be stored in "UsedRegs" (usually because "UpdateUsedRegs(TmpUsedRegs, tai(p.Next))" was called and then p was freed, hence any required call to "UpdateUsedRegs(tai(p.Next))" will reproduce the same register usage. By simply swapping the pointers between UsedRegs and TmpUsedRegs, I can immediately treat the contents of TmpUsedRegs as the live data and repurpose UsedRegs as the new temporary register tracking. Calls to TransferUsedRegs and RestoreUsedRegs are slow.
Gareth aka. Kit
