Target FP: Use target format throughout expression parsing
[deliverable/binutils-gdb.git] / gdb / doublest.c
CommitLineData
d16aafd8 1/* Floating point routines for GDB, the GNU debugger.
f1908289 2
61baf725 3 Copyright (C) 1986-2017 Free Software Foundation, Inc.
d16aafd8
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
d16aafd8
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
d16aafd8
AC
19
20/* Support for converting target fp numbers into host DOUBLEST format. */
21
22/* XXX - This code should really be in libiberty/floatformat.c,
23 however configuration issues with libiberty made this very
24 difficult to do in the available time. */
25
26#include "defs.h"
27#include "doublest.h"
28#include "floatformat.h"
96d2f608 29#include "gdbtypes.h"
d16aafd8 30#include <math.h> /* ldexp */
325fac50 31#include <algorithm>
d16aafd8
AC
32
33/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
34 going to bother with trying to muck around with whether it is defined in
35 a system header, what we do if not, etc. */
36#define FLOATFORMAT_CHAR_BIT 8
37
fcab3fb5
RE
38/* The number of bytes that the largest floating-point type that we
39 can convert to doublest will need. */
40#define FLOATFORMAT_LARGEST_BYTES 16
41
d16aafd8
AC
42/* Extract a field which starts at START and is LEN bytes long. DATA and
43 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
44static unsigned long
108d6ead 45get_field (const bfd_byte *data, enum floatformat_byteorders order,
d16aafd8
AC
46 unsigned int total_len, unsigned int start, unsigned int len)
47{
48 unsigned long result;
49 unsigned int cur_byte;
50 int cur_bitshift;
51
fcab3fb5
RE
52 /* Caller must byte-swap words before calling this routine. */
53 gdb_assert (order == floatformat_little || order == floatformat_big);
54
d16aafd8 55 /* Start at the least significant part of the field. */
fcab3fb5 56 if (order == floatformat_little)
d16aafd8
AC
57 {
58 /* We start counting from the other end (i.e, from the high bytes
59 rather than the low bytes). As such, we need to be concerned
0963b4bd 60 with what happens if bit 0 doesn't start on a byte boundary.
d16aafd8
AC
61 I.e, we need to properly handle the case where total_len is
62 not evenly divisible by 8. So we compute ``excess'' which
63 represents the number of bits from the end of our starting
0963b4bd 64 byte needed to get to bit 0. */
d16aafd8 65 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
9a619af0 66
d16aafd8
AC
67 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
68 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
69 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
70 - FLOATFORMAT_CHAR_BIT;
71 }
72 else
73 {
74 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
75 cur_bitshift =
76 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
77 }
78 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
79 result = *(data + cur_byte) >> (-cur_bitshift);
80 else
81 result = 0;
82 cur_bitshift += FLOATFORMAT_CHAR_BIT;
fcab3fb5 83 if (order == floatformat_little)
d16aafd8
AC
84 ++cur_byte;
85 else
86 --cur_byte;
87
88 /* Move towards the most significant part of the field. */
89 while (cur_bitshift < len)
90 {
91 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
92 cur_bitshift += FLOATFORMAT_CHAR_BIT;
c35f4ffc
AC
93 switch (order)
94 {
95 case floatformat_little:
96 ++cur_byte;
97 break;
98 case floatformat_big:
99 --cur_byte;
100 break;
c35f4ffc 101 }
d16aafd8
AC
102 }
103 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
0963b4bd 104 /* Mask out bits which are not part of the field. */
d16aafd8
AC
105 result &= ((1UL << len) - 1);
106 return result;
107}
108
0a3e99f6
MK
109/* Normalize the byte order of FROM into TO. If no normalization is
110 needed then FMT->byteorder is returned and TO is not changed;
111 otherwise the format of the normalized form in TO is returned. */
112
fcab3fb5
RE
113static enum floatformat_byteorders
114floatformat_normalize_byteorder (const struct floatformat *fmt,
115 const void *from, void *to)
116{
117 const unsigned char *swapin;
118 unsigned char *swapout;
119 int words;
120
121 if (fmt->byteorder == floatformat_little
122 || fmt->byteorder == floatformat_big)
123 return fmt->byteorder;
124
fcab3fb5
RE
125 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
126 words >>= 2;
127
128 swapout = (unsigned char *)to;
129 swapin = (const unsigned char *)from;
130
0a3e99f6
MK
131 if (fmt->byteorder == floatformat_vax)
132 {
133 while (words-- > 0)
134 {
135 *swapout++ = swapin[1];
136 *swapout++ = swapin[0];
137 *swapout++ = swapin[3];
138 *swapout++ = swapin[2];
139 swapin += 4;
140 }
141 /* This may look weird, since VAX is little-endian, but it is
142 easier to translate to big-endian than to little-endian. */
143 return floatformat_big;
144 }
145 else
fcab3fb5 146 {
0a3e99f6
MK
147 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
148
149 while (words-- > 0)
150 {
151 *swapout++ = swapin[3];
152 *swapout++ = swapin[2];
153 *swapout++ = swapin[1];
154 *swapout++ = swapin[0];
155 swapin += 4;
156 }
157 return floatformat_big;
fcab3fb5 158 }
fcab3fb5
RE
159}
160
d16aafd8
AC
161/* Convert from FMT to a DOUBLEST.
162 FROM is the address of the extended float.
163 Store the DOUBLEST in *TO. */
164
c422e771
AC
165static void
166convert_floatformat_to_doublest (const struct floatformat *fmt,
167 const void *from,
168 DOUBLEST *to)
d16aafd8
AC
169{
170 unsigned char *ufrom = (unsigned char *) from;
171 DOUBLEST dto;
172 long exponent;
173 unsigned long mant;
174 unsigned int mant_bits, mant_off;
175 int mant_bits_left;
0963b4bd 176 int special_exponent; /* It's a NaN, denorm or zero. */
fcab3fb5
RE
177 enum floatformat_byteorders order;
178 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
20389057 179 enum float_kind kind;
fcab3fb5
RE
180
181 gdb_assert (fmt->totalsize
182 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
d16aafd8 183
20389057
DJ
184 /* For non-numbers, reuse libiberty's logic to find the correct
185 format. We do not lose any precision in this case by passing
186 through a double. */
9a3c8263 187 kind = floatformat_classify (fmt, (const bfd_byte *) from);
20389057
DJ
188 if (kind == float_infinite || kind == float_nan)
189 {
190 double dto;
9a619af0 191
f5aee5ee
AM
192 floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
193 from, &dto);
20389057
DJ
194 *to = (DOUBLEST) dto;
195 return;
196 }
197
fcab3fb5 198 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
d16aafd8 199
fcab3fb5
RE
200 if (order != fmt->byteorder)
201 ufrom = newfrom;
d16aafd8 202
b14d30e1
JM
203 if (fmt->split_half)
204 {
542a88d0 205 DOUBLEST dtop, dbot;
9a619af0 206
542a88d0 207 floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
b14d30e1
JM
208 /* Preserve the sign of 0, which is the sign of the top
209 half. */
210 if (dtop == 0.0)
211 {
542a88d0 212 *to = dtop;
b14d30e1
JM
213 return;
214 }
542a88d0 215 floatformat_to_doublest (fmt->split_half,
b14d30e1
JM
216 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
217 &dbot);
542a88d0 218 *to = dtop + dbot;
b14d30e1
JM
219 return;
220 }
221
fcab3fb5
RE
222 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
223 fmt->exp_len);
d16aafd8
AC
224 /* Note that if exponent indicates a NaN, we can't really do anything useful
225 (not knowing if the host has NaN's, or how to build one). So it will
226 end up as an infinity or something close; that is OK. */
227
228 mant_bits_left = fmt->man_len;
229 mant_off = fmt->man_start;
230 dto = 0.0;
231
232 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
233
0963b4bd
MS
234 /* Don't bias NaNs. Use minimum exponent for denorms. For
235 simplicity, we don't check for zero as the exponent doesn't matter.
236 Note the cast to int; exp_bias is unsigned, so it's important to
237 make sure the operation is done in signed arithmetic. */
d16aafd8
AC
238 if (!special_exponent)
239 exponent -= fmt->exp_bias;
240 else if (exponent == 0)
1c704f11 241 exponent = 1 - fmt->exp_bias;
d16aafd8
AC
242
243 /* Build the result algebraically. Might go infinite, underflow, etc;
0963b4bd 244 who cares. */
d16aafd8
AC
245
246/* If this format uses a hidden bit, explicitly add it in now. Otherwise,
247 increment the exponent by one to account for the integer bit. */
248
249 if (!special_exponent)
250 {
251 if (fmt->intbit == floatformat_intbit_no)
252 dto = ldexp (1.0, exponent);
253 else
254 exponent++;
255 }
256
257 while (mant_bits_left > 0)
258 {
325fac50 259 mant_bits = std::min (mant_bits_left, 32);
d16aafd8 260
fcab3fb5 261 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8
AC
262
263 dto += ldexp ((double) mant, exponent - mant_bits);
264 exponent -= mant_bits;
265 mant_off += mant_bits;
266 mant_bits_left -= mant_bits;
267 }
268
269 /* Negate it if negative. */
fcab3fb5 270 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
d16aafd8
AC
271 dto = -dto;
272 *to = dto;
273}
274\f
d16aafd8
AC
275/* Set a field which starts at START and is LEN bytes long. DATA and
276 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
277static void
278put_field (unsigned char *data, enum floatformat_byteorders order,
279 unsigned int total_len, unsigned int start, unsigned int len,
280 unsigned long stuff_to_put)
281{
282 unsigned int cur_byte;
283 int cur_bitshift;
284
fcab3fb5
RE
285 /* Caller must byte-swap words before calling this routine. */
286 gdb_assert (order == floatformat_little || order == floatformat_big);
287
d16aafd8 288 /* Start at the least significant part of the field. */
fcab3fb5 289 if (order == floatformat_little)
d16aafd8
AC
290 {
291 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
9a619af0 292
d16aafd8
AC
293 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
294 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
295 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
296 - FLOATFORMAT_CHAR_BIT;
297 }
298 else
299 {
300 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
301 cur_bitshift =
302 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
303 }
304 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
305 {
306 *(data + cur_byte) &=
307 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
308 << (-cur_bitshift));
309 *(data + cur_byte) |=
310 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
311 }
312 cur_bitshift += FLOATFORMAT_CHAR_BIT;
fcab3fb5 313 if (order == floatformat_little)
d16aafd8
AC
314 ++cur_byte;
315 else
316 --cur_byte;
317
318 /* Move towards the most significant part of the field. */
319 while (cur_bitshift < len)
320 {
321 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
322 {
323 /* This is the last byte. */
324 *(data + cur_byte) &=
325 ~((1 << (len - cur_bitshift)) - 1);
326 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
327 }
328 else
329 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
330 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
331 cur_bitshift += FLOATFORMAT_CHAR_BIT;
fcab3fb5 332 if (order == floatformat_little)
d16aafd8
AC
333 ++cur_byte;
334 else
335 --cur_byte;
336 }
337}
338
0a3e99f6
MK
339/* The converse: convert the DOUBLEST *FROM to an extended float and
340 store where TO points. Neither FROM nor TO have any alignment
d16aafd8
AC
341 restrictions. */
342
c422e771 343static void
cc2f3c35 344convert_doublest_to_floatformat (const struct floatformat *fmt,
0a3e99f6 345 const DOUBLEST *from, void *to)
d16aafd8
AC
346{
347 DOUBLEST dfrom;
348 int exponent;
349 DOUBLEST mant;
350 unsigned int mant_bits, mant_off;
351 int mant_bits_left;
352 unsigned char *uto = (unsigned char *) to;
fcab3fb5 353 enum floatformat_byteorders order = fmt->byteorder;
0a3e99f6 354 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
fcab3fb5 355
0a3e99f6 356 if (order != floatformat_little)
fcab3fb5 357 order = floatformat_big;
d16aafd8 358
0a3e99f6
MK
359 if (order != fmt->byteorder)
360 uto = newto;
361
d16aafd8 362 memcpy (&dfrom, from, sizeof (dfrom));
e1ba3053 363 memset (uto, 0, floatformat_totalsize_bytes (fmt));
b14d30e1
JM
364
365 if (fmt->split_half)
366 {
367 /* Use static volatile to ensure that any excess precision is
368 removed via storing in memory, and so the top half really is
369 the result of converting to double. */
370 static volatile double dtop, dbot;
542a88d0 371 DOUBLEST dtopnv, dbotnv;
9a619af0 372
b14d30e1
JM
373 dtop = (double) dfrom;
374 /* If the rounded top half is Inf, the bottom must be 0 not NaN
375 or Inf. */
376 if (dtop + dtop == dtop && dtop != 0.0)
377 dbot = 0.0;
378 else
379 dbot = (double) (dfrom - (DOUBLEST) dtop);
380 dtopnv = dtop;
381 dbotnv = dbot;
542a88d0
LM
382 floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
383 floatformat_from_doublest (fmt->split_half, &dbotnv,
b14d30e1
JM
384 (uto
385 + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
386 return;
387 }
388
d16aafd8
AC
389 if (dfrom == 0)
390 return; /* Result is zero */
391 if (dfrom != dfrom) /* Result is NaN */
392 {
393 /* From is NaN */
fcab3fb5 394 put_field (uto, order, fmt->totalsize, fmt->exp_start,
d16aafd8 395 fmt->exp_len, fmt->exp_nan);
0963b4bd 396 /* Be sure it's not infinity, but NaN value is irrel. */
fcab3fb5 397 put_field (uto, order, fmt->totalsize, fmt->man_start,
fbe12357 398 fmt->man_len, 1);
fcab3fb5 399 goto finalize_byteorder;
d16aafd8
AC
400 }
401
402 /* If negative, set the sign bit. */
403 if (dfrom < 0)
404 {
fcab3fb5 405 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
d16aafd8
AC
406 dfrom = -dfrom;
407 }
408
0963b4bd 409 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
d16aafd8
AC
410 {
411 /* Infinity exponent is same as NaN's. */
fcab3fb5 412 put_field (uto, order, fmt->totalsize, fmt->exp_start,
d16aafd8
AC
413 fmt->exp_len, fmt->exp_nan);
414 /* Infinity mantissa is all zeroes. */
fcab3fb5 415 put_field (uto, order, fmt->totalsize, fmt->man_start,
d16aafd8 416 fmt->man_len, 0);
fcab3fb5 417 goto finalize_byteorder;
d16aafd8
AC
418 }
419
420#ifdef HAVE_LONG_DOUBLE
85d3b769 421 mant = frexpl (dfrom, &exponent);
d16aafd8
AC
422#else
423 mant = frexp (dfrom, &exponent);
424#endif
425
33d7655b
JB
426 if (exponent + fmt->exp_bias <= 0)
427 {
428 /* The value is too small to be expressed in the destination
429 type (not enough bits in the exponent. Treat as 0. */
430 put_field (uto, order, fmt->totalsize, fmt->exp_start,
431 fmt->exp_len, 0);
432 put_field (uto, order, fmt->totalsize, fmt->man_start,
433 fmt->man_len, 0);
434 goto finalize_byteorder;
435 }
436
32560274 437 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
33d7655b
JB
438 {
439 /* The value is too large to fit into the destination.
440 Treat as infinity. */
441 put_field (uto, order, fmt->totalsize, fmt->exp_start,
442 fmt->exp_len, fmt->exp_nan);
443 put_field (uto, order, fmt->totalsize, fmt->man_start,
444 fmt->man_len, 0);
445 goto finalize_byteorder;
446 }
447
fcab3fb5 448 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
d16aafd8
AC
449 exponent + fmt->exp_bias - 1);
450
451 mant_bits_left = fmt->man_len;
452 mant_off = fmt->man_start;
453 while (mant_bits_left > 0)
454 {
455 unsigned long mant_long;
9a619af0 456
d16aafd8
AC
457 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
458
459 mant *= 4294967296.0;
460 mant_long = ((unsigned long) mant) & 0xffffffffL;
461 mant -= mant_long;
462
463 /* If the integer bit is implicit, then we need to discard it.
464 If we are discarding a zero, we should be (but are not) creating
465 a denormalized number which means adjusting the exponent
466 (I think). */
467 if (mant_bits_left == fmt->man_len
468 && fmt->intbit == floatformat_intbit_no)
469 {
470 mant_long <<= 1;
471 mant_long &= 0xffffffffL;
06194148
JJ
472 /* If we are processing the top 32 mantissa bits of a doublest
473 so as to convert to a float value with implied integer bit,
474 we will only be putting 31 of those 32 bits into the
475 final value due to the discarding of the top bit. In the
476 case of a small float value where the number of mantissa
477 bits is less than 32, discarding the top bit does not alter
478 the number of bits we will be adding to the result. */
479 if (mant_bits == 32)
480 mant_bits -= 1;
d16aafd8
AC
481 }
482
483 if (mant_bits < 32)
484 {
485 /* The bits we want are in the most significant MANT_BITS bits of
486 mant_long. Move them to the least significant. */
487 mant_long >>= 32 - mant_bits;
488 }
489
fcab3fb5 490 put_field (uto, order, fmt->totalsize,
d16aafd8
AC
491 mant_off, mant_bits, mant_long);
492 mant_off += mant_bits;
493 mant_bits_left -= mant_bits;
494 }
fcab3fb5
RE
495
496 finalize_byteorder:
497 /* Do we need to byte-swap the words in the result? */
498 if (order != fmt->byteorder)
0a3e99f6 499 floatformat_normalize_byteorder (fmt, newto, to);
d16aafd8
AC
500}
501
502/* Check if VAL (which is assumed to be a floating point number whose
503 format is described by FMT) is negative. */
504
505int
108d6ead
AC
506floatformat_is_negative (const struct floatformat *fmt,
507 const bfd_byte *uval)
d16aafd8 508{
fcab3fb5
RE
509 enum floatformat_byteorders order;
510 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
511
069e84fd 512 gdb_assert (fmt != NULL);
fcab3fb5
RE
513 gdb_assert (fmt->totalsize
514 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
515
f5aee5ee
AM
516 /* An IBM long double (a two element array of double) always takes the
517 sign of the first double. */
518 if (fmt->split_half)
519 fmt = fmt->split_half;
520
fcab3fb5
RE
521 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
522
523 if (order != fmt->byteorder)
524 uval = newfrom;
525
526 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
d16aafd8
AC
527}
528
529/* Check if VAL is "not a number" (NaN) for FMT. */
530
20389057
DJ
531enum float_kind
532floatformat_classify (const struct floatformat *fmt,
533 const bfd_byte *uval)
d16aafd8 534{
d16aafd8
AC
535 long exponent;
536 unsigned long mant;
537 unsigned int mant_bits, mant_off;
538 int mant_bits_left;
fcab3fb5
RE
539 enum floatformat_byteorders order;
540 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
20389057 541 int mant_zero;
fcab3fb5 542
069e84fd 543 gdb_assert (fmt != NULL);
fcab3fb5
RE
544 gdb_assert (fmt->totalsize
545 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
546
f5aee5ee
AM
547 /* An IBM long double (a two element array of double) can be classified
548 by looking at the first double. inf and nan are specified as
549 ignoring the second double. zero and subnormal will always have
550 the second double 0.0 if the long double is correctly rounded. */
551 if (fmt->split_half)
552 fmt = fmt->split_half;
553
fcab3fb5
RE
554 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
555
556 if (order != fmt->byteorder)
557 uval = newfrom;
069e84fd 558
fcab3fb5
RE
559 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
560 fmt->exp_len);
d16aafd8 561
d16aafd8
AC
562 mant_bits_left = fmt->man_len;
563 mant_off = fmt->man_start;
564
20389057 565 mant_zero = 1;
d16aafd8
AC
566 while (mant_bits_left > 0)
567 {
325fac50 568 mant_bits = std::min (mant_bits_left, 32);
d16aafd8 569
fcab3fb5 570 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8
AC
571
572 /* If there is an explicit integer bit, mask it off. */
573 if (mant_off == fmt->man_start
574 && fmt->intbit == floatformat_intbit_yes)
575 mant &= ~(1 << (mant_bits - 1));
576
577 if (mant)
20389057
DJ
578 {
579 mant_zero = 0;
580 break;
581 }
d16aafd8
AC
582
583 mant_off += mant_bits;
584 mant_bits_left -= mant_bits;
585 }
586
20389057
DJ
587 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
588 supported. */
589 if (! fmt->exp_nan)
590 {
591 if (mant_zero)
592 return float_zero;
593 else
594 return float_normal;
595 }
596
597 if (exponent == 0 && !mant_zero)
598 return float_subnormal;
599
600 if (exponent == fmt->exp_nan)
601 {
602 if (mant_zero)
603 return float_infinite;
604 else
605 return float_nan;
606 }
607
608 if (mant_zero)
609 return float_zero;
610
611 return float_normal;
d16aafd8
AC
612}
613
614/* Convert the mantissa of VAL (which is assumed to be a floating
615 point number whose format is described by FMT) into a hexadecimal
616 and store it in a static string. Return a pointer to that string. */
617
108d6ead
AC
618const char *
619floatformat_mantissa (const struct floatformat *fmt,
620 const bfd_byte *val)
d16aafd8
AC
621{
622 unsigned char *uval = (unsigned char *) val;
623 unsigned long mant;
624 unsigned int mant_bits, mant_off;
625 int mant_bits_left;
626 static char res[50];
627 char buf[9];
27df76f3 628 int len;
fcab3fb5
RE
629 enum floatformat_byteorders order;
630 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
631
632 gdb_assert (fmt != NULL);
633 gdb_assert (fmt->totalsize
634 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
635
f5aee5ee
AM
636 /* For IBM long double (a two element array of double), return the
637 mantissa of the first double. The problem with returning the
638 actual mantissa from both doubles is that there can be an
639 arbitrary number of implied 0's or 1's between the mantissas
640 of the first and second double. In any case, this function
641 is only used for dumping out nans, and a nan is specified to
642 ignore the value in the second double. */
643 if (fmt->split_half)
644 fmt = fmt->split_half;
645
fcab3fb5
RE
646 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
647
648 if (order != fmt->byteorder)
649 uval = newfrom;
650
651 if (! fmt->exp_nan)
652 return 0;
d16aafd8
AC
653
654 /* Make sure we have enough room to store the mantissa. */
655 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
656
657 mant_off = fmt->man_start;
658 mant_bits_left = fmt->man_len;
659 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
660
fcab3fb5 661 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
d16aafd8 662
27df76f3 663 len = xsnprintf (res, sizeof res, "%lx", mant);
d16aafd8
AC
664
665 mant_off += mant_bits;
666 mant_bits_left -= mant_bits;
27df76f3 667
d16aafd8
AC
668 while (mant_bits_left > 0)
669 {
fcab3fb5 670 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
d16aafd8 671
27df76f3
MK
672 xsnprintf (buf, sizeof buf, "%08lx", mant);
673 gdb_assert (len + strlen (buf) <= sizeof res);
d16aafd8
AC
674 strcat (res, buf);
675
676 mant_off += 32;
677 mant_bits_left -= 32;
678 }
679
680 return res;
681}
682
fdf0cbc2
UW
683/* Return the precision of the floating point format FMT. */
684
685static int
686floatformat_precision (const struct floatformat *fmt)
687{
688 /* Assume the precision of and IBM long double is twice the precision
689 of the underlying double. This matches what GCC does. */
690 if (fmt->split_half)
691 return 2 * floatformat_precision (fmt->split_half);
692
693 /* Otherwise, the precision is the size of mantissa in bits,
694 including the implicit bit if present. */
695 int prec = fmt->man_len;
696 if (fmt->intbit == floatformat_intbit_no)
697 prec++;
698
699 return prec;
700}
701
d16aafd8 702\f
c422e771
AC
703/* Convert TO/FROM target to the hosts DOUBLEST floating-point format.
704
705 If the host and target formats agree, we just copy the raw data
706 into the appropriate type of variable and return, letting the host
707 increase precision as necessary. Otherwise, we call the conversion
d7a87b5e
PA
708 routine and let it do the dirty work. Note that even if the target
709 and host floating-point formats match, the length of the types
710 might still be different, so the conversion routines must make sure
711 to not overrun any buffers. For example, on x86, long double is
712 the 80-bit extended precision type on both 32-bit and 64-bit ABIs,
713 but by default it is stored as 12 bytes on 32-bit, and 16 bytes on
714 64-bit, for alignment reasons. See comment in store_typed_floating
715 for a discussion about zeroing out remaining bytes in the target
716 buffer. */
c422e771 717
c35f4ffc
AC
718static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
719static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
3e43a32a
MS
720static const struct floatformat *host_long_double_format
721 = GDB_HOST_LONG_DOUBLE_FORMAT;
c422e771 722
b79497cb
PA
723/* See doublest.h. */
724
725size_t
726floatformat_totalsize_bytes (const struct floatformat *fmt)
727{
728 return ((fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
729 / FLOATFORMAT_CHAR_BIT);
730}
731
c422e771
AC
732void
733floatformat_to_doublest (const struct floatformat *fmt,
734 const void *in, DOUBLEST *out)
735{
736 gdb_assert (fmt != NULL);
d7a87b5e 737
c422e771
AC
738 if (fmt == host_float_format)
739 {
d7a87b5e 740 float val = 0;
9a619af0 741
d7a87b5e 742 memcpy (&val, in, floatformat_totalsize_bytes (fmt));
c422e771
AC
743 *out = val;
744 }
745 else if (fmt == host_double_format)
746 {
d7a87b5e 747 double val = 0;
9a619af0 748
d7a87b5e 749 memcpy (&val, in, floatformat_totalsize_bytes (fmt));
c422e771
AC
750 *out = val;
751 }
752 else if (fmt == host_long_double_format)
753 {
d7a87b5e 754 long double val = 0;
9a619af0 755
d7a87b5e 756 memcpy (&val, in, floatformat_totalsize_bytes (fmt));
c422e771
AC
757 *out = val;
758 }
759 else
760 convert_floatformat_to_doublest (fmt, in, out);
761}
762
763void
764floatformat_from_doublest (const struct floatformat *fmt,
765 const DOUBLEST *in, void *out)
766{
767 gdb_assert (fmt != NULL);
d7a87b5e 768
c422e771
AC
769 if (fmt == host_float_format)
770 {
771 float val = *in;
9a619af0 772
d7a87b5e 773 memcpy (out, &val, floatformat_totalsize_bytes (fmt));
c422e771
AC
774 }
775 else if (fmt == host_double_format)
776 {
777 double val = *in;
9a619af0 778
d7a87b5e 779 memcpy (out, &val, floatformat_totalsize_bytes (fmt));
c422e771
AC
780 }
781 else if (fmt == host_long_double_format)
782 {
783 long double val = *in;
9a619af0 784
d7a87b5e 785 memcpy (out, &val, floatformat_totalsize_bytes (fmt));
c422e771
AC
786 }
787 else
788 convert_doublest_to_floatformat (fmt, in, out);
789}
d16aafd8 790
fdf0cbc2 791/* Convert the byte-stream ADDR, interpreted as floating-point format FMT,
16e812b2 792 to a string, optionally using the print format FORMAT. */
fdf0cbc2
UW
793std::string
794floatformat_to_string (const struct floatformat *fmt,
16e812b2 795 const gdb_byte *in, const char *format)
fdf0cbc2 796{
16e812b2
UW
797 /* Unless we need to adhere to a specific format, provide special
798 output for certain cases. */
799 if (format == nullptr)
fdf0cbc2 800 {
16e812b2
UW
801 /* Detect invalid representations. */
802 if (!floatformat_is_valid (fmt, in))
803 return "<invalid float value>";
804
805 /* Handle NaN and Inf. */
806 enum float_kind kind = floatformat_classify (fmt, in);
807 if (kind == float_nan)
808 {
809 const char *sign = floatformat_is_negative (fmt, in)? "-" : "";
810 const char *mantissa = floatformat_mantissa (fmt, in);
811 return string_printf ("%snan(0x%s)", sign, mantissa);
812 }
813 else if (kind == float_infinite)
814 {
815 const char *sign = floatformat_is_negative (fmt, in)? "-" : "";
816 return string_printf ("%sinf", sign);
817 }
fdf0cbc2
UW
818 }
819
16e812b2
UW
820 /* Determine the format string to use on the host side. */
821 std::string host_format;
822 char conversion;
823
824 if (format == nullptr)
825 {
826 /* If no format was specified, print the number using a format string
827 where the precision is set to the DECIMAL_DIG value for the given
828 floating-point format. This value is computed as
fdf0cbc2
UW
829
830 ceil(1 + p * log10(b)),
831
16e812b2
UW
832 where p is the precision of the floating-point format in bits, and
833 b is the base (which is always 2 for the formats we support). */
834 const double log10_2 = .30102999566398119521;
835 double d_decimal_dig = 1 + floatformat_precision (fmt) * log10_2;
836 int decimal_dig = d_decimal_dig;
837 if (decimal_dig < d_decimal_dig)
838 decimal_dig++;
839
840 host_format = string_printf ("%%.%d", decimal_dig);
841 conversion = 'g';
842 }
843 else
844 {
845 /* Use the specified format, stripping out the conversion character
846 and length modifier, if present. */
847 size_t len = strlen (format);
848 gdb_assert (len > 1);
849 conversion = format[--len];
850 gdb_assert (conversion == 'e' || conversion == 'f' || conversion == 'g'
851 || conversion == 'E' || conversion == 'G');
852 if (format[len - 1] == 'L')
853 len--;
fdf0cbc2 854
16e812b2
UW
855 host_format = std::string (format, len);
856 }
857
858 /* Add the length modifier and conversion character appropriate for
859 handling the host DOUBLEST type. */
860#ifdef HAVE_LONG_DOUBLE
861 host_format += 'L';
862#endif
863 host_format += conversion;
fdf0cbc2
UW
864
865 DOUBLEST doub;
866 floatformat_to_doublest (fmt, in, &doub);
867 return string_printf (host_format.c_str (), doub);
868}
edd079d9
UW
869
870/* Parse string STRING into a target floating-number of format FMT and
871 store it as byte-stream ADDR. Return whether parsing succeeded. */
872bool
873floatformat_from_string (const struct floatformat *fmt, gdb_byte *out,
874 const std::string &in)
875{
876 DOUBLEST doub;
877 int n, num;
878#ifdef HAVE_LONG_DOUBLE
879 const char *scan_format = "%Lg%n";
880#else
881 const char *scan_format = "%lg%n";
882#endif
883 num = sscanf (in.c_str (), scan_format, &doub, &n);
884
885 /* The sscanf man page suggests not making any assumptions on the effect
886 of %n on the result, so we don't.
887 That is why we simply test num == 0. */
888 if (num == 0)
889 return false;
890
891 /* We only accept the whole string. */
892 if (in[n])
893 return false;
894
895 floatformat_from_doublest (fmt, &doub, out);
896 return true;
897}
c422e771 898\f
87ffba60
MK
899/* Extract a floating-point number of type TYPE from a target-order
900 byte-stream at ADDR. Returns the value as type DOUBLEST. */
96d2f608
AC
901
902DOUBLEST
903extract_typed_floating (const void *addr, const struct type *type)
904{
e035e373 905 const struct floatformat *fmt = floatformat_from_type (type);
96d2f608 906 DOUBLEST retval;
87ffba60 907
e035e373 908 floatformat_to_doublest (fmt, addr, &retval);
96d2f608
AC
909 return retval;
910}
911
87ffba60
MK
912/* Store VAL as a floating-point number of type TYPE to a target-order
913 byte-stream at ADDR. */
914
96d2f608
AC
915void
916store_typed_floating (void *addr, const struct type *type, DOUBLEST val)
917{
e035e373 918 const struct floatformat *fmt = floatformat_from_type (type);
87ffba60
MK
919
920 /* FIXME: kettenis/2001-10-28: It is debatable whether we should
921 zero out any remaining bytes in the target buffer when TYPE is
922 longer than the actual underlying floating-point format. Perhaps
923 we should store a fixed bitpattern in those remaining bytes,
924 instead of zero, or perhaps we shouldn't touch those remaining
925 bytes at all.
926
927 NOTE: cagney/2001-10-28: With the way things currently work, it
928 isn't a good idea to leave the end bits undefined. This is
929 because GDB writes out the entire sizeof(<floating>) bits of the
930 floating-point type even though the value might only be stored
931 in, and the target processor may only refer to, the first N <
932 TYPE_LENGTH (type) bits. If the end of the buffer wasn't
933 initialized, GDB would write undefined data to the target. An
934 errant program, refering to that undefined data, would then
43686d64
MK
935 become non-deterministic.
936
937 See also the function convert_typed_floating below. */
96d2f608 938 memset (addr, 0, TYPE_LENGTH (type));
87ffba60 939
e035e373 940 floatformat_from_doublest (fmt, &val, addr);
96d2f608 941}
43686d64
MK
942
943/* Convert a floating-point number of type FROM_TYPE from a
944 target-order byte-stream at FROM to a floating-point number of type
945 TO_TYPE, and store it to a target-order byte-stream at TO. */
946
947void
948convert_typed_floating (const void *from, const struct type *from_type,
949 void *to, const struct type *to_type)
950{
c2f05ac9
AC
951 const struct floatformat *from_fmt = floatformat_from_type (from_type);
952 const struct floatformat *to_fmt = floatformat_from_type (to_type);
43686d64 953
43686d64
MK
954 if (from_fmt == NULL || to_fmt == NULL)
955 {
956 /* If we don't know the floating-point format of FROM_TYPE or
957 TO_TYPE, there's not much we can do. We might make the
958 assumption that if the length of FROM_TYPE and TO_TYPE match,
959 their floating-point format would match too, but that
960 assumption might be wrong on targets that support
961 floating-point types that only differ in endianness for
962 example. So we warn instead, and zero out the target buffer. */
8a3fe4f8 963 warning (_("Can't convert floating-point number to desired type."));
43686d64
MK
964 memset (to, 0, TYPE_LENGTH (to_type));
965 }
966 else if (from_fmt == to_fmt)
967 {
968 /* We're in business. The floating-point format of FROM_TYPE
969 and TO_TYPE match. However, even though the floating-point
970 format matches, the length of the type might still be
971 different. Make sure we don't overrun any buffers. See
972 comment in store_typed_floating for a discussion about
973 zeroing out remaining bytes in the target buffer. */
974 memset (to, 0, TYPE_LENGTH (to_type));
325fac50
PA
975 memcpy (to, from, std::min (TYPE_LENGTH (from_type),
976 TYPE_LENGTH (to_type)));
43686d64
MK
977 }
978 else
979 {
980 /* The floating-point types don't match. The best we can do
938f5214 981 (apart from simulating the target FPU) is converting to the
43686d64
MK
982 widest floating-point type supported by the host, and then
983 again to the desired type. */
984 DOUBLEST d;
985
986 floatformat_to_doublest (from_fmt, from, &d);
987 floatformat_from_doublest (to_fmt, &d, to);
988 }
989}
This page took 1.222847 seconds and 4 git commands to generate.