aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/bug071/pattr.adb
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/bug071/pattr.adb')
-rw-r--r--testsuite/gna/bug071/pattr.adb103
1 files changed, 103 insertions, 0 deletions
diff --git a/testsuite/gna/bug071/pattr.adb b/testsuite/gna/bug071/pattr.adb
new file mode 100644
index 000000000..18ad10f0b
--- /dev/null
+++ b/testsuite/gna/bug071/pattr.adb
@@ -0,0 +1,103 @@
+with Interfaces; use Interfaces;
+with Ada.Text_IO; use Ada.Text_IO;
+with Ada.Command_Line; use Ada.Command_Line;
+
+procedure Pattr is
+ Xdigit : constant array (0 .. 15) of Character := "0123456789abcdef";
+
+ procedure Disp_Lit (Z : Natural; Known : Boolean; S : String) is
+ begin
+ Put_Line (S);
+ end Disp_Lit;
+
+ procedure Disp_Float_Lit
+ (Lit_Type : Natural; Known : Boolean; Val : IEEE_Float_64)
+ is
+ pragma Assert (IEEE_Float_64'Machine_Radix = 2);
+ pragma Assert (IEEE_Float_64'Machine_Mantissa = 53);
+ Exp : Integer;
+ Man : Unsigned_64;
+ -- Res: sign(1) + 0x(2) + Man(53 / 3 ~= 18) + p(1) + sing(1) + exp(4)
+ Str : String (1 .. 1 + 2 + 18 + 1 + 1 + 4);
+ P : Natural;
+ Neg : Boolean;
+ begin
+ Exp := IEEE_Float_64'Exponent (Val) - 1;
+ Man := Unsigned_64 (abs (IEEE_Float_64'Fraction (Val)) * 2.0 ** 53);
+
+ -- Use decimal representation if there is no digit after the dot.
+ if Man = 0 then
+ Disp_Lit (Lit_Type, Known, "0.0");
+ else
+ pragma Assert (Shift_Right (Man, 52) = 1);
+
+ -- Remove hidden 1.
+ Man := Man and (2**52 - 1);
+
+ -- Remove trailing hex 0.
+ while Man /= 0 and (Man rem 16) = 0 loop
+ Man := Man / 16;
+ end loop;
+
+ -- Exponent.
+ P := Str'Last;
+ if Exp < 0 then
+ Neg := True;
+ Exp := -Exp;
+ else
+ Neg := False;
+ end if;
+ loop
+ Str (P) := Xdigit (Exp rem 10);
+ P := P - 1;
+ Exp := Exp / 10;
+ exit when Exp = 0;
+ end loop;
+ if Neg then
+ Str (P) := '-';
+ P := P - 1;
+ end if;
+ Str (P) := 'p';
+ P := P - 1;
+
+ -- Mantissa.
+ loop
+ Str (P) := Xdigit (Natural (Man and 15));
+ P := P - 1;
+ Man := Man / 16;
+ exit when Man = 0;
+ end loop;
+
+ P := P - 4;
+ Str (P + 1) := '0';
+ Str (P + 2) := 'x';
+ Str (P + 3) := '1';
+ Str (P + 4) := '.';
+
+ if Val < 0.0 then
+ Str (P) := '-';
+ P := P - 1;
+ end if;
+
+ Disp_Lit (Lit_Type, Known, Str (P + 1 .. Str'Last));
+ end if;
+ end Disp_Float_Lit;
+
+ subtype T is IEEE_Float_64;
+ V : T;
+begin
+ if Argument_Count /= 1 then
+ Put_Line ("usage : pattr FNUM");
+ return;
+ end if;
+
+ V := T'Value (Argument (1));
+
+ Put_Line ("Machine Radix:" & Natural'Image (T'Machine_Radix));
+ Put_Line ("Machine Mantissa:" & Natural'Image (T'Machine_Mantissa));
+ Put_Line ("Machine Emin: " & Natural'Image (T'Machine_Emin));
+ Put_Line ("Machine Emax: " & Natural'Image (T'Machine_Emax));
+ Put_Line ("Exponent: " & Integer'Image (T'Exponent (V)));
+ Put_Line ("Fraction: " & T'Image (T'Fraction (V)));
+ Disp_Float_Lit (1, False, V);
+end pattr;