mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 18:39:29 +02:00

(and the same for ror), because their operation is very dependent on the operand size, and it's fairly easy to misjudge the bitwidth of the outcome of an expression in Pascal if you are not intimately familiar with the language (or if you don't know the exact types of all involved values in an expression) git-svn-id: trunk@12621 -
65 lines
964 B
ObjectPascal
65 lines
964 B
ObjectPascal
// tests whether the rol/ror operations properly mask out the shift count
|
|
procedure do_error(i : integer);
|
|
begin
|
|
writeln('Error: ',i);
|
|
halt(1);
|
|
end;
|
|
|
|
var
|
|
b1,b2 : byte;
|
|
w1 : word;
|
|
d1 : dword;
|
|
q1 : qword;
|
|
begin
|
|
b1:=2;
|
|
b2:=15;
|
|
b1:=rorbyte(b1,b2);
|
|
if b1<>4 then
|
|
do_error(1000);
|
|
|
|
w1:=1;
|
|
b2:=29;
|
|
w1:=rorword(w1,b2);
|
|
if w1<>$8 then
|
|
do_error(1001);
|
|
|
|
d1:=$400;
|
|
b2:=60;
|
|
d1:=rordword(d1,b2);
|
|
if d1<>$4000 then
|
|
do_error(1002);
|
|
|
|
q1:=$80000000000;
|
|
b2:=125;
|
|
q1:=rorqword(q1,b2);
|
|
if q1<>$400000000000 then
|
|
do_error(1003);
|
|
|
|
b1:=$81;
|
|
b2:=14;
|
|
b1 := rolbyte(b1, b2);
|
|
if (b1 <> $60) then
|
|
do_error(2000);
|
|
|
|
|
|
w1:=$8001;
|
|
b2:=22;
|
|
w1:=rolword(w1,b2);
|
|
if w1<>$60 then
|
|
do_error(2001);
|
|
|
|
d1:=$80000001;
|
|
b2:=38;
|
|
d1:=roldword(d1,b2);
|
|
if d1<>$60 then
|
|
do_error(2002);
|
|
|
|
q1:=qword($8000000000000001);
|
|
b2:=70;
|
|
q1:=rolqword(q1,b2);
|
|
if q1<>$60 then
|
|
do_error(2003);
|
|
|
|
writeln('ok');
|
|
end.
|