mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 00:42:06 +02:00

is less ambiguous as far as generating the "closest" floating point representation is concerned (fixes test on on systems where the max. fpu precision is double) git-svn-id: trunk@13101 -
205 lines
4.6 KiB
ObjectPascal
205 lines
4.6 KiB
ObjectPascal
{****************************************************************}
|
|
{ CODE GENERATOR TEST PROGRAM }
|
|
{****************************************************************}
|
|
{ NODE TESTED : secondtypeconvert() -> second_int_to_real }
|
|
{****************************************************************}
|
|
{ PRE-REQUISITES: secondload() }
|
|
{ secondassign() }
|
|
{ secondcalln() }
|
|
{ secondinline() }
|
|
{ secondadd() }
|
|
{****************************************************************}
|
|
{ DEFINES: }
|
|
{****************************************************************}
|
|
{ REMARKS: Tests integer to real conversion }
|
|
{ This routine assumes that there is a type conversion }
|
|
{ from all types to s32bit, u32bit or s64bit before conversion }
|
|
{ to a real. }
|
|
{****************************************************************}
|
|
program tcnvint4;
|
|
|
|
{$ifdef VER70}
|
|
{$define tp}
|
|
{$endif}
|
|
|
|
{$R-}
|
|
|
|
{$ifdef tp}
|
|
type
|
|
smallint = integer;
|
|
{$endif}
|
|
|
|
procedure fail;
|
|
begin
|
|
WriteLn('Failure.');
|
|
halt(1);
|
|
end;
|
|
|
|
|
|
const
|
|
RESULT_U64BIT = qword($8fc0000000000000);
|
|
RESULT_S64BIT = -101234;
|
|
RESULT_S32BIT = -1000000;
|
|
RESULT_U32BIT = 2000000;
|
|
RESULT_S16BIT = -12123;
|
|
RESULT_U16BIT = 12123;
|
|
RESULT_U8BIT = 247;
|
|
RESULT_S8BIT = -123;
|
|
|
|
|
|
{$ifndef tp}
|
|
function gets64bit : int64;
|
|
begin
|
|
gets64bit := RESULT_S64BIT;
|
|
end;
|
|
|
|
function getu64bit : qword;
|
|
begin
|
|
getu64bit := RESULT_U64BIT;
|
|
end;
|
|
{$endif}
|
|
|
|
function gets32bit : longint;
|
|
begin
|
|
gets32bit := RESULT_S32BIT;
|
|
end;
|
|
|
|
function gets16bit : smallint;
|
|
begin
|
|
gets16bit := RESULT_S16BIT;
|
|
end;
|
|
|
|
function gets8bit : shortint;
|
|
begin
|
|
gets8bit := RESULT_S8BIT;
|
|
end;
|
|
|
|
function getu8bit : byte;
|
|
begin
|
|
getu8bit := RESULT_U8BIT;
|
|
end;
|
|
|
|
function getu16bit : word;
|
|
begin
|
|
getu16bit := RESULT_U16BIT;
|
|
end;
|
|
|
|
function getu32bit : longint;
|
|
begin
|
|
getu32bit := RESULT_U32BIT;
|
|
end;
|
|
|
|
var
|
|
s32bit : longint;
|
|
failed : boolean;
|
|
s16bit : smallint;
|
|
s8bit : shortint;
|
|
u8bit : byte;
|
|
u16bit : word;
|
|
{$ifndef tp}
|
|
s64bit : int64;
|
|
u32bit : cardinal;
|
|
{$endif}
|
|
result_val : real;
|
|
begin
|
|
{ left : LOC_REFERENCE }
|
|
Write('second_int_to_real (left : LOC_REFERENCE)...');
|
|
s64bit := RESULT_S64BIT;
|
|
failed := false;
|
|
result_val := s64bit;
|
|
if trunc(result_val) <> RESULT_S64BIT then
|
|
failed:=true;
|
|
|
|
s32bit := RESULT_S32BIT;
|
|
result_val := s32bit;
|
|
if trunc(result_val) <> RESULT_S32BIT then
|
|
failed:=true;
|
|
|
|
|
|
u32bit := high(u32bit);
|
|
result_val := u32bit;
|
|
if trunc(result_val) <> high(u32bit) then
|
|
failed:=true;
|
|
|
|
u32bit := RESULT_U32BIT;
|
|
result_val := u32bit;
|
|
if trunc(result_val) <> RESULT_U32BIT then
|
|
failed:=true;
|
|
|
|
s16bit := RESULT_S16BIT;
|
|
result_val := s16bit;
|
|
if trunc(result_val) <> RESULT_S16BIT then
|
|
failed:=true;
|
|
|
|
u16bit := RESULT_U16BIT;
|
|
result_val := u16bit;
|
|
if trunc(result_val) <> RESULT_U16BIT then
|
|
failed:=true;
|
|
|
|
|
|
s8bit := RESULT_S8BIT;
|
|
result_val := s8bit;
|
|
if trunc(result_val) <> RESULT_S8BIT then
|
|
failed:=true;
|
|
|
|
u8bit := RESULT_U8BIT;
|
|
result_val := u8bit;
|
|
if trunc(result_val) <> RESULT_U8BIT then
|
|
failed:=true;
|
|
|
|
|
|
if failed then
|
|
fail
|
|
else
|
|
WriteLn('Passed!');
|
|
|
|
Write('second_int_to_real (left : LOC_REGISTER)...');
|
|
failed := false;
|
|
result_val := gets64bit;
|
|
if trunc(result_val) <> RESULT_S64BIT then
|
|
failed:=true;
|
|
|
|
result_val := getu64bit;
|
|
if result_val <> 10358279142952140800.0 then
|
|
begin
|
|
writeln('got ',result_val:0);
|
|
writeln('expected ',10358279142952140800.0);
|
|
failed:=true;
|
|
end;
|
|
|
|
result_val := gets32bit;
|
|
if trunc(result_val) <> RESULT_S32BIT then
|
|
failed:=true;
|
|
|
|
|
|
result_val := getu32bit;
|
|
if trunc(result_val) <> RESULT_U32BIT then
|
|
failed:=true;
|
|
|
|
result_val := getu8bit;
|
|
if trunc(result_val) <> RESULT_u8BIT then
|
|
failed:=true;
|
|
|
|
|
|
result_val := gets8bit;
|
|
if trunc(result_val) <> RESULT_s8BIT then
|
|
failed:=true;
|
|
|
|
|
|
result_val := gets16bit;
|
|
if trunc(result_val) <> RESULT_S16BIT then
|
|
failed:=true;
|
|
|
|
|
|
result_val := getu16bit;
|
|
if trunc(result_val) <> RESULT_U16BIT then
|
|
failed:=true;
|
|
|
|
|
|
if failed then
|
|
fail
|
|
else
|
|
WriteLn('Passed!');
|
|
|
|
end.
|