------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             G N A T . S S E                              --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2009-2021, 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.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This package is the root of a set aimed at offering Ada bindings to a
--  subset of the Intel(r) Streaming SIMD Extensions with GNAT. The purpose
--  is to allow access from Ada to the SSE facilities defined in the Intel(r)
--  compiler manuals, in particular in the Intrinsics Reference of the C++
--  Compiler User's Guide, available from http://www.intel.com.

--  Assuming actual hardware support is available, this capability is
--  currently supported on the following set of targets:

--     GNU/Linux x86 and x86_64
--     Windows XP/Vista x86 and x86_64
--     Solaris x86
--     Darwin x86_64

--  This unit exposes vector _component_ types together with general comments
--  on the binding contents.

--  One other unit is offered as of today: GNAT.SSE.Vector_Types, which
--  exposes Ada types corresponding to the reference types (__m128 and the
--  like) over which a binding to the SSE GCC builtins may operate.

--  The exposed Ada types are private. Object initializations or value
--  observations may be performed with unchecked conversions or address
--  overlays, for example:

--  with Ada.Unchecked_Conversion;
--  with GNAT.SSE.Vector_Types; use GNAT.SSE, GNAT.SSE.Vector_Types;

--  procedure SSE_Base is

--     --  Core operations

--     function ia32_addps (A, B : m128) return m128;
--     pragma Import (Intrinsic, ia32_addps, "__builtin_ia32_addps");

--     --  User views & conversions

--     type Vf32_View is array (1 .. 4) of GNAT.SSE.Float32;
--     for Vf32_View'Alignment use VECTOR_ALIGN;

--     function To_m128 is new Ada.Unchecked_Conversion (Vf32_View, m128);

--     Xf32 : constant Vf32_View := (1.0, 1.0, 2.0, 2.0);
--     Yf32 : constant Vf32_View := (2.0, 2.0, 1.0, 1.0);

--     X128 : constant m128 := To_m128 (Xf32);
--     Y128 : constant m128 := To_m128 (Yf32);

--  begin
--     --  Operations & overlays

--     declare
--        Z128 : m128;
--        Zf32 : Vf32_View;
--        for Zf32'Address use Z128'Address;
--     begin
--        Z128 := ia32_addps (X128, Y128);
--        if Zf32 /= (3.0, 3.0, 3.0, 3.0) then
--           raise Program_Error;
--        end if;
--     end;

--     declare
--        type m128_View_Kind is (SSE, F32);
--        type m128_Object (View : m128_View_Kind := F32) is record
--           case View is
--              when SSE  => V128 : m128;
--              when F32  => Vf32 : Vf32_View;
--           end case;
--        end record;
--        pragma Unchecked_Union (m128_Object);

--        O1 : constant m128_Object := (View => SSE, V128 => X128);
--     begin
--        if O1.Vf32 /= Xf32 then
--           raise Program_Error;
--        end if;
--     end;
--  end SSE_Base;

package GNAT.SSE is

   -----------------------------------
   -- Common vector characteristics --
   -----------------------------------

   VECTOR_BYTES : constant := 16;
   --  Common size of all the SSE vector types, in bytes.

   VECTOR_ALIGN : constant := 16;
   --  Common alignment of all the SSE vector types, in bytes.

   --  Alignment-wise, the reference document reads:
   --  << The compiler aligns __m128d and _m128i local and global data to
   --     16-byte boundaries on the stack. >>
   --
   --  We apply that consistently to all the Ada vector types, as GCC does
   --  for the corresponding C types.

   ----------------------------
   -- Vector component types --
   ----------------------------

   type Float32 is new Float;
   type Float64 is new Long_Float;
   type Integer64 is new Long_Long_Integer;

end GNAT.SSE;
