浏览代码

Merged revisions 9058,9063 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r9058 | yury | 2007-11-02 13:19:10 +0200 (Пт, 02 ноя 2007) | 1 line

* Fixed CompareDWord.
........
r9063 | yury | 2007-11-02 22:39:26 +0200 (Пт, 02 ноя 2007) | 1 line

* Test negative return values from compare functions.
........

git-svn-id: branches/fixes_2_2@9088 -

yury 18 年之前
父节点
当前提交
cbc82fb5d5
共有 2 个文件被更改,包括 77 次插入52 次删除
  1. 16 28
      rtl/inc/generic.inc
  2. 61 24
      tests/test/tcmp.pp

+ 16 - 28
rtl/inc/generic.inc

@@ -491,9 +491,7 @@ function CompareDWord(Const buf1,buf2;len:SizeInt):SizeInt;
 var
   aligncount : sizeint;
   psrc,pdest,pend : pdword;
-  b : ptrint;
 begin
-  b:=0;
   psrc:=@buf1;
   pdest:=@buf2;
   if (len>4*sizeof(ptruint)-11)
@@ -508,14 +506,11 @@ begin
       pend:=psrc+aligncount;
       while psrc<pend do
         begin
-          b:=(ptrint(psrc^)-ptrint(pdest^));
-          if b<>0 then
-            begin
-              if b<0 then
-                exit(-1)
-              else
-                exit(1);
-            end;
+          if psrc^<>pdest^ then
+            if psrc^>pdest^ then
+              exit(1)
+            else
+              exit(-1);
           inc(pdest);
           inc(psrc);
         end;
@@ -524,8 +519,7 @@ begin
       len:=((len*4) and (sizeof(PtrUInt)-1)) shr 2;
       while psrc<pend do
         begin
-          b:=(pptrint(psrc)^-pptrint(pdest)^);
-          if b<>0 then
+          if pptrint(psrc)^<>pptrint(pdest)^ then
             begin
               len:=sizeof(ptruint) shr 2;
               break;
@@ -543,14 +537,11 @@ begin
   if ((PtrUInt(pdest) and 3) or (PtrUInt(psrc) and 3))<>0 then
     while psrc<pend do
       begin
-        b:=(ptrint(unaligned(psrc^))-ptrint(unaligned(pdest^)));
-        if b<>0 then
-          begin
-            if b<0 then
-              exit(-1)
-            else
-              exit(1);
-          end;
+        if unaligned(psrc^)<>unaligned(pdest^) then
+          if unaligned(psrc^)>unaligned(pdest^) then
+            exit(1)
+          else
+            exit(-1);
         inc(pdest);
         inc(psrc);
       end
@@ -558,14 +549,11 @@ begin
 {$endif FPC_REQUIRES_PROPER_ALIGNMENT}
     while psrc<pend do
       begin
-        b:=(ptrint(psrc^)-ptrint(pdest^));
-        if b<>0 then
-          begin
-            if b<0 then
-              exit(-1)
-            else
-              exit(1);
-          end;
+        if psrc^<>pdest^ then
+          if psrc^>pdest^ then
+            exit(1)
+          else
+            exit(-1);
         inc(pdest);
         inc(psrc);
       end;

+ 61 - 24
tests/test/tcmp.pp

@@ -30,53 +30,90 @@ begin
               writeln('cmpbyte error 2 for (',i,',',j,',',k,')');
               halt(2);
             end;
+          if comparebyte(b[k+4],a[j],i+1)>0 then
+            begin
+              writeln(b[k+4+i],' ',a[j+i]);
+              writeln('cmpbyte error 3 for (',i,',',j,',',k,')');
+              halt(3);
+            end;
 
           if (i and 1 = 0) then
             begin
               if compareword(a[j],b[k+4],i shr 1)<>0 then
                 begin
-                  writeln('cmpword error 3 for (',i,',',j,',',k,')');
-                  halt(3);
+                  writeln('cmpword error 4 for (',i,',',j,',',k,')');
+                  halt(4);
                 end;
               if compareword(a[j],b[k+4],i shr 1 + 1)<0 then
                 begin
-                  writeln('cmpword error 4 for (',i,',',j,',',k,')');
-                  halt(4);
+                  writeln('cmpword error 5 for (',i,',',j,',',k,')');
+                  halt(5);
+                end;
+              if compareword(b[k+4],a[j],i shr 1 + 1)>0 then
+                begin
+                  writeln('cmpword error 6 for (',i,',',j,',',k,')');
+                  halt(6);
                 end;
             end
           else
