summaryrefslogtreecommitdiff
path: root/gcc/ada/g-sse.ads
blob: 60d3577ad41633896dc62faba6f7bbb912d77de2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             G N A T . S S E                              --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2009-2012, 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;