|
@@ -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.
|