-            if compareword(a[j],b[k+4],(i+1) shr 1)<0 then
-              begin
-                writeln('cmpword error 5 for (',i,',',j,',',k,')');
-                halt(5);
-              end;
+            begin
+              if compareword(a[j],b[k+4],(i+1) shr 1)<0 then
+                begin
+                  writeln('cmpword error 7 for (',i,',',j,',',k,')');
+                  halt(7);
+                end;
+              if compareword(b[k+4],a[j],(i+1) shr 1)>0 then
+                begin
+                  writeln('cmpword error 8 for (',i,',',j,',',k,')');
+                  halt(8);
+                end;
+            end;
 
           if (i and 3 = 0) then
             begin
               if comparedword(a[j],b[k+4],i shr 2)<>0 then
                 begin
-                  writeln('cmpdword error 6 for (',i,',',j,',',k,')');
-                  halt(6);
+                  writeln('cmpdword error 9 for (',i,',',j,',',k,')');
+                  halt(9);
                 end;
               if comparedword(a[j],b[k+4],i shr 2 + 1)<=0 then
                 begin
                   writeln(comparedword(a[j],b[k+4],i shr 2+1));
-                  writeln(pdword(@a[j])^,' ',pdword(@b[k+4])^);
-                  writeln(pdword(@a[j+i])^,' ',pdword(@b[k+4+i])^);
-                  writeln(pdword(@a[j+i+4])^,' ',pdword(@b[k+4+i+4])^);
-                  writeln('cmpdword error 7 for (',i,',',j,',',k,')');
-                  halt(7);
+                  writeln(unaligned(pdword(@a[j])^),' ',unaligned(pdword(@b[k+4])^));
+                  writeln(unaligned(pdword(@a[j+i])^),' ',unaligned(pdword(@b[k+4+i])^));
+                  writeln(unaligned(pdword(@a[j+i+4])^),' ',unaligned(pdword(@b[k+4+i+4])^));
+                  writeln('cmpdword error 10 for (',i,',',j,',',k,')');
+                  halt(10);
+                end;
+              if comparedword(b[k+4],a[j],i shr 2 + 1)>=0 then
+                begin
+                  writeln(comparedword(b[k+4],a[j],i shr 2+1));
+                  writeln(unaligned(pdword(@b[k+4])^),' ',unaligned(pdword(@a[j])^));
+                  writeln(unaligned(pdword(@b[k+4+i])^),' ',unaligned(pdword(@a[j+i])^));
+                  writeln(unaligned(pdword(@b[k+4+i+4])^),' ',unaligned(pdword(@a[j+i+4])^));
+                  writeln('cmpdword error 11 for (',i,',',j,',',k,')');
+                  halt(11);
                 end;
             end
           else
-            if comparedword(a[j],b[k+4],(i+3) shr 2)<0 then
-              begin
-                writeln(comparedword(a[j],b[k+4],(i+3) shr 2));
-                writeln(pdword(@a[j])^,' ',pdword(@b[k+4])^);
-                writeln(pdword(@a[j+(i+3) shr 2-1])^,' ',pdword(@b[k+4+(i+3) shr 2-1])^);
-                writeln('cmpdword error 8 for (',i,',',j,',',k,')');
-                halt(8);
-              end;
+            begin
+              if comparedword(a[j],b[k+4],(i+3) shr 2)<0 then
+                begin
+                  writeln(comparedword(a[j],b[k+4],(i+3) shr 2));
+                  writeln(unaligned(pdword(@a[j])^),' ',unaligned(pdword(@b[k+4])^));
+                  writeln(unaligned(pdword(@a[j+(i+3) shr 2-1])^),' ',unaligned(pdword(@b[k+4+(i+3) shr 2-1])^));
+                  writeln('cmpdword error 12 for (',i,',',j,',',k,')');
+                  halt(12);
+                end;
+              if comparedword(b[k+4],a[j],(i+3) shr 2)>0 then
+                begin
+                  writeln(comparedword(b[k+4],a[j],(i+3) shr 2));
+                  writeln(unaligned(pdword(@b[k+4])^),' ',unaligned(pdword(@a[j])^));
+                  writeln(unaligned(pdword(@b[k+4+(i+3) shr 2-1])^),' ',unaligned(pdword(@a[j+(i+3) shr 2-1])^));
+                  writeln('cmpdword error 13 for (',i,',',j,',',k,')');
+                  halt(13);
+                end;
+            end;
         end;
 end;