------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             S E M _ V F P T                              --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1997-2010, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with CStand;   use CStand;
with Einfo;    use Einfo;
with Opt;      use Opt;
with Stand;    use Stand;
with Targparm; use Targparm;

package body Sem_VFpt is

   -----------------
   -- Set_D_Float --
   -----------------

   procedure Set_D_Float (E : Entity_Id) is
      VAXDF_Digits : constant := 9;

   begin
      Init_Size         (Base_Type (E), 64);
      Init_Alignment    (Base_Type (E));
      Init_Digits_Value (Base_Type (E), VAXDF_Digits);
      Set_Float_Rep     (Base_Type (E), VAX_Native);
      Set_Float_Bounds  (Base_Type (E));

      Init_Size         (E, 64);
      Init_Alignment    (E);
      Init_Digits_Value (E, VAXDF_Digits);
      Set_Scalar_Range  (E, Scalar_Range (Base_Type (E)));
   end Set_D_Float;

   -----------------
   -- Set_F_Float --
   -----------------

   procedure Set_F_Float (E : Entity_Id) is
      VAXFF_Digits : constant := 6;

   begin
      Init_Size         (Base_Type (E), 32);
      Init_Alignment    (Base_Type (E));
      Init_Digits_Value (Base_Type (E), VAXFF_Digits);
      Set_Float_Rep     (Base_Type (E), VAX_Native);
      Set_Float_Bounds  (Base_Type (E));

      Init_Size         (E, 32);
      Init_Alignment    (E);
      Init_Digits_Value (E, VAXFF_Digits);
      Set_Scalar_Range  (E, Scalar_Range (Base_Type (E)));
   end Set_F_Float;

   -----------------
   -- Set_G_Float --
   -----------------

   procedure Set_G_Float (E : Entity_Id) is
      VAXGF_Digits : constant := 15;

   begin
      Init_Size         (Base_Type (E), 64);
      Init_Alignment    (Base_Type (E));
      Init_Digits_Value (Base_Type (E), VAXGF_Digits);
      Set_Float_Rep     (Base_Type (E), VAX_Native);
      Set_Float_Bounds  (Base_Type (E));

      Init_Size         (E, 64);
      Init_Alignment    (E);
      Init_Digits_Value (E, VAXGF_Digits);
      Set_Scalar_Range  (E, Scalar_Range (Base_Type (E)));
   end Set_G_Float;

   -------------------
   -- Set_IEEE_Long --
   -------------------

   procedure Set_IEEE_Long (E : Entity_Id) is
      IEEEL_Digits : constant := 15;

   begin
      Init_Size         (Base_Type (E), 64);
      Init_Alignment    (Base_Type (E));
      Init_Digits_Value (Base_Type (E), IEEEL_Digits);
      Set_Float_Rep     (Base_Type (E), IEEE_Binary);
      Set_Float_Bounds  (Base_Type (E));

      Init_Size         (E, 64);
      Init_Alignment    (E);
      Init_Digits_Value (E, IEEEL_Digits);
      Set_Scalar_Range  (E, Scalar_Range (Base_Type (E)));
   end Set_IEEE_Long;

   --------------------
   -- Set_IEEE_Short --
   --------------------

   procedure Set_IEEE_Short (E : Entity_Id) is
      IEEES_Digits : constant := 6;

   begin
      Init_Size         (Base_Type (E), 32);
      Init_Alignment    (Base_Type (E));
      Init_Digits_Value (Base_Type (E), IEEES_Digits);
      Set_Float_Rep     (Base_Type (E), IEEE_Binary);
      Set_Float_Bounds  (Base_Type (E));

      Init_Size         (E, 32);
      Init_Alignment    (E);
      Init_Digits_Value (E, IEEES_Digits);
      Set_Scalar_Range  (E, Scalar_Range (Base_Type (E)));
   end Set_IEEE_Short;

   ------------------------------
   -- Set_Standard_Fpt_Formats --
   ------------------------------

   procedure Set_Standard_Fpt_Formats is
   begin
      --  IEEE case

      if Opt.Float_Format = 'I' then
         Set_IEEE_Short (Standard_Float);
         Set_IEEE_Long  (Standard_Long_Float);
         Set_IEEE_Long  (Standard_Long_Long_Float);

      --  Vax float case

      else
         Set_F_Float (Standard_Float);

         if Opt.Float_Format_Long = 'D' then
            Set_D_Float (Standard_Long_Float);
         else
            Set_G_Float (Standard_Long_Float);
         end if;

         --  Note: Long_Long_Float gets set only in the real VMS case,
         --  because this gives better results for testing out the use
         --  of VAX float on non-VMS environments with the -gnatdm switch.

         if OpenVMS_On_Target then
            Set_G_Float (Standard_Long_Long_Float);
         end if;
      end if;
   end Set_Standard_Fpt_Formats;

end Sem_VFpt;
