summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-07 21:41:12 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-07 21:41:12 +0000
commit3109ddf23728cd2a77c33e06441f7e232220d397 (patch)
treeed5760884128c0b3d5a9f6f132c46fc18bb6aa33
parent62b610eeedf6e986143663c3f18024aac08fe718 (diff)
downloadfpc-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.inc16
-rw-r--r--tests/test/units/system/talign.pp23
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.