diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-07 21:41:12 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-07 21:41:12 +0000 |
commit | 3109ddf23728cd2a77c33e06441f7e232220d397 (patch) | |
tree | ed5760884128c0b3d5a9f6f132c46fc18bb6aa33 | |
parent | 62b610eeedf6e986143663c3f18024aac08fe718 (diff) | |
download | fpc-3109ddf23728cd2a77c33e06441f7e232220d397.tar.gz |
* optimized align() so it no longer contains any branches which
are undecidable at compile time
+ basic test for align() function
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@9674 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | rtl/inc/generic.inc | 16 | ||||
-rw-r--r-- | tests/test/units/system/talign.pp | 23 |
2 files changed, 31 insertions, 8 deletions
diff --git a/rtl/inc/generic.inc b/rtl/inc/generic.inc index 5f2c1d7d6e..1bb2134df5 100644 --- a/rtl/inc/generic.inc +++ b/rtl/inc/generic.inc @@ -1507,20 +1507,20 @@ procedure inclocked(var l:int64); function align(addr : PtrUInt;alignment : PtrUInt) : PtrUInt;{$ifdef SYSTEMINLINE}inline;{$endif} + var + tmp: PtrUInt; begin - if addr mod alignment<>0 then - result:=addr+(alignment-(addr mod alignment)) - else - result:=addr; + tmp:=addr+alignment-1; + result:=tmp-(tmp mod alignment) end; function align(addr : Pointer;alignment : PtrUInt) : Pointer;{$ifdef SYSTEMINLINE}inline;{$endif} + var + tmp: PtrUInt; begin - if PtrUInt(addr) mod alignment<>0 then - result:=pointer(addr+(alignment-(PtrUInt(addr) mod alignment))) - else - result:=addr; + tmp:=PtrUInt(addr)+alignment-1; + result:=pointer(tmp-(tmp mod alignment)); end; diff --git a/tests/test/units/system/talign.pp b/tests/test/units/system/talign.pp new file mode 100644 index 0000000000..ea39820331 --- /dev/null +++ b/tests/test/units/system/talign.pp @@ -0,0 +1,23 @@ +var + p: pointer; + u: ptruint; + i: cardinal; +begin + p:=pointer(1); + for i:=0 to 15 do + if align(p+i,16)<>pointer(16) then + halt(1); + p:=pointer(41); + for i:=0 to 39 do + if align(p+i,40)<>pointer(80) then + halt(2); + + u:=1; + for i:=0 to 15 do + if align(u+i,16)<>16 then + halt(3); + u:=41; + for i:=0 to 39 do + if align(u+i,40)<>80 then + halt(4); +end. |