[Ada] Warn on import of parent package
[official-gcc.git] / gcc / ada / libgnat / s-bitops.adb
blobdeea7e8c5f64eff4091175497cf10542d7b79578
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
4 -- --
5 -- S Y S T E M . B I T _ O P S --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1996-2021, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
17 -- --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
32 with System.Unsigned_Types; use System.Unsigned_Types;
34 with Ada.Exceptions; use Ada.Exceptions;
35 with Ada.Unchecked_Conversion;
37 package body System.Bit_Ops is
39 subtype Bits_Array is System.Unsigned_Types.Packed_Bytes1 (Positive);
40 -- Dummy array type used to interpret the address values. We use the
41 -- unaligned version always, since this will handle both the aligned and
42 -- unaligned cases, and we always do these operations by bytes anyway.
43 -- Note: we use a ones origin array here so that the computations of the
44 -- length in bytes work correctly (give a non-negative value) for the
45 -- case of zero length bit strings). Note that we never allocate any
46 -- objects of this type (we can't because they would be absurdly big).
48 type Bits is access Bits_Array;
49 -- This is the actual type into which address values are converted
51 function To_Bits is new Ada.Unchecked_Conversion (Address, Bits);
53 LE : constant := Standard'Default_Bit_Order;
54 -- Static constant set to 0 for big-endian, 1 for little-endian
56 -- The following is an array of masks used to mask the final byte, either
57 -- at the high end (big-endian case) or the low end (little-endian case).
59 Masks : constant array (1 .. 7) of Packed_Byte := [
60 (1 - LE) * 2#1000_0000# + LE * 2#0000_0001#,
61 (1 - LE) * 2#1100_0000# + LE * 2#0000_0011#,
62 (1 - LE) * 2#1110_0000# + LE * 2#0000_0111#,
63 (1 - LE) * 2#1111_0000# + LE * 2#0000_1111#,
64 (1 - LE) * 2#1111_1000# + LE * 2#0001_1111#,
65 (1 - LE) * 2#1111_1100# + LE * 2#0011_1111#,
66 (1 - LE) * 2#1111_1110# + LE * 2#0111_1111#];
68 -----------------------
69 -- Local Subprograms --
70 -----------------------
72 procedure Raise_Error;
73 pragma No_Return (Raise_Error);
74 -- Raise Constraint_Error, complaining about unequal lengths
76 -------------
77 -- Bit_And --
78 -------------
80 procedure Bit_And
81 (Left : Address;
82 Llen : Natural;
83 Right : Address;
84 Rlen : Natural;
85 Result : Address)
87 LeftB : constant Bits := To_Bits (Left);
88 RightB : constant Bits := To_Bits (Right);
89 ResultB : constant Bits := To_Bits (Result);
91 begin
92 if Llen /= Rlen then
93 Raise_Error;
94 end if;
96 for J in 1 .. (Rlen + 7) / 8 loop
97 ResultB (J) := LeftB (J) and RightB (J);
98 end loop;
99 end Bit_And;
101 ------------
102 -- Bit_Eq --
103 ------------
105 function Bit_Eq
106 (Left : Address;
107 Llen : Natural;
108 Right : Address;
109 Rlen : Natural) return Boolean
111 LeftB : constant Bits := To_Bits (Left);
112 RightB : constant Bits := To_Bits (Right);
114 begin
115 if Llen /= Rlen then
116 return False;
118 else
119 declare
120 BLen : constant Natural := Llen / 8;
121 Bitc : constant Natural := Llen mod 8;
123 begin
124 if LeftB (1 .. BLen) /= RightB (1 .. BLen) then
125 return False;
127 elsif Bitc /= 0 then
128 return
129 ((LeftB (BLen + 1) xor RightB (BLen + 1))
130 and Masks (Bitc)) = 0;
132 else -- Bitc = 0
133 return True;
134 end if;
135 end;
136 end if;
137 end Bit_Eq;
139 -------------
140 -- Bit_Not --
141 -------------
143 procedure Bit_Not
144 (Opnd : System.Address;
145 Len : Natural;
146 Result : System.Address)
148 OpndB : constant Bits := To_Bits (Opnd);
149 ResultB : constant Bits := To_Bits (Result);
151 begin
152 for J in 1 .. (Len + 7) / 8 loop
153 ResultB (J) := not OpndB (J);
154 end loop;
155 end Bit_Not;
157 ------------
158 -- Bit_Or --
159 ------------
161 procedure Bit_Or
162 (Left : Address;
163 Llen : Natural;
164 Right : Address;
165 Rlen : Natural;
166 Result : Address)
168 LeftB : constant Bits := To_Bits (Left);
169 RightB : constant Bits := To_Bits (Right);
170 ResultB : constant Bits := To_Bits (Result);
172 begin
173 if Llen /= Rlen then
174 Raise_Error;
175 end if;
177 for J in 1 .. (Rlen + 7) / 8 loop
178 ResultB (J) := LeftB (J) or RightB (J);
179 end loop;
180 end Bit_Or;
182 -------------
183 -- Bit_Xor --
184 -------------
186 procedure Bit_Xor
187 (Left : Address;
188 Llen : Natural;
189 Right : Address;
190 Rlen : Natural;
191 Result : Address)
193 LeftB : constant Bits := To_Bits (Left);
194 RightB : constant Bits := To_Bits (Right);
195 ResultB : constant Bits := To_Bits (Result);
197 begin
198 if Llen /= Rlen then
199 Raise_Error;
200 end if;
202 for J in 1 .. (Rlen + 7) / 8 loop
203 ResultB (J) := LeftB (J) xor RightB (J);
204 end loop;
205 end Bit_Xor;
207 -----------------
208 -- Raise_Error --
209 -----------------
211 procedure Raise_Error is
212 begin
213 Raise_Exception
214 (Constraint_Error'Identity, "operand lengths are unequal");
215 end Raise_Error;
217 end System.Bit_Ops;