aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/ada/g-altcon.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/ada/g-altcon.adb')
-rw-r--r--gcc-4.9/gcc/ada/g-altcon.adb514
1 files changed, 514 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/ada/g-altcon.adb b/gcc-4.9/gcc/ada/g-altcon.adb
new file mode 100644
index 000000000..edd6c9847
--- /dev/null
+++ b/gcc-4.9/gcc/ada/g-altcon.adb
@@ -0,0 +1,514 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- G N A T . A L T I V E C . C O N V E R S I O N S --
+-- --
+-- B o d y --
+-- --
+-- Copyright (C) 2005-2009, 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. --
+-- --
+------------------------------------------------------------------------------
+
+with Ada.Unchecked_Conversion;
+
+with System; use System;
+
+package body GNAT.Altivec.Conversions is
+
+ -- All the vector/view conversions operate similarly: bare unchecked
+ -- conversion on big endian targets, and elements permutation on little
+ -- endian targets. We call "Mirroring" the elements permutation process.
+
+ -- We would like to provide a generic version of the conversion routines
+ -- and just have a set of "renaming as body" declarations to satisfy the
+ -- public interface. This unfortunately prevents inlining, which we must
+ -- preserve at least for the hard binding.
+
+ -- We instead provide a generic version of facilities needed by all the
+ -- conversion routines and use them repeatedly.
+
+ generic
+ type Vitem_Type is private;
+
+ type Varray_Index_Type is range <>;
+ type Varray_Type is array (Varray_Index_Type) of Vitem_Type;
+
+ type Vector_Type is private;
+ type View_Type is private;
+
+ package Generic_Conversions is
+
+ subtype Varray is Varray_Type;
+ -- This provides an easy common way to refer to the type parameter
+ -- in contexts where a specific instance of this package is "use"d.
+
+ procedure Mirror (A : Varray_Type; Into : out Varray_Type);
+ pragma Inline (Mirror);
+ -- Mirror the elements of A into INTO, not touching the per-element
+ -- internal ordering.
+
+ -- A procedure with an out parameter is a bit heavier to use than a
+ -- function but reduces the amount of temporary creations around the
+ -- call. Instances are typically not front-end inlined. They can still
+ -- be back-end inlined on request with the proper command-line option.
+
+ -- Below are Unchecked Conversion routines for various purposes,
+ -- relying on internal knowledge about the bits layout in the different
+ -- types (all 128 value bits blocks).
+
+ -- View<->Vector straight bitwise conversions on BE targets
+
+ function UNC_To_Vector is
+ new Ada.Unchecked_Conversion (View_Type, Vector_Type);
+
+ function UNC_To_View is
+ new Ada.Unchecked_Conversion (Vector_Type, View_Type);
+
+ -- Varray->Vector/View for returning mirrored results on LE targets
+
+ function UNC_To_Vector is
+ new Ada.Unchecked_Conversion (Varray_Type, Vector_Type);
+
+ function UNC_To_View is
+ new Ada.Unchecked_Conversion (Varray_Type, View_Type);
+
+ -- Vector/View->Varray for to-be-permuted source on LE targets
+
+ function UNC_To_Varray is
+ new Ada.Unchecked_Conversion (Vector_Type, Varray_Type);
+
+ function UNC_To_Varray is
+ new Ada.Unchecked_Conversion (View_Type, Varray_Type);
+
+ end Generic_Conversions;
+
+ package body Generic_Conversions is
+
+ procedure Mirror (A : Varray_Type; Into : out Varray_Type) is
+ begin
+ for J in A'Range loop
+ Into (J) := A (A'Last - J + A'First);
+ end loop;
+ end Mirror;
+
+ end Generic_Conversions;
+
+ -- Now we declare the instances and implement the interface function
+ -- bodies simply calling the instantiated routines.
+
+ ---------------------
+ -- Char components --
+ ---------------------
+
+ package SC_Conversions is new Generic_Conversions
+ (signed_char, Vchar_Range, Varray_signed_char, VSC, VSC_View);
+
+ function To_Vector (S : VSC_View) return VSC is
+ use SC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VSC) return VSC_View is
+ use SC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package UC_Conversions is new Generic_Conversions
+ (unsigned_char, Vchar_Range, Varray_unsigned_char, VUC, VUC_View);
+
+ function To_Vector (S : VUC_View) return VUC is
+ use UC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VUC) return VUC_View is
+ use UC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package BC_Conversions is new Generic_Conversions
+ (bool_char, Vchar_Range, Varray_bool_char, VBC, VBC_View);
+
+ function To_Vector (S : VBC_View) return VBC is
+ use BC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VBC) return VBC_View is
+ use BC_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ ----------------------
+ -- Short components --
+ ----------------------
+
+ package SS_Conversions is new Generic_Conversions
+ (signed_short, Vshort_Range, Varray_signed_short, VSS, VSS_View);
+
+ function To_Vector (S : VSS_View) return VSS is
+ use SS_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VSS) return VSS_View is
+ use SS_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package US_Conversions is new Generic_Conversions
+ (unsigned_short, Vshort_Range, Varray_unsigned_short, VUS, VUS_View);
+
+ function To_Vector (S : VUS_View) return VUS is
+ use US_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VUS) return VUS_View is
+ use US_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package BS_Conversions is new Generic_Conversions
+ (bool_short, Vshort_Range, Varray_bool_short, VBS, VBS_View);
+
+ function To_Vector (S : VBS_View) return VBS is
+ use BS_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VBS) return VBS_View is
+ use BS_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --------------------
+ -- Int components --
+ --------------------
+
+ package SI_Conversions is new Generic_Conversions
+ (signed_int, Vint_Range, Varray_signed_int, VSI, VSI_View);
+
+ function To_Vector (S : VSI_View) return VSI is
+ use SI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VSI) return VSI_View is
+ use SI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package UI_Conversions is new Generic_Conversions
+ (unsigned_int, Vint_Range, Varray_unsigned_int, VUI, VUI_View);
+
+ function To_Vector (S : VUI_View) return VUI is
+ use UI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VUI) return VUI_View is
+ use UI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ --
+
+ package BI_Conversions is new Generic_Conversions
+ (bool_int, Vint_Range, Varray_bool_int, VBI, VBI_View);
+
+ function To_Vector (S : VBI_View) return VBI is
+ use BI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VBI) return VBI_View is
+ use BI_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ ----------------------
+ -- Float components --
+ ----------------------
+
+ package F_Conversions is new Generic_Conversions
+ (C_float, Vfloat_Range, Varray_float, VF, VF_View);
+
+ function To_Vector (S : VF_View) return VF is
+ use F_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VF) return VF_View is
+ use F_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+ ----------------------
+ -- Pixel components --
+ ----------------------
+
+ package P_Conversions is new Generic_Conversions
+ (pixel, Vpixel_Range, Varray_pixel, VP, VP_View);
+
+ function To_Vector (S : VP_View) return VP is
+ use P_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_Vector (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_Vector (M);
+ end;
+ end if;
+ end To_Vector;
+
+ function To_View (S : VP) return VP_View is
+ use P_Conversions;
+ begin
+ if Default_Bit_Order = High_Order_First then
+ return UNC_To_View (S);
+ else
+ declare
+ M : Varray;
+ begin
+ Mirror (UNC_To_Varray (S), Into => M);
+ return UNC_To_View (M);
+ end;
+ end if;
+ end To_View;
+
+end GNAT.Altivec.Conversions;