123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- {$q+}
- {$mode objfpc}
- uses
- sysutils;
- type
- tqwordrec = packed record
- {$ifndef ENDIAN_BIG}
- low,high : dword;
- {$else}
- high, low : dword;
- {$endif}
- end;
- procedure assignqword(h,l : dword;var q : qword);
- begin
- tqwordrec(q).high:=h;
- tqwordrec(q).low:=l;
- end;
- procedure testmulqword;
- var
- q1, q2, q3, q4: qword;
- c: cardinal;
- loops: longint;
- begin
- assignqword(0,$1000,q1);
- assignqword(0,$7fff,q2);
- c := $1000 * $7fff;
- q4 := c;
- loops := 0;
- try
- repeat
- q3 := q1 * q2;
- if q3 <> q4 then
- begin
- writeln('qword multiplication of shift error');
- halt(1);
- end;
- inc(loops);
- if (loops >= 39) then
- begin
- writeln('qword multiplication overflow detection failed');
- halt(1);
- end;
- q1 := q1 shl 1;
- q4 := q4 shl 1;
- writeln(loops,': ',q3);
- until false;
- except
- on eintoverflow do
- begin
- if loops < 38 then
- begin
- writeln('false qword multiplication overflow detected');
- halt(1);
- end;
- end;
- end;
- end;
- begin
- testmulqword;
- end.
|