OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [ada/] [s-bitops.adb] - Blame information for rev 445

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 281 jeremybenn
------------------------------------------------------------------------------
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-2009, 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
------------------------------------------------------------------------------
31
 
32
pragma Compiler_Unit;
33
 
34
with System;                 use System;
35
with System.Unsigned_Types;  use System.Unsigned_Types;
36
 
37
with Ada.Unchecked_Conversion;
38
 
39
package body System.Bit_Ops is
40
 
41
   subtype Bits_Array is System.Unsigned_Types.Packed_Bytes1 (Positive);
42
   --  Dummy array type used to interpret the address values. We use the
43
   --  unaligned version always, since this will handle both the aligned and
44
   --  unaligned cases, and we always do these operations by bytes anyway.
45
   --  Note: we use a ones origin array here so that the computations of the
46
   --  length in bytes work correctly (give a non-negative value) for the
47
   --  case of zero length bit strings). Note that we never allocate any
48
   --  objects of this type (we can't because they would be absurdly big).
49
 
50
   type Bits is access Bits_Array;
51
   --  This is the actual type into which address values are converted
52
 
53
   function To_Bits is new Ada.Unchecked_Conversion (Address, Bits);
54
 
55
   LE : constant := Standard'Default_Bit_Order;
56
   --  Static constant set to 0 for big-endian, 1 for little-endian
57
 
58
   --  The following is an array of masks used to mask the final byte, either
59
   --  at the high end (big-endian case) or the low end (little-endian case).
60
 
61
   Masks : constant array (1 .. 7) of Packed_Byte := (
62
     (1 - LE) * 2#1000_0000# + LE * 2#0000_0001#,
63
     (1 - LE) * 2#1100_0000# + LE * 2#0000_0011#,
64
     (1 - LE) * 2#1110_0000# + LE * 2#0000_0111#,
65
     (1 - LE) * 2#1111_0000# + LE * 2#0000_1111#,
66
     (1 - LE) * 2#1111_1000# + LE * 2#0001_1111#,
67
     (1 - LE) * 2#1111_1100# + LE * 2#0011_1111#,
68
     (1 - LE) * 2#1111_1110# + LE * 2#0111_1111#);
69
 
70
   -----------------------
71
   -- Local Subprograms --
72
   -----------------------
73
 
74
   procedure Raise_Error;
75
   --  Raise Constraint_Error, complaining about unequal lengths
76
 
77
   -------------
78
   -- Bit_And --
79
   -------------
80
 
81
   procedure Bit_And
82
     (Left   : Address;
83
      Llen   : Natural;
84
      Right  : Address;
85
      Rlen   : Natural;
86
      Result : Address)
87
   is
88
      LeftB   : constant Bits := To_Bits (Left);
89
      RightB  : constant Bits := To_Bits (Right);
90
      ResultB : constant Bits := To_Bits (Result);
91
 
92
   begin
93
      if Llen /= Rlen then
94
         Raise_Error;
95
      end if;
96
 
97
      for J in 1 .. (Rlen + 7) / 8 loop
98
         ResultB (J) := LeftB (J) and RightB (J);
99
      end loop;
100
   end Bit_And;
101
 
102
   ------------
103
   -- Bit_Eq --
104
   ------------
105
 
106
   function Bit_Eq
107
     (Left  : Address;
108
      Llen  : Natural;
109
      Right : Address;
110
      Rlen  : Natural) return Boolean
111
   is
112
      LeftB  : constant Bits := To_Bits (Left);
113
      RightB : constant Bits := To_Bits (Right);
114
 
115
   begin
116
      if Llen /= Rlen then
117
         return False;
118
 
119
      else
120
         declare
121
            BLen : constant Natural := Llen / 8;
122
            Bitc : constant Natural := Llen mod 8;
123
 
124
         begin
125
            if LeftB (1 .. BLen) /= RightB (1 .. BLen) then
126
               return False;
127
 
128
            elsif Bitc /= 0 then
129
               return
130
                 ((LeftB (BLen + 1) xor RightB (BLen + 1))
131
                   and Masks (Bitc)) = 0;
132
 
133
            else -- Bitc = 0
134
               return True;
135
            end if;
136
         end;
137
      end if;
138
   end Bit_Eq;
139
 
140
   -------------
141
   -- Bit_Not --
142
   -------------
143
 
144
   procedure Bit_Not
145
     (Opnd   : System.Address;
146
      Len    : Natural;
147
      Result : System.Address)
148
   is
149
      OpndB   : constant Bits := To_Bits (Opnd);
150
      ResultB : constant Bits := To_Bits (Result);
151
 
152
   begin
153
      for J in 1 .. (Len + 7) / 8 loop
154
         ResultB (J) := not OpndB (J);
155
      end loop;
156
   end Bit_Not;
157
 
158
   ------------
159
   -- Bit_Or --
160
   ------------
161
 
162
   procedure Bit_Or
163
     (Left   : Address;
164
      Llen   : Natural;
165
      Right  : Address;
166
      Rlen   : Natural;
167
      Result : Address)
168
   is
169
      LeftB   : constant Bits := To_Bits (Left);
170
      RightB  : constant Bits := To_Bits (Right);
171
      ResultB : constant Bits := To_Bits (Result);
172
 
173
   begin
174
      if Llen /= Rlen then
175
         Raise_Error;
176
      end if;
177
 
178
      for J in 1 .. (Rlen + 7) / 8 loop
179
         ResultB (J) := LeftB (J) or RightB (J);
180
      end loop;
181
   end Bit_Or;
182
 
183
   -------------
184
   -- Bit_Xor --
185
   -------------
186
 
187
   procedure Bit_Xor
188
     (Left   : Address;
189
      Llen   : Natural;
190
      Right  : Address;
191
      Rlen   : Natural;
192
      Result : Address)
193
   is
194
      LeftB   : constant Bits := To_Bits (Left);
195
      RightB  : constant Bits := To_Bits (Right);
196
      ResultB : constant Bits := To_Bits (Result);
197
 
198
   begin
199
      if Llen /= Rlen then
200
         Raise_Error;
201
      end if;
202
 
203
      for J in 1 .. (Rlen + 7) / 8 loop
204
         ResultB (J) := LeftB (J) xor RightB (J);
205
      end loop;
206
   end Bit_Xor;
207
 
208
   -----------------
209
   -- Raise_Error --
210
   -----------------
211
 
212
   procedure Raise_Error is
213
   begin
214
      raise Constraint_Error;
215
   end Raise_Error;
216
 
217
end System.Bit_Ops;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.