-- { dg-do run { target i?86-*-* x86_64-*-* } } -- { dg-options "-O1 -msse" } -- { dg-require-effective-target sse_runtime } with Ada.Unchecked_Conversion; procedure SSE_Nolib is -- Base vector type definitions package SSE_Types is VECTOR_ALIGN : constant := 16; VECTOR_BYTES : constant := 16; type m128 is private; private type m128 is array (1 .. 4) of Float; for m128'Alignment use VECTOR_ALIGN; pragma Machine_Attribute (m128, "vector_type"); pragma Machine_Attribute (m128, "may_alias"); end SSE_Types; use SSE_Types; -- Core operations function mm_add_ss (A, B : m128) return m128; pragma Import (Intrinsic, mm_add_ss, "__builtin_ia32_addss"); -- User views / conversions or overlays type Vf32_View is array (1 .. 4) of Float; for Vf32_View'Alignment use VECTOR_ALIGN; function To_m128 is new Ada.Unchecked_Conversion (Vf32_View, m128); function To_m128 is new Ada.Unchecked_Conversion (m128, Vf32_View); X, Y, Z : M128; Vz : Vf32_View; for Vz'Address use Z'Address; begin X := To_m128 ((1.0, 1.0, 2.0, 2.0)); Y := To_m128 ((2.0, 2.0, 1.0, 1.0)); Z := mm_add_ss (X, Y); if Vz /= (3.0, 1.0, 2.0, 2.0) then raise Program_Error; end if; end SSE_Nolib;