Browse Source

* New test for i40122

J. Gareth "Curious Kit" Moreton 2 years ago
parent
commit
090e4fea96
1 changed files with 107 additions and 0 deletions
  1. 107 0
      tests/webtbs/tw40122.pp

+ 107 - 0
tests/webtbs/tw40122.pp

@@ -0,0 +1,107 @@
+{ %OPT=-Os -O1 -MDelphi }
+
+{ Tests erroneous CMOV optimisation under x86 }
+
+program tw40122;
+
+uses
+  Math;
+
+function VerifyAccessRange(var nFrom, nTo: Integer; const Size: Integer): Integer;
+begin
+  Result:=0;
+  nFrom:=Min(nFrom,nTo);
+  nTo:=Max(nFrom,nTo);
+  if (nFrom<=0) then
+  begin
+    nFrom:=1;
+    Result:=Size;
+  end;
+  if (nTo>Size) then
+  begin
+    nTo:=Size;
+    Result:=Size;
+  end;
+  WriteLn('- Output Range: nfrom = ',nfrom, '; nto = ', nto);
+end;
+
+function CheckLimits(L, H, S: Integer): Boolean;
+var
+  ns, ne, nSize: Integer;
+begin
+  Result := False;
+  ns := L; ne := H;
+  WriteLn('Testing: ', L, '..', H, ' -> 1..', S, '...');
+  nSize := VerifyAccessRange(ns,ne,S);
+  WriteLn('Output value (0 or Size): ', nSize);
+ 
+  if (nSize <> 0) and (nSize <> S) then
+  begin
+    WriteLn('- FAIL: Size was modified');
+    Exit;
+  end;
+
+  WriteLn('- Final result: ', ns, '..', ne);
+  
+  if (L <= 0) then
+  begin
+    if (ns <= 0) then
+    begin
+      WriteLn('- FAIL: Low range wasn''t adjusted');
+      Exit;
+    end
+    else if (ns <> 1) then
+    begin
+      WriteLn('- FAIL: Low range wasn''t equal to 1');
+      Exit;
+    end;
+  end
+  else
+  begin
+    if (ns <> L) then
+    begin
+      WriteLn('- FAIL: Low range should not have been adjusted');
+      Exit;
+    end;
+  end;
+    
+  if (H > S) then
+  begin
+    if (ne > S) then
+    begin
+      WriteLn('- FAIL: High range wasn''t adjusted');
+      Exit;
+    end
+    else if (ne <> S) then
+    begin
+      WriteLn('- FAIL: High range wasn''t equal to ', S);
+      Exit;
+    end;
+  end
+  else
+  begin
+    if (ne <> H) then
+    begin
+      WriteLn('- FAIL: High range should not have been adjusted');
+      Exit;
+    end;
+  end;
+
+  WriteLn('- Pass');
+  Result := True;
+end;
+
+const
+  LArray: array[0..3] of Integer = (1,     -10,   1,     -10);
+  RArray: array[0..3] of Integer = (71299, 30000, 30000, 71299);
+  SArray: array[0..3] of Integer = (65535, 65535, 65535, 65535);
+
+var
+  X: Integer;
+begin
+  for X := 0 to 3 do
+    if not CheckLimits(LArray[X], RArray[X], SArray[X]) then
+      Halt(1);
+      
+  WriteLn('ok');
+end.