annotate gcc/ada/libgnat/s-pack36.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S Y S T E M . P A C K _ 3 6 --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with System.Storage_Elements;
kono
parents:
diff changeset
33 with System.Unsigned_Types;
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 package body System.Pack_36 is
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 subtype Bit_Order is System.Bit_Order;
kono
parents:
diff changeset
38 Reverse_Bit_Order : constant Bit_Order :=
kono
parents:
diff changeset
39 Bit_Order'Val (1 - Bit_Order'Pos (System.Default_Bit_Order));
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 subtype Ofs is System.Storage_Elements.Storage_Offset;
kono
parents:
diff changeset
42 subtype Uns is System.Unsigned_Types.Unsigned;
kono
parents:
diff changeset
43 subtype N07 is System.Unsigned_Types.Unsigned range 0 .. 7;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 use type System.Storage_Elements.Storage_Offset;
kono
parents:
diff changeset
46 use type System.Unsigned_Types.Unsigned;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 type Cluster is record
kono
parents:
diff changeset
49 E0, E1, E2, E3, E4, E5, E6, E7 : Bits_36;
kono
parents:
diff changeset
50 end record;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 for Cluster use record
kono
parents:
diff changeset
53 E0 at 0 range 0 * Bits .. 0 * Bits + Bits - 1;
kono
parents:
diff changeset
54 E1 at 0 range 1 * Bits .. 1 * Bits + Bits - 1;
kono
parents:
diff changeset
55 E2 at 0 range 2 * Bits .. 2 * Bits + Bits - 1;
kono
parents:
diff changeset
56 E3 at 0 range 3 * Bits .. 3 * Bits + Bits - 1;
kono
parents:
diff changeset
57 E4 at 0 range 4 * Bits .. 4 * Bits + Bits - 1;
kono
parents:
diff changeset
58 E5 at 0 range 5 * Bits .. 5 * Bits + Bits - 1;
kono
parents:
diff changeset
59 E6 at 0 range 6 * Bits .. 6 * Bits + Bits - 1;
kono
parents:
diff changeset
60 E7 at 0 range 7 * Bits .. 7 * Bits + Bits - 1;
kono
parents:
diff changeset
61 end record;
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 for Cluster'Size use Bits * 8;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 for Cluster'Alignment use Integer'Min (Standard'Maximum_Alignment,
kono
parents:
diff changeset
66 1 +
kono
parents:
diff changeset
67 1 * Boolean'Pos (Bits mod 2 = 0) +
kono
parents:
diff changeset
68 2 * Boolean'Pos (Bits mod 4 = 0));
kono
parents:
diff changeset
69 -- Use maximum possible alignment, given the bit field size, since this
kono
parents:
diff changeset
70 -- will result in the most efficient code possible for the field.
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 type Cluster_Ref is access Cluster;
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 type Rev_Cluster is new Cluster
kono
parents:
diff changeset
75 with Bit_Order => Reverse_Bit_Order,
kono
parents:
diff changeset
76 Scalar_Storage_Order => Reverse_Bit_Order;
kono
parents:
diff changeset
77 type Rev_Cluster_Ref is access Rev_Cluster;
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 -- The following declarations are for the case where the address
kono
parents:
diff changeset
80 -- passed to GetU_36 or SetU_36 is not guaranteed to be aligned.
kono
parents:
diff changeset
81 -- These routines are used when the packed array is itself a
kono
parents:
diff changeset
82 -- component of a packed record, and therefore may not be aligned.
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 type ClusterU is new Cluster;
kono
parents:
diff changeset
85 for ClusterU'Alignment use 1;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 type ClusterU_Ref is access ClusterU;
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 type Rev_ClusterU is new ClusterU
kono
parents:
diff changeset
90 with Bit_Order => Reverse_Bit_Order,
kono
parents:
diff changeset
91 Scalar_Storage_Order => Reverse_Bit_Order;
kono
parents:
diff changeset
92 type Rev_ClusterU_Ref is access Rev_ClusterU;
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 ------------
kono
parents:
diff changeset
95 -- Get_36 --
kono
parents:
diff changeset
96 ------------
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 function Get_36
kono
parents:
diff changeset
99 (Arr : System.Address;
kono
parents:
diff changeset
100 N : Natural;
kono
parents:
diff changeset
101 Rev_SSO : Boolean) return Bits_36
kono
parents:
diff changeset
102 is
kono
parents:
diff changeset
103 A : constant System.Address := Arr + Bits * Ofs (Uns (N) / 8);
kono
parents:
diff changeset
104 C : Cluster_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
105 RC : Rev_Cluster_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
106 begin
kono
parents:
diff changeset
107 if Rev_SSO then
kono
parents:
diff changeset
108 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
109 when 0 => return RC.E0;
kono
parents:
diff changeset
110 when 1 => return RC.E1;
kono
parents:
diff changeset
111 when 2 => return RC.E2;
kono
parents:
diff changeset
112 when 3 => return RC.E3;
kono
parents:
diff changeset
113 when 4 => return RC.E4;
kono
parents:
diff changeset
114 when 5 => return RC.E5;
kono
parents:
diff changeset
115 when 6 => return RC.E6;
kono
parents:
diff changeset
116 when 7 => return RC.E7;
kono
parents:
diff changeset
117 end case;
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 else
kono
parents:
diff changeset
120 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
121 when 0 => return C.E0;
kono
parents:
diff changeset
122 when 1 => return C.E1;
kono
parents:
diff changeset
123 when 2 => return C.E2;
kono
parents:
diff changeset
124 when 3 => return C.E3;
kono
parents:
diff changeset
125 when 4 => return C.E4;
kono
parents:
diff changeset
126 when 5 => return C.E5;
kono
parents:
diff changeset
127 when 6 => return C.E6;
kono
parents:
diff changeset
128 when 7 => return C.E7;
kono
parents:
diff changeset
129 end case;
kono
parents:
diff changeset
130 end if;
kono
parents:
diff changeset
131 end Get_36;
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 -------------
kono
parents:
diff changeset
134 -- GetU_36 --
kono
parents:
diff changeset
135 -------------
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 function GetU_36
kono
parents:
diff changeset
138 (Arr : System.Address;
kono
parents:
diff changeset
139 N : Natural;
kono
parents:
diff changeset
140 Rev_SSO : Boolean) return Bits_36
kono
parents:
diff changeset
141 is
kono
parents:
diff changeset
142 A : constant System.Address := Arr + Bits * Ofs (Uns (N) / 8);
kono
parents:
diff changeset
143 C : ClusterU_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
144 RC : Rev_ClusterU_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
145 begin
kono
parents:
diff changeset
146 if Rev_SSO then
kono
parents:
diff changeset
147 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
148 when 0 => return RC.E0;
kono
parents:
diff changeset
149 when 1 => return RC.E1;
kono
parents:
diff changeset
150 when 2 => return RC.E2;
kono
parents:
diff changeset
151 when 3 => return RC.E3;
kono
parents:
diff changeset
152 when 4 => return RC.E4;
kono
parents:
diff changeset
153 when 5 => return RC.E5;
kono
parents:
diff changeset
154 when 6 => return RC.E6;
kono
parents:
diff changeset
155 when 7 => return RC.E7;
kono
parents:
diff changeset
156 end case;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 else
kono
parents:
diff changeset
159 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
160 when 0 => return C.E0;
kono
parents:
diff changeset
161 when 1 => return C.E1;
kono
parents:
diff changeset
162 when 2 => return C.E2;
kono
parents:
diff changeset
163 when 3 => return C.E3;
kono
parents:
diff changeset
164 when 4 => return C.E4;
kono
parents:
diff changeset
165 when 5 => return C.E5;
kono
parents:
diff changeset
166 when 6 => return C.E6;
kono
parents:
diff changeset
167 when 7 => return C.E7;
kono
parents:
diff changeset
168 end case;
kono
parents:
diff changeset
169 end if;
kono
parents:
diff changeset
170 end GetU_36;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 ------------
kono
parents:
diff changeset
173 -- Set_36 --
kono
parents:
diff changeset
174 ------------
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 procedure Set_36
kono
parents:
diff changeset
177 (Arr : System.Address;
kono
parents:
diff changeset
178 N : Natural;
kono
parents:
diff changeset
179 E : Bits_36;
kono
parents:
diff changeset
180 Rev_SSO : Boolean)
kono
parents:
diff changeset
181 is
kono
parents:
diff changeset
182 A : constant System.Address := Arr + Bits * Ofs (Uns (N) / 8);
kono
parents:
diff changeset
183 C : Cluster_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
184 RC : Rev_Cluster_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
185 begin
kono
parents:
diff changeset
186 if Rev_SSO then
kono
parents:
diff changeset
187 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
188 when 0 => RC.E0 := E;
kono
parents:
diff changeset
189 when 1 => RC.E1 := E;
kono
parents:
diff changeset
190 when 2 => RC.E2 := E;
kono
parents:
diff changeset
191 when 3 => RC.E3 := E;
kono
parents:
diff changeset
192 when 4 => RC.E4 := E;
kono
parents:
diff changeset
193 when 5 => RC.E5 := E;
kono
parents:
diff changeset
194 when 6 => RC.E6 := E;
kono
parents:
diff changeset
195 when 7 => RC.E7 := E;
kono
parents:
diff changeset
196 end case;
kono
parents:
diff changeset
197 else
kono
parents:
diff changeset
198 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
199 when 0 => C.E0 := E;
kono
parents:
diff changeset
200 when 1 => C.E1 := E;
kono
parents:
diff changeset
201 when 2 => C.E2 := E;
kono
parents:
diff changeset
202 when 3 => C.E3 := E;
kono
parents:
diff changeset
203 when 4 => C.E4 := E;
kono
parents:
diff changeset
204 when 5 => C.E5 := E;
kono
parents:
diff changeset
205 when 6 => C.E6 := E;
kono
parents:
diff changeset
206 when 7 => C.E7 := E;
kono
parents:
diff changeset
207 end case;
kono
parents:
diff changeset
208 end if;
kono
parents:
diff changeset
209 end Set_36;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 -------------
kono
parents:
diff changeset
212 -- SetU_36 --
kono
parents:
diff changeset
213 -------------
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 procedure SetU_36
kono
parents:
diff changeset
216 (Arr : System.Address;
kono
parents:
diff changeset
217 N : Natural;
kono
parents:
diff changeset
218 E : Bits_36;
kono
parents:
diff changeset
219 Rev_SSO : Boolean)
kono
parents:
diff changeset
220 is
kono
parents:
diff changeset
221 A : constant System.Address := Arr + Bits * Ofs (Uns (N) / 8);
kono
parents:
diff changeset
222 C : ClusterU_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
223 RC : Rev_ClusterU_Ref with Address => A'Address, Import;
kono
parents:
diff changeset
224 begin
kono
parents:
diff changeset
225 if Rev_SSO then
kono
parents:
diff changeset
226 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
227 when 0 => RC.E0 := E;
kono
parents:
diff changeset
228 when 1 => RC.E1 := E;
kono
parents:
diff changeset
229 when 2 => RC.E2 := E;
kono
parents:
diff changeset
230 when 3 => RC.E3 := E;
kono
parents:
diff changeset
231 when 4 => RC.E4 := E;
kono
parents:
diff changeset
232 when 5 => RC.E5 := E;
kono
parents:
diff changeset
233 when 6 => RC.E6 := E;
kono
parents:
diff changeset
234 when 7 => RC.E7 := E;
kono
parents:
diff changeset
235 end case;
kono
parents:
diff changeset
236 else
kono
parents:
diff changeset
237 case N07 (Uns (N) mod 8) is
kono
parents:
diff changeset
238 when 0 => C.E0 := E;
kono
parents:
diff changeset
239 when 1 => C.E1 := E;
kono
parents:
diff changeset
240 when 2 => C.E2 := E;
kono
parents:
diff changeset
241 when 3 => C.E3 := E;
kono
parents:
diff changeset
242 when 4 => C.E4 := E;
kono
parents:
diff changeset
243 when 5 => C.E5 := E;
kono
parents:
diff changeset
244 when 6 => C.E6 := E;
kono
parents:
diff changeset
245 when 7 => C.E7 := E;
kono
parents:
diff changeset
246 end case;
kono
parents:
diff changeset
247 end if;
kono
parents:
diff changeset
248 end SetU_36;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 end System.Pack_36;