annotate gcc/ada/libgnat/s-scaval.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 . S C A L A R _ V A L U E S --
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) 2003-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 Ada.Unchecked_Conversion;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 package body System.Scalar_Values is
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 ----------------
kono
parents:
diff changeset
37 -- Initialize --
kono
parents:
diff changeset
38 ----------------
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 procedure Initialize (Mode1 : Character; Mode2 : Character) is
kono
parents:
diff changeset
41 C1 : Character := Mode1;
kono
parents:
diff changeset
42 C2 : Character := Mode2;
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 procedure Get_Env_Value_Ptr (Name, Length, Ptr : Address);
kono
parents:
diff changeset
45 pragma Import (C, Get_Env_Value_Ptr, "__gnat_getenv");
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 subtype String2 is String (1 .. 2);
kono
parents:
diff changeset
48 type String2_Ptr is access all String2;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 Env_Value_Ptr : aliased String2_Ptr;
kono
parents:
diff changeset
51 Env_Value_Length : aliased Integer;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 EV_Val : aliased constant String :=
kono
parents:
diff changeset
54 "GNAT_INIT_SCALARS" & ASCII.NUL;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 B : Byte1;
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 EFloat : constant Boolean := Long_Long_Float'Size > Long_Float'Size;
kono
parents:
diff changeset
59 -- Set True if we are on an x86 with 96-bit floats for extended
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 AFloat : constant Boolean :=
kono
parents:
diff changeset
62 Long_Float'Size = 48 and then Long_Long_Float'Size = 48;
kono
parents:
diff changeset
63 -- Set True if we are on an AAMP with 48-bit extended floating point
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 type ByteLF is array (0 .. 7 - 2 * Boolean'Pos (AFloat)) of Byte1;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 for ByteLF'Component_Size use 8;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 -- Type used to hold Long_Float values on all targets and to initialize
kono
parents:
diff changeset
70 -- 48-bit Long_Float values used on AAMP. On AAMP, this type is 6 bytes.
kono
parents:
diff changeset
71 -- On other targets the type is 8 bytes, and type Byte8 is used for
kono
parents:
diff changeset
72 -- values that are then converted to ByteLF.
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 pragma Warnings (Off); -- why ???
kono
parents:
diff changeset
75 function To_ByteLF is new Ada.Unchecked_Conversion (Byte8, ByteLF);
kono
parents:
diff changeset
76 pragma Warnings (On);
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 type ByteLLF is
kono
parents:
diff changeset
79 array (0 .. 7 + 4 * Boolean'Pos (EFloat) - 2 * Boolean'Pos (AFloat))
kono
parents:
diff changeset
80 of Byte1;
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 for ByteLLF'Component_Size use 8;
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 -- Type used to initialize Long_Long_Float values used on x86 and
kono
parents:
diff changeset
85 -- any other target with the same 80-bit floating-point values that
kono
parents:
diff changeset
86 -- GCC always stores in 96-bits. Note that we are assuming Intel
kono
parents:
diff changeset
87 -- format little-endian addressing for this type. On non-Intel
kono
parents:
diff changeset
88 -- architectures, this is the same length as Byte8 and holds
kono
parents:
diff changeset
89 -- a Long_Float value.
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 -- The following variables are used to initialize the float values
kono
parents:
diff changeset
92 -- by overlay. We can't assign directly to the float values, since
kono
parents:
diff changeset
93 -- we may be assigning signalling Nan's that will cause a trap if
kono
parents:
diff changeset
94 -- loaded into a floating-point register.
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 IV_Isf : aliased Byte4; -- Initialize short float
kono
parents:
diff changeset
97 IV_Ifl : aliased Byte4; -- Initialize float
kono
parents:
diff changeset
98 IV_Ilf : aliased ByteLF; -- Initialize long float
kono
parents:
diff changeset
99 IV_Ill : aliased ByteLLF; -- Initialize long long float
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 for IV_Isf'Address use IS_Isf'Address;
kono
parents:
diff changeset
102 for IV_Ifl'Address use IS_Ifl'Address;
kono
parents:
diff changeset
103 for IV_Ilf'Address use IS_Ilf'Address;
kono
parents:
diff changeset
104 for IV_Ill'Address use IS_Ill'Address;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 -- The following pragmas are used to suppress initialization
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 pragma Import (Ada, IV_Isf);
kono
parents:
diff changeset
109 pragma Import (Ada, IV_Ifl);
kono
parents:
diff changeset
110 pragma Import (Ada, IV_Ilf);
kono
parents:
diff changeset
111 pragma Import (Ada, IV_Ill);
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 begin
kono
parents:
diff changeset
114 -- Acquire environment variable value if necessary
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 if C1 = 'E' and then C2 = 'V' then
kono
parents:
diff changeset
117 Get_Env_Value_Ptr
kono
parents:
diff changeset
118 (EV_Val'Address, Env_Value_Length'Address, Env_Value_Ptr'Address);
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 -- Ignore if length is not 2
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 if Env_Value_Length /= 2 then
kono
parents:
diff changeset
123 C1 := 'I';
kono
parents:
diff changeset
124 C2 := 'N';
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 -- Length is 2, see if it is a valid value
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 else
kono
parents:
diff changeset
129 -- Acquire two characters and fold to upper case
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 C1 := Env_Value_Ptr (1);
kono
parents:
diff changeset
132 C2 := Env_Value_Ptr (2);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 if C1 in 'a' .. 'z' then
kono
parents:
diff changeset
135 C1 := Character'Val (Character'Pos (C1) - 32);
kono
parents:
diff changeset
136 end if;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 if C2 in 'a' .. 'z' then
kono
parents:
diff changeset
139 C2 := Character'Val (Character'Pos (C2) - 32);
kono
parents:
diff changeset
140 end if;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 -- IN/LO/HI are ok values
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 if (C1 = 'I' and then C2 = 'N')
kono
parents:
diff changeset
145 or else
kono
parents:
diff changeset
146 (C1 = 'L' and then C2 = 'O')
kono
parents:
diff changeset
147 or else
kono
parents:
diff changeset
148 (C1 = 'H' and then C2 = 'I')
kono
parents:
diff changeset
149 then
kono
parents:
diff changeset
150 null;
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 -- Try for valid hex digits
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 elsif (C1 in '0' .. '9' or else C1 in 'A' .. 'Z')
kono
parents:
diff changeset
155 or else
kono
parents:
diff changeset
156 (C2 in '0' .. '9' or else C2 in 'A' .. 'Z')
kono
parents:
diff changeset
157 then
kono
parents:
diff changeset
158 null;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 -- Otherwise environment value is bad, ignore and use IN (invalid)
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 else
kono
parents:
diff changeset
163 C1 := 'I';
kono
parents:
diff changeset
164 C2 := 'N';
kono
parents:
diff changeset
165 end if;
kono
parents:
diff changeset
166 end if;
kono
parents:
diff changeset
167 end if;
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 -- IN (invalid value)
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 if C1 = 'I' and then C2 = 'N' then
kono
parents:
diff changeset
172 IS_Is1 := 16#80#;
kono
parents:
diff changeset
173 IS_Is2 := 16#8000#;
kono
parents:
diff changeset
174 IS_Is4 := 16#8000_0000#;
kono
parents:
diff changeset
175 IS_Is8 := 16#8000_0000_0000_0000#;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 IS_Iu1 := 16#FF#;
kono
parents:
diff changeset
178 IS_Iu2 := 16#FFFF#;
kono
parents:
diff changeset
179 IS_Iu4 := 16#FFFF_FFFF#;
kono
parents:
diff changeset
180 IS_Iu8 := 16#FFFF_FFFF_FFFF_FFFF#;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 IS_Iz1 := 16#00#;
kono
parents:
diff changeset
183 IS_Iz2 := 16#0000#;
kono
parents:
diff changeset
184 IS_Iz4 := 16#0000_0000#;
kono
parents:
diff changeset
185 IS_Iz8 := 16#0000_0000_0000_0000#;
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 if AFloat then
kono
parents:
diff changeset
188 IV_Isf := 16#FFFF_FF00#;
kono
parents:
diff changeset
189 IV_Ifl := 16#FFFF_FF00#;
kono
parents:
diff changeset
190 IV_Ilf := (0, 16#FF#, 16#FF#, 16#FF#, 16#FF#, 16#FF#);
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 else
kono
parents:
diff changeset
193 IV_Isf := IS_Iu4;
kono
parents:
diff changeset
194 IV_Ifl := IS_Iu4;
kono
parents:
diff changeset
195 IV_Ilf := To_ByteLF (IS_Iu8);
kono
parents:
diff changeset
196 end if;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 if EFloat then
kono
parents:
diff changeset
199 IV_Ill := (0, 0, 0, 0, 0, 0, 0, 16#C0#, 16#FF#, 16#FF#, 0, 0);
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 -- LO (Low values)
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 elsif C1 = 'L' and then C2 = 'O' then
kono
parents:
diff changeset
205 IS_Is1 := 16#80#;
kono
parents:
diff changeset
206 IS_Is2 := 16#8000#;
kono
parents:
diff changeset
207 IS_Is4 := 16#8000_0000#;
kono
parents:
diff changeset
208 IS_Is8 := 16#8000_0000_0000_0000#;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 IS_Iu1 := 16#00#;
kono
parents:
diff changeset
211 IS_Iu2 := 16#0000#;
kono
parents:
diff changeset
212 IS_Iu4 := 16#0000_0000#;
kono
parents:
diff changeset
213 IS_Iu8 := 16#0000_0000_0000_0000#;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 IS_Iz1 := 16#00#;
kono
parents:
diff changeset
216 IS_Iz2 := 16#0000#;
kono
parents:
diff changeset
217 IS_Iz4 := 16#0000_0000#;
kono
parents:
diff changeset
218 IS_Iz8 := 16#0000_0000_0000_0000#;
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 if AFloat then
kono
parents:
diff changeset
221 IV_Isf := 16#0000_0001#;
kono
parents:
diff changeset
222 IV_Ifl := 16#0000_0001#;
kono
parents:
diff changeset
223 IV_Ilf := (1, 0, 0, 0, 0, 0);
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 else
kono
parents:
diff changeset
226 IV_Isf := 16#FF80_0000#;
kono
parents:
diff changeset
227 IV_Ifl := 16#FF80_0000#;
kono
parents:
diff changeset
228 IV_Ilf := To_ByteLF (16#FFF0_0000_0000_0000#);
kono
parents:
diff changeset
229 end if;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 if EFloat then
kono
parents:
diff changeset
232 IV_Ill := (0, 0, 0, 0, 0, 0, 0, 16#80#, 16#FF#, 16#FF#, 0, 0);
kono
parents:
diff changeset
233 end if;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 -- HI (High values)
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 elsif C1 = 'H' and then C2 = 'I' then
kono
parents:
diff changeset
238 IS_Is1 := 16#7F#;
kono
parents:
diff changeset
239 IS_Is2 := 16#7FFF#;
kono
parents:
diff changeset
240 IS_Is4 := 16#7FFF_FFFF#;
kono
parents:
diff changeset
241 IS_Is8 := 16#7FFF_FFFF_FFFF_FFFF#;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 IS_Iu1 := 16#FF#;
kono
parents:
diff changeset
244 IS_Iu2 := 16#FFFF#;
kono
parents:
diff changeset
245 IS_Iu4 := 16#FFFF_FFFF#;
kono
parents:
diff changeset
246 IS_Iu8 := 16#FFFF_FFFF_FFFF_FFFF#;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 IS_Iz1 := 16#FF#;
kono
parents:
diff changeset
249 IS_Iz2 := 16#FFFF#;
kono
parents:
diff changeset
250 IS_Iz4 := 16#FFFF_FFFF#;
kono
parents:
diff changeset
251 IS_Iz8 := 16#FFFF_FFFF_FFFF_FFFF#;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 if AFloat then
kono
parents:
diff changeset
254 IV_Isf := 16#7FFF_FFFF#;
kono
parents:
diff changeset
255 IV_Ifl := 16#7FFF_FFFF#;
kono
parents:
diff changeset
256 IV_Ilf := (16#FF#, 16#FF#, 16#FF#, 16#FF#, 16#FF#, 16#7F#);
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 else
kono
parents:
diff changeset
259 IV_Isf := 16#7F80_0000#;
kono
parents:
diff changeset
260 IV_Ifl := 16#7F80_0000#;
kono
parents:
diff changeset
261 IV_Ilf := To_ByteLF (16#7FF0_0000_0000_0000#);
kono
parents:
diff changeset
262 end if;
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 if EFloat then
kono
parents:
diff changeset
265 IV_Ill := (0, 0, 0, 0, 0, 0, 0, 16#80#, 16#FF#, 16#7F#, 0, 0);
kono
parents:
diff changeset
266 end if;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 -- -Shh (hex byte)
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 else
kono
parents:
diff changeset
271 -- Convert the two hex digits (we know they are valid here)
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 B := 16 * (Character'Pos (C1)
kono
parents:
diff changeset
274 - (if C1 in '0' .. '9'
kono
parents:
diff changeset
275 then Character'Pos ('0')
kono
parents:
diff changeset
276 else Character'Pos ('A') - 10))
kono
parents:
diff changeset
277 + (Character'Pos (C2)
kono
parents:
diff changeset
278 - (if C2 in '0' .. '9'
kono
parents:
diff changeset
279 then Character'Pos ('0')
kono
parents:
diff changeset
280 else Character'Pos ('A') - 10));
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 -- Initialize data values from the hex value
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 IS_Is1 := B;
kono
parents:
diff changeset
285 IS_Is2 := 2**8 * Byte2 (IS_Is1) + Byte2 (IS_Is1);
kono
parents:
diff changeset
286 IS_Is4 := 2**16 * Byte4 (IS_Is2) + Byte4 (IS_Is2);
kono
parents:
diff changeset
287 IS_Is8 := 2**32 * Byte8 (IS_Is4) + Byte8 (IS_Is4);
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 IS_Iu1 := IS_Is1;
kono
parents:
diff changeset
290 IS_Iu2 := IS_Is2;
kono
parents:
diff changeset
291 IS_Iu4 := IS_Is4;
kono
parents:
diff changeset
292 IS_Iu8 := IS_Is8;
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 IS_Iz1 := IS_Is1;
kono
parents:
diff changeset
295 IS_Iz2 := IS_Is2;
kono
parents:
diff changeset
296 IS_Iz4 := IS_Is4;
kono
parents:
diff changeset
297 IS_Iz8 := IS_Is8;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 IV_Isf := IS_Is4;
kono
parents:
diff changeset
300 IV_Ifl := IS_Is4;
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 if AFloat then
kono
parents:
diff changeset
303 IV_Ill := (B, B, B, B, B, B);
kono
parents:
diff changeset
304 else
kono
parents:
diff changeset
305 IV_Ilf := To_ByteLF (IS_Is8);
kono
parents:
diff changeset
306 end if;
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 if EFloat then
kono
parents:
diff changeset
309 IV_Ill := (B, B, B, B, B, B, B, B, B, B, B, B);
kono
parents:
diff changeset
310 end if;
kono
parents:
diff changeset
311 end if;
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 -- If no separate Long_Long_Float, then use Long_Float value as
kono
parents:
diff changeset
314 -- Long_Long_Float initial value.
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 if not EFloat then
kono
parents:
diff changeset
317 declare
kono
parents:
diff changeset
318 pragma Warnings (Off); -- why???
kono
parents:
diff changeset
319 function To_ByteLLF is
kono
parents:
diff changeset
320 new Ada.Unchecked_Conversion (ByteLF, ByteLLF);
kono
parents:
diff changeset
321 pragma Warnings (On);
kono
parents:
diff changeset
322 begin
kono
parents:
diff changeset
323 IV_Ill := To_ByteLLF (IV_Ilf);
kono
parents:
diff changeset
324 end;
kono
parents:
diff changeset
325 end if;
kono
parents:
diff changeset
326 end Initialize;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 end System.Scalar_Values;