Automatic date update in version.in
[binutils-gdb.git] / gdb / target-float.c
blob415988923561b1f3b85f71548c0c4f97eeee1784
1 /* Floating point routines for GDB, the GNU debugger.
3 Copyright (C) 2017-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "defs.h"
21 #include "gdbtypes.h"
22 #include "floatformat.h"
23 #include "target-float.h"
24 #include "gdbarch.h"
26 /* Target floating-point operations.
28 We provide multiple implementations of those operations, which differ
29 by the host-side intermediate format they perform computations in.
31 Those multiple implementations all derive from the following abstract
32 base class, which specifies the set of operations to be implemented. */
34 class target_float_ops
36 public:
37 virtual std::string to_string (const gdb_byte *addr, const struct type *type,
38 const char *format) const = 0;
39 virtual bool from_string (gdb_byte *addr, const struct type *type,
40 const std::string &string) const = 0;
42 virtual LONGEST to_longest (const gdb_byte *addr,
43 const struct type *type) const = 0;
44 virtual void from_longest (gdb_byte *addr, const struct type *type,
45 LONGEST val) const = 0;
46 virtual void from_ulongest (gdb_byte *addr, const struct type *type,
47 ULONGEST val) const = 0;
48 virtual double to_host_double (const gdb_byte *addr,
49 const struct type *type) const = 0;
50 virtual void from_host_double (gdb_byte *addr, const struct type *type,
51 double val) const = 0;
52 virtual void convert (const gdb_byte *from, const struct type *from_type,
53 gdb_byte *to, const struct type *to_type) const = 0;
55 virtual void binop (enum exp_opcode opcode,
56 const gdb_byte *x, const struct type *type_x,
57 const gdb_byte *y, const struct type *type_y,
58 gdb_byte *res, const struct type *type_res) const = 0;
59 virtual int compare (const gdb_byte *x, const struct type *type_x,
60 const gdb_byte *y, const struct type *type_y) const = 0;
64 /* Helper routines operating on binary floating-point data. */
66 #include <cmath>
67 #include <limits>
69 /* Different kinds of floatformat numbers recognized by
70 floatformat_classify. To avoid portability issues, we use local
71 values instead of the C99 macros (FP_NAN et cetera). */
72 enum float_kind {
73 float_nan,
74 float_infinite,
75 float_zero,
76 float_normal,
77 float_subnormal
80 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
81 going to bother with trying to muck around with whether it is defined in
82 a system header, what we do if not, etc. */
83 #define FLOATFORMAT_CHAR_BIT 8
85 /* The number of bytes that the largest floating-point type that we
86 can convert to doublest will need. */
87 #define FLOATFORMAT_LARGEST_BYTES 16
89 /* Return the floatformat's total size in host bytes. */
90 static size_t
91 floatformat_totalsize_bytes (const struct floatformat *fmt)
93 return ((fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
94 / FLOATFORMAT_CHAR_BIT);
97 /* Return the precision of the floating point format FMT. */
98 static int
99 floatformat_precision (const struct floatformat *fmt)
101 /* Assume the precision of and IBM long double is twice the precision
102 of the underlying double. This matches what GCC does. */
103 if (fmt->split_half)
104 return 2 * floatformat_precision (fmt->split_half);
106 /* Otherwise, the precision is the size of mantissa in bits,
107 including the implicit bit if present. */
108 int prec = fmt->man_len;
109 if (fmt->intbit == floatformat_intbit_no)
110 prec++;
112 return prec;
115 /* Normalize the byte order of FROM into TO. If no normalization is
116 needed then FMT->byteorder is returned and TO is not changed;
117 otherwise the format of the normalized form in TO is returned. */
118 static enum floatformat_byteorders
119 floatformat_normalize_byteorder (const struct floatformat *fmt,
120 const void *from, void *to)
122 const unsigned char *swapin;
123 unsigned char *swapout;
124 int words;
126 if (fmt->byteorder == floatformat_little
127 || fmt->byteorder == floatformat_big)
128 return fmt->byteorder;
130 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
131 words >>= 2;
133 swapout = (unsigned char *)to;
134 swapin = (const unsigned char *)from;
136 if (fmt->byteorder == floatformat_vax)
138 while (words-- > 0)
140 *swapout++ = swapin[1];
141 *swapout++ = swapin[0];
142 *swapout++ = swapin[3];
143 *swapout++ = swapin[2];
144 swapin += 4;
146 /* This may look weird, since VAX is little-endian, but it is
147 easier to translate to big-endian than to little-endian. */
148 return floatformat_big;
150 else
152 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
154 while (words-- > 0)
156 *swapout++ = swapin[3];
157 *swapout++ = swapin[2];
158 *swapout++ = swapin[1];
159 *swapout++ = swapin[0];
160 swapin += 4;
162 return floatformat_big;
166 /* Extract a field which starts at START and is LEN bytes long. DATA and
167 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
168 static unsigned long
169 get_field (const bfd_byte *data, enum floatformat_byteorders order,
170 unsigned int total_len, unsigned int start, unsigned int len)
172 unsigned long result;
173 unsigned int cur_byte;
174 int cur_bitshift;
176 /* Caller must byte-swap words before calling this routine. */
177 gdb_assert (order == floatformat_little || order == floatformat_big);
179 /* Start at the least significant part of the field. */
180 if (order == floatformat_little)
182 /* We start counting from the other end (i.e, from the high bytes
183 rather than the low bytes). As such, we need to be concerned
184 with what happens if bit 0 doesn't start on a byte boundary.
185 I.e, we need to properly handle the case where total_len is
186 not evenly divisible by 8. So we compute ``excess'' which
187 represents the number of bits from the end of our starting
188 byte needed to get to bit 0. */
189 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
191 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
192 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
193 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
194 - FLOATFORMAT_CHAR_BIT;
196 else
198 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
199 cur_bitshift =
200 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
202 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
203 result = *(data + cur_byte) >> (-cur_bitshift);
204 else
205 result = 0;
206 cur_bitshift += FLOATFORMAT_CHAR_BIT;
207 if (order == floatformat_little)
208 ++cur_byte;
209 else
210 --cur_byte;
212 /* Move towards the most significant part of the field. */
213 while (cur_bitshift < len)
215 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
216 cur_bitshift += FLOATFORMAT_CHAR_BIT;
217 switch (order)
219 case floatformat_little:
220 ++cur_byte;
221 break;
222 case floatformat_big:
223 --cur_byte;
224 break;
227 if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
228 /* Mask out bits which are not part of the field. */
229 result &= ((1UL << len) - 1);
230 return result;
233 /* Set a field which starts at START and is LEN bytes long. DATA and
234 TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
235 static void
236 put_field (unsigned char *data, enum floatformat_byteorders order,
237 unsigned int total_len, unsigned int start, unsigned int len,
238 unsigned long stuff_to_put)
240 unsigned int cur_byte;
241 int cur_bitshift;
243 /* Caller must byte-swap words before calling this routine. */
244 gdb_assert (order == floatformat_little || order == floatformat_big);
246 /* Start at the least significant part of the field. */
247 if (order == floatformat_little)
249 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
251 cur_byte = (total_len / FLOATFORMAT_CHAR_BIT)
252 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
253 cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT)
254 - FLOATFORMAT_CHAR_BIT;
256 else
258 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
259 cur_bitshift =
260 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
262 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
264 *(data + cur_byte) &=
265 ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
266 << (-cur_bitshift));
267 *(data + cur_byte) |=
268 (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
270 cur_bitshift += FLOATFORMAT_CHAR_BIT;
271 if (order == floatformat_little)
272 ++cur_byte;
273 else
274 --cur_byte;
276 /* Move towards the most significant part of the field. */
277 while (cur_bitshift < len)
279 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
281 /* This is the last byte. */
282 *(data + cur_byte) &=
283 ~((1 << (len - cur_bitshift)) - 1);
284 *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
286 else
287 *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
288 & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
289 cur_bitshift += FLOATFORMAT_CHAR_BIT;
290 if (order == floatformat_little)
291 ++cur_byte;
292 else
293 --cur_byte;
297 /* Check if VAL (which is assumed to be a floating point number whose
298 format is described by FMT) is negative. */
299 static int
300 floatformat_is_negative (const struct floatformat *fmt,
301 const bfd_byte *uval)
303 enum floatformat_byteorders order;
304 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
306 gdb_assert (fmt != NULL);
307 gdb_assert (fmt->totalsize
308 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
310 /* An IBM long double (a two element array of double) always takes the
311 sign of the first double. */
312 if (fmt->split_half)
313 fmt = fmt->split_half;
315 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
317 if (order != fmt->byteorder)
318 uval = newfrom;
320 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
323 /* Check if VAL is "not a number" (NaN) for FMT. */
324 static enum float_kind
325 floatformat_classify (const struct floatformat *fmt,
326 const bfd_byte *uval)
328 long exponent;
329 unsigned long mant;
330 unsigned int mant_bits, mant_off;
331 int mant_bits_left;
332 enum floatformat_byteorders order;
333 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
334 int mant_zero;
336 gdb_assert (fmt != NULL);
337 gdb_assert (fmt->totalsize
338 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
340 /* An IBM long double (a two element array of double) can be classified
341 by looking at the first double. inf and nan are specified as
342 ignoring the second double. zero and subnormal will always have
343 the second double 0.0 if the long double is correctly rounded. */
344 if (fmt->split_half)
345 fmt = fmt->split_half;
347 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
349 if (order != fmt->byteorder)
350 uval = newfrom;
352 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
353 fmt->exp_len);
355 mant_bits_left = fmt->man_len;
356 mant_off = fmt->man_start;
358 mant_zero = 1;
359 while (mant_bits_left > 0)
361 mant_bits = std::min (mant_bits_left, 32);
363 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
365 /* If there is an explicit integer bit, mask it off. */
366 if (mant_off == fmt->man_start
367 && fmt->intbit == floatformat_intbit_yes)
368 mant &= ~(1 << (mant_bits - 1));
370 if (mant)
372 mant_zero = 0;
373 break;
376 mant_off += mant_bits;
377 mant_bits_left -= mant_bits;
380 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
381 supported. */
382 if (! fmt->exp_nan)
384 if (mant_zero)
385 return float_zero;
386 else
387 return float_normal;
390 if (exponent == 0)
392 if (mant_zero)
393 return float_zero;
394 else
395 return float_subnormal;
398 if (exponent == fmt->exp_nan)
400 if (mant_zero)
401 return float_infinite;
402 else
403 return float_nan;
406 return float_normal;
409 /* Convert the mantissa of VAL (which is assumed to be a floating
410 point number whose format is described by FMT) into a hexadecimal
411 and store it in a static string. Return a pointer to that string. */
412 static const char *
413 floatformat_mantissa (const struct floatformat *fmt,
414 const bfd_byte *val)
416 unsigned char *uval = (unsigned char *) val;
417 unsigned long mant;
418 unsigned int mant_bits, mant_off;
419 int mant_bits_left;
420 static char res[50];
421 char buf[9];
422 int len;
423 enum floatformat_byteorders order;
424 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
426 gdb_assert (fmt != NULL);
427 gdb_assert (fmt->totalsize
428 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
430 /* For IBM long double (a two element array of double), return the
431 mantissa of the first double. The problem with returning the
432 actual mantissa from both doubles is that there can be an
433 arbitrary number of implied 0's or 1's between the mantissas
434 of the first and second double. In any case, this function
435 is only used for dumping out nans, and a nan is specified to
436 ignore the value in the second double. */
437 if (fmt->split_half)
438 fmt = fmt->split_half;
440 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
442 if (order != fmt->byteorder)
443 uval = newfrom;
445 if (! fmt->exp_nan)
446 return 0;
448 /* Make sure we have enough room to store the mantissa. */
449 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
451 mant_off = fmt->man_start;
452 mant_bits_left = fmt->man_len;
453 mant_bits = (mant_bits_left % 32) > 0 ? mant_bits_left % 32 : 32;
455 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
457 len = xsnprintf (res, sizeof res, "%lx", mant);
459 mant_off += mant_bits;
460 mant_bits_left -= mant_bits;
462 while (mant_bits_left > 0)
464 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
466 xsnprintf (buf, sizeof buf, "%08lx", mant);
467 gdb_assert (len + strlen (buf) <= sizeof res);
468 strcat (res, buf);
470 mant_off += 32;
471 mant_bits_left -= 32;
474 return res;
477 /* Convert printf format string FORMAT to the otherwise equivalent string
478 which may be used to print a host floating-point number using the length
479 modifier LENGTH (which may be 0 if none is needed). If FORMAT is null,
480 return a format appropriate to print the full precision of a target
481 floating-point number of format FMT. */
482 static std::string
483 floatformat_printf_format (const struct floatformat *fmt,
484 const char *format, char length)
486 std::string host_format;
487 char conversion;
489 if (format == nullptr)
491 /* If no format was specified, print the number using a format string
492 where the precision is set to the DECIMAL_DIG value for the given
493 floating-point format. This value is computed as
495 ceil(1 + p * log10(b)),
497 where p is the precision of the floating-point format in bits, and
498 b is the base (which is always 2 for the formats we support). */
499 const double log10_2 = .30102999566398119521;
500 double d_decimal_dig = 1 + floatformat_precision (fmt) * log10_2;
501 int decimal_dig = d_decimal_dig;
502 if (decimal_dig < d_decimal_dig)
503 decimal_dig++;
505 host_format = string_printf ("%%.%d", decimal_dig);
506 conversion = 'g';
508 else
510 /* Use the specified format, stripping out the conversion character
511 and length modifier, if present. */
512 size_t len = strlen (format);
513 gdb_assert (len > 1);
514 conversion = format[--len];
515 gdb_assert (conversion == 'e' || conversion == 'f' || conversion == 'g'
516 || conversion == 'E' || conversion == 'G');
517 if (format[len - 1] == 'L')
518 len--;
520 host_format = std::string (format, len);
523 /* Add the length modifier and conversion character appropriate for
524 handling the appropriate host floating-point type. */
525 if (length)
526 host_format += length;
527 host_format += conversion;
529 return host_format;
532 /* Implementation of target_float_ops using the host floating-point type T
533 as intermediate type. */
535 template<typename T> class host_float_ops : public target_float_ops
537 public:
538 std::string to_string (const gdb_byte *addr, const struct type *type,
539 const char *format) const override;
540 bool from_string (gdb_byte *addr, const struct type *type,
541 const std::string &string) const override;
543 LONGEST to_longest (const gdb_byte *addr,
544 const struct type *type) const override;
545 void from_longest (gdb_byte *addr, const struct type *type,
546 LONGEST val) const override;
547 void from_ulongest (gdb_byte *addr, const struct type *type,
548 ULONGEST val) const override;
549 double to_host_double (const gdb_byte *addr,
550 const struct type *type) const override;
551 void from_host_double (gdb_byte *addr, const struct type *type,
552 double val) const override;
553 void convert (const gdb_byte *from, const struct type *from_type,
554 gdb_byte *to, const struct type *to_type) const override;
556 void binop (enum exp_opcode opcode,
557 const gdb_byte *x, const struct type *type_x,
558 const gdb_byte *y, const struct type *type_y,
559 gdb_byte *res, const struct type *type_res) const override;
560 int compare (const gdb_byte *x, const struct type *type_x,
561 const gdb_byte *y, const struct type *type_y) const override;
563 private:
564 void from_target (const struct floatformat *fmt,
565 const gdb_byte *from, T *to) const;
566 void from_target (const struct type *type,
567 const gdb_byte *from, T *to) const;
569 void to_target (const struct type *type,
570 const T *from, gdb_byte *to) const;
571 void to_target (const struct floatformat *fmt,
572 const T *from, gdb_byte *to) const;
576 /* Convert TO/FROM target to the host floating-point format T.
578 If the host and target formats agree, we just copy the raw data
579 into the appropriate type of variable and return, letting the host
580 increase precision as necessary. Otherwise, we call the conversion
581 routine and let it do the dirty work. Note that even if the target
582 and host floating-point formats match, the length of the types
583 might still be different, so the conversion routines must make sure
584 to not overrun any buffers. For example, on x86, long double is
585 the 80-bit extended precision type on both 32-bit and 64-bit ABIs,
586 but by default it is stored as 12 bytes on 32-bit, and 16 bytes on
587 64-bit, for alignment reasons. See comment in store_typed_floating
588 for a discussion about zeroing out remaining bytes in the target
589 buffer. */
591 static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
592 static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
593 static const struct floatformat *host_long_double_format
594 = GDB_HOST_LONG_DOUBLE_FORMAT;
596 /* Convert target floating-point value at FROM in format FMT to host
597 floating-point format of type T. */
598 template<typename T> void
599 host_float_ops<T>::from_target (const struct floatformat *fmt,
600 const gdb_byte *from, T *to) const
602 gdb_assert (fmt != NULL);
604 if (fmt == host_float_format)
606 float val = 0;
608 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
609 *to = val;
610 return;
612 else if (fmt == host_double_format)
614 double val = 0;
616 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
617 *to = val;
618 return;
620 else if (fmt == host_long_double_format)
622 long double val = 0;
624 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
625 *to = val;
626 return;
629 unsigned char *ufrom = (unsigned char *) from;
630 long exponent;
631 unsigned long mant;
632 unsigned int mant_bits, mant_off;
633 int mant_bits_left;
634 int special_exponent; /* It's a NaN, denorm or zero. */
635 enum floatformat_byteorders order;
636 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
637 enum float_kind kind;
639 gdb_assert (fmt->totalsize
640 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
642 /* For non-numbers, reuse libiberty's logic to find the correct
643 format. We do not lose any precision in this case by passing
644 through a double. */
645 kind = floatformat_classify (fmt, (const bfd_byte *) from);
646 if (kind == float_infinite || kind == float_nan)
648 double dto;
650 floatformat_to_double /* ARI: floatformat_to_double */
651 (fmt->split_half ? fmt->split_half : fmt, from, &dto);
652 *to = (T) dto;
653 return;
656 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
658 if (order != fmt->byteorder)
659 ufrom = newfrom;
661 if (fmt->split_half)
663 T dtop, dbot;
665 from_target (fmt->split_half, ufrom, &dtop);
666 /* Preserve the sign of 0, which is the sign of the top
667 half. */
668 if (dtop == 0.0)
670 *to = dtop;
671 return;
673 from_target (fmt->split_half,
674 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, &dbot);
675 *to = dtop + dbot;
676 return;
679 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
680 fmt->exp_len);
681 /* Note that if exponent indicates a NaN, we can't really do anything useful
682 (not knowing if the host has NaN's, or how to build one). So it will
683 end up as an infinity or something close; that is OK. */
685 mant_bits_left = fmt->man_len;
686 mant_off = fmt->man_start;
687 T dto = 0.0;
689 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
691 /* Don't bias NaNs. Use minimum exponent for denorms. For
692 simplicity, we don't check for zero as the exponent doesn't matter.
693 Note the cast to int; exp_bias is unsigned, so it's important to
694 make sure the operation is done in signed arithmetic. */
695 if (!special_exponent)
696 exponent -= fmt->exp_bias;
697 else if (exponent == 0)
698 exponent = 1 - fmt->exp_bias;
700 /* Build the result algebraically. Might go infinite, underflow, etc;
701 who cares. */
703 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
704 increment the exponent by one to account for the integer bit. */
706 if (!special_exponent)
708 if (fmt->intbit == floatformat_intbit_no)
709 dto = ldexp (1.0, exponent);
710 else
711 exponent++;
714 while (mant_bits_left > 0)
716 mant_bits = std::min (mant_bits_left, 32);
718 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
720 dto += ldexp ((T) mant, exponent - mant_bits);
721 exponent -= mant_bits;
722 mant_off += mant_bits;
723 mant_bits_left -= mant_bits;
726 /* Negate it if negative. */
727 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
728 dto = -dto;
729 *to = dto;
732 template<typename T> void
733 host_float_ops<T>::from_target (const struct type *type,
734 const gdb_byte *from, T *to) const
736 from_target (floatformat_from_type (type), from, to);
739 /* Convert host floating-point value of type T to target floating-point
740 value in format FMT and store at TO. */
741 template<typename T> void
742 host_float_ops<T>::to_target (const struct floatformat *fmt,
743 const T *from, gdb_byte *to) const
745 gdb_assert (fmt != NULL);
747 if (fmt == host_float_format)
749 float val = *from;
751 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
752 return;
754 else if (fmt == host_double_format)
756 double val = *from;
758 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
759 return;
761 else if (fmt == host_long_double_format)
763 long double val = *from;
765 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
766 return;
769 T dfrom;
770 int exponent;
771 T mant;
772 unsigned int mant_bits, mant_off;
773 int mant_bits_left;
774 unsigned char *uto = (unsigned char *) to;
775 enum floatformat_byteorders order = fmt->byteorder;
776 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
778 if (order != floatformat_little)
779 order = floatformat_big;
781 if (order != fmt->byteorder)
782 uto = newto;
784 memcpy (&dfrom, from, sizeof (dfrom));
785 memset (uto, 0, floatformat_totalsize_bytes (fmt));
787 if (fmt->split_half)
789 /* Use static volatile to ensure that any excess precision is
790 removed via storing in memory, and so the top half really is
791 the result of converting to double. */
792 static volatile double dtop, dbot;
793 T dtopnv, dbotnv;
795 dtop = (double) dfrom;
796 /* If the rounded top half is Inf, the bottom must be 0 not NaN
797 or Inf. */
798 if (dtop + dtop == dtop && dtop != 0.0)
799 dbot = 0.0;
800 else
801 dbot = (double) (dfrom - (T) dtop);
802 dtopnv = dtop;
803 dbotnv = dbot;
804 to_target (fmt->split_half, &dtopnv, uto);
805 to_target (fmt->split_half, &dbotnv,
806 uto + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
807 return;
810 if (dfrom == 0)
811 goto finalize_byteorder; /* Result is zero */
812 if (dfrom != dfrom) /* Result is NaN */
814 /* From is NaN */
815 put_field (uto, order, fmt->totalsize, fmt->exp_start,
816 fmt->exp_len, fmt->exp_nan);
817 /* Be sure it's not infinity, but NaN value is irrel. */
818 put_field (uto, order, fmt->totalsize, fmt->man_start,
819 fmt->man_len, 1);
820 goto finalize_byteorder;
823 /* If negative, set the sign bit. */
824 if (dfrom < 0)
826 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
827 dfrom = -dfrom;
830 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
832 /* Infinity exponent is same as NaN's. */
833 put_field (uto, order, fmt->totalsize, fmt->exp_start,
834 fmt->exp_len, fmt->exp_nan);
835 /* Infinity mantissa is all zeroes. */
836 put_field (uto, order, fmt->totalsize, fmt->man_start,
837 fmt->man_len, 0);
838 goto finalize_byteorder;
841 mant = frexp (dfrom, &exponent);
843 if (exponent + fmt->exp_bias <= 0)
845 /* The value is too small to be expressed in the destination
846 type (not enough bits in the exponent. Treat as 0. */
847 put_field (uto, order, fmt->totalsize, fmt->exp_start,
848 fmt->exp_len, 0);
849 put_field (uto, order, fmt->totalsize, fmt->man_start,
850 fmt->man_len, 0);
851 goto finalize_byteorder;
854 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
856 /* The value is too large to fit into the destination.
857 Treat as infinity. */
858 put_field (uto, order, fmt->totalsize, fmt->exp_start,
859 fmt->exp_len, fmt->exp_nan);
860 put_field (uto, order, fmt->totalsize, fmt->man_start,
861 fmt->man_len, 0);
862 goto finalize_byteorder;
865 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
866 exponent + fmt->exp_bias - 1);
868 mant_bits_left = fmt->man_len;
869 mant_off = fmt->man_start;
870 while (mant_bits_left > 0)
872 unsigned long mant_long;
874 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
876 mant *= 4294967296.0;
877 mant_long = ((unsigned long) mant) & 0xffffffffL;
878 mant -= mant_long;
880 /* If the integer bit is implicit, then we need to discard it.
881 If we are discarding a zero, we should be (but are not) creating
882 a denormalized number which means adjusting the exponent
883 (I think). */
884 if (mant_bits_left == fmt->man_len
885 && fmt->intbit == floatformat_intbit_no)
887 mant_long <<= 1;
888 mant_long &= 0xffffffffL;
889 /* If we are processing the top 32 mantissa bits of a doublest
890 so as to convert to a float value with implied integer bit,
891 we will only be putting 31 of those 32 bits into the
892 final value due to the discarding of the top bit. In the
893 case of a small float value where the number of mantissa
894 bits is less than 32, discarding the top bit does not alter
895 the number of bits we will be adding to the result. */
896 if (mant_bits == 32)
897 mant_bits -= 1;
900 if (mant_bits < 32)
902 /* The bits we want are in the most significant MANT_BITS bits of
903 mant_long. Move them to the least significant. */
904 mant_long >>= 32 - mant_bits;
907 put_field (uto, order, fmt->totalsize,
908 mant_off, mant_bits, mant_long);
909 mant_off += mant_bits;
910 mant_bits_left -= mant_bits;
913 finalize_byteorder:
914 /* Do we need to byte-swap the words in the result? */
915 if (order != fmt->byteorder)
916 floatformat_normalize_byteorder (fmt, newto, to);
919 template<typename T> void
920 host_float_ops<T>::to_target (const struct type *type,
921 const T *from, gdb_byte *to) const
923 /* Ensure possible padding bytes in the target buffer are zeroed out. */
924 memset (to, 0, type->length ());
926 to_target (floatformat_from_type (type), from, to);
929 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
930 to a string, optionally using the print format FORMAT. */
931 template<typename T> struct printf_length_modifier
933 static constexpr char value = 0;
935 template<> struct printf_length_modifier<long double>
937 static constexpr char value = 'L';
939 template<typename T> std::string
940 host_float_ops<T>::to_string (const gdb_byte *addr, const struct type *type,
941 const char *format) const
943 /* Determine the format string to use on the host side. */
944 constexpr char length = printf_length_modifier<T>::value;
945 const struct floatformat *fmt = floatformat_from_type (type);
946 std::string host_format = floatformat_printf_format (fmt, format, length);
948 T host_float;
949 from_target (type, addr, &host_float);
951 DIAGNOSTIC_PUSH
952 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
953 return string_printf (host_format.c_str (), host_float);
954 DIAGNOSTIC_POP
957 /* Parse string IN into a target floating-number of type TYPE and
958 store it as byte-stream ADDR. Return whether parsing succeeded. */
959 template<typename T> struct scanf_length_modifier
961 static constexpr char value = 0;
963 template<> struct scanf_length_modifier<double>
965 static constexpr char value = 'l';
967 template<> struct scanf_length_modifier<long double>
969 static constexpr char value = 'L';
971 template<typename T> bool
972 host_float_ops<T>::from_string (gdb_byte *addr, const struct type *type,
973 const std::string &in) const
975 T host_float;
976 int n, num;
978 std::string scan_format = "%";
979 if (scanf_length_modifier<T>::value)
980 scan_format += scanf_length_modifier<T>::value;
981 scan_format += "g%n";
983 DIAGNOSTIC_PUSH
984 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
985 num = sscanf (in.c_str (), scan_format.c_str(), &host_float, &n);
986 DIAGNOSTIC_POP
988 /* The sscanf man page suggests not making any assumptions on the effect
989 of %n on the result, so we don't.
990 That is why we simply test num == 0. */
991 if (num == 0)
992 return false;
994 /* We only accept the whole string. */
995 if (in[n])
996 return false;
998 to_target (type, &host_float, addr);
999 return true;
1002 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1003 to an integer value (rounding towards zero). */
1004 template<typename T> LONGEST
1005 host_float_ops<T>::to_longest (const gdb_byte *addr,
1006 const struct type *type) const
1008 T host_float;
1009 from_target (type, addr, &host_float);
1010 T min_possible_range = static_cast<T>(std::numeric_limits<LONGEST>::min());
1011 T max_possible_range = -min_possible_range;
1012 /* host_float can be converted to an integer as long as it's in
1013 the range [min_possible_range, max_possible_range). If not, it is either
1014 too large, or too small, or is NaN; in this case return the maximum or
1015 minimum possible value. */
1016 if (host_float < max_possible_range && host_float >= min_possible_range)
1017 return static_cast<LONGEST> (host_float);
1018 if (host_float < min_possible_range)
1019 return std::numeric_limits<LONGEST>::min();
1020 /* This line will be executed if host_float is NaN. */
1021 return std::numeric_limits<LONGEST>::max();
1024 /* Convert signed integer VAL to a target floating-number of type TYPE
1025 and store it as byte-stream ADDR. */
1026 template<typename T> void
1027 host_float_ops<T>::from_longest (gdb_byte *addr, const struct type *type,
1028 LONGEST val) const
1030 T host_float = (T) val;
1031 to_target (type, &host_float, addr);
1034 /* Convert unsigned integer VAL to a target floating-number of type TYPE
1035 and store it as byte-stream ADDR. */
1036 template<typename T> void
1037 host_float_ops<T>::from_ulongest (gdb_byte *addr, const struct type *type,
1038 ULONGEST val) const
1040 T host_float = (T) val;
1041 to_target (type, &host_float, addr);
1044 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1045 to a floating-point value in the host "double" format. */
1046 template<typename T> double
1047 host_float_ops<T>::to_host_double (const gdb_byte *addr,
1048 const struct type *type) const
1050 T host_float;
1051 from_target (type, addr, &host_float);
1052 return (double) host_float;
1055 /* Convert floating-point value VAL in the host "double" format to a target
1056 floating-number of type TYPE and store it as byte-stream ADDR. */
1057 template<typename T> void
1058 host_float_ops<T>::from_host_double (gdb_byte *addr, const struct type *type,
1059 double val) const
1061 T host_float = (T) val;
1062 to_target (type, &host_float, addr);
1065 /* Convert a floating-point number of type FROM_TYPE from the target
1066 byte-stream FROM to a floating-point number of type TO_TYPE, and
1067 store it to the target byte-stream TO. */
1068 template<typename T> void
1069 host_float_ops<T>::convert (const gdb_byte *from,
1070 const struct type *from_type,
1071 gdb_byte *to,
1072 const struct type *to_type) const
1074 T host_float;
1075 from_target (from_type, from, &host_float);
1076 to_target (to_type, &host_float, to);
1079 /* Perform the binary operation indicated by OPCODE, using as operands the
1080 target byte streams X and Y, interpreted as floating-point numbers of
1081 types TYPE_X and TYPE_Y, respectively. Convert the result to format
1082 TYPE_RES and store it into the byte-stream RES. */
1083 template<typename T> void
1084 host_float_ops<T>::binop (enum exp_opcode op,
1085 const gdb_byte *x, const struct type *type_x,
1086 const gdb_byte *y, const struct type *type_y,
1087 gdb_byte *res, const struct type *type_res) const
1089 T v1, v2, v = 0;
1091 from_target (type_x, x, &v1);
1092 from_target (type_y, y, &v2);
1094 switch (op)
1096 case BINOP_ADD:
1097 v = v1 + v2;
1098 break;
1100 case BINOP_SUB:
1101 v = v1 - v2;
1102 break;
1104 case BINOP_MUL:
1105 v = v1 * v2;
1106 break;
1108 case BINOP_DIV:
1109 v = v1 / v2;
1110 break;
1112 case BINOP_EXP:
1113 errno = 0;
1114 v = pow (v1, v2);
1115 if (errno)
1116 error (_("Cannot perform exponentiation: %s"),
1117 safe_strerror (errno));
1118 break;
1120 case BINOP_MIN:
1121 v = v1 < v2 ? v1 : v2;
1122 break;
1124 case BINOP_MAX:
1125 v = v1 > v2 ? v1 : v2;
1126 break;
1128 default:
1129 error (_("Integer-only operation on floating point number."));
1130 break;
1133 to_target (type_res, &v, res);
1136 /* Compare the two target byte streams X and Y, interpreted as floating-point
1137 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
1138 are equal, -1 if X is less than Y, and 1 otherwise. */
1139 template<typename T> int
1140 host_float_ops<T>::compare (const gdb_byte *x, const struct type *type_x,
1141 const gdb_byte *y, const struct type *type_y) const
1143 T v1, v2;
1145 from_target (type_x, x, &v1);
1146 from_target (type_y, y, &v2);
1148 if (v1 == v2)
1149 return 0;
1150 if (v1 < v2)
1151 return -1;
1152 return 1;
1156 /* Implementation of target_float_ops using the MPFR library
1157 mpfr_t as intermediate type. */
1159 #define MPFR_USE_INTMAX_T
1161 #include <mpfr.h>
1163 class mpfr_float_ops : public target_float_ops
1165 public:
1166 std::string to_string (const gdb_byte *addr, const struct type *type,
1167 const char *format) const override;
1168 bool from_string (gdb_byte *addr, const struct type *type,
1169 const std::string &string) const override;
1171 LONGEST to_longest (const gdb_byte *addr,
1172 const struct type *type) const override;
1173 void from_longest (gdb_byte *addr, const struct type *type,
1174 LONGEST val) const override;
1175 void from_ulongest (gdb_byte *addr, const struct type *type,
1176 ULONGEST val) const override;
1177 double to_host_double (const gdb_byte *addr,
1178 const struct type *type) const override;
1179 void from_host_double (gdb_byte *addr, const struct type *type,
1180 double val) const override;
1181 void convert (const gdb_byte *from, const struct type *from_type,
1182 gdb_byte *to, const struct type *to_type) const override;
1184 void binop (enum exp_opcode opcode,
1185 const gdb_byte *x, const struct type *type_x,
1186 const gdb_byte *y, const struct type *type_y,
1187 gdb_byte *res, const struct type *type_res) const override;
1188 int compare (const gdb_byte *x, const struct type *type_x,
1189 const gdb_byte *y, const struct type *type_y) const override;
1191 private:
1192 /* Local wrapper class to handle mpfr_t initialization and cleanup. */
1193 class gdb_mpfr
1195 public:
1196 mpfr_t val;
1198 gdb_mpfr (const struct type *type)
1200 const struct floatformat *fmt = floatformat_from_type (type);
1201 mpfr_init2 (val, floatformat_precision (fmt));
1204 gdb_mpfr (const gdb_mpfr &source)
1206 mpfr_init2 (val, mpfr_get_prec (source.val));
1209 ~gdb_mpfr ()
1211 mpfr_clear (val);
1215 void from_target (const struct floatformat *fmt,
1216 const gdb_byte *from, gdb_mpfr &to) const;
1217 void from_target (const struct type *type,
1218 const gdb_byte *from, gdb_mpfr &to) const;
1220 void to_target (const struct type *type,
1221 const gdb_mpfr &from, gdb_byte *to) const;
1222 void to_target (const struct floatformat *fmt,
1223 const gdb_mpfr &from, gdb_byte *to) const;
1227 /* Convert TO/FROM target floating-point format to mpfr_t. */
1229 void
1230 mpfr_float_ops::from_target (const struct floatformat *fmt,
1231 const gdb_byte *orig_from, gdb_mpfr &to) const
1233 const gdb_byte *from = orig_from;
1234 mpfr_exp_t exponent;
1235 unsigned long mant;
1236 unsigned int mant_bits, mant_off;
1237 int mant_bits_left;
1238 int special_exponent; /* It's a NaN, denorm or zero. */
1239 enum floatformat_byteorders order;
1240 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
1241 enum float_kind kind;
1243 gdb_assert (fmt->totalsize
1244 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
1246 /* Handle non-numbers. */
1247 kind = floatformat_classify (fmt, from);
1248 if (kind == float_infinite)
1250 mpfr_set_inf (to.val, floatformat_is_negative (fmt, from) ? -1 : 1);
1251 return;
1253 if (kind == float_nan)
1255 mpfr_set_nan (to.val);
1256 return;
1259 order = floatformat_normalize_byteorder (fmt, from, newfrom);
1261 if (order != fmt->byteorder)
1262 from = newfrom;
1264 if (fmt->split_half)
1266 gdb_mpfr top (to), bot (to);
1268 from_target (fmt->split_half, from, top);
1269 /* Preserve the sign of 0, which is the sign of the top half. */
1270 if (mpfr_zero_p (top.val))
1272 mpfr_set (to.val, top.val, MPFR_RNDN);
1273 return;
1275 from_target (fmt->split_half,
1276 from + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, bot);
1277 mpfr_add (to.val, top.val, bot.val, MPFR_RNDN);
1278 return;
1281 exponent = get_field (from, order, fmt->totalsize, fmt->exp_start,
1282 fmt->exp_len);
1283 /* Note that if exponent indicates a NaN, we can't really do anything useful
1284 (not knowing if the host has NaN's, or how to build one). So it will
1285 end up as an infinity or something close; that is OK. */
1287 mant_bits_left = fmt->man_len;
1288 mant_off = fmt->man_start;
1289 mpfr_set_zero (to.val, 0);
1291 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
1293 /* Don't bias NaNs. Use minimum exponent for denorms. For
1294 simplicity, we don't check for zero as the exponent doesn't matter.
1295 Note the cast to int; exp_bias is unsigned, so it's important to
1296 make sure the operation is done in signed arithmetic. */
1297 if (!special_exponent)
1298 exponent -= fmt->exp_bias;
1299 else if (exponent == 0)
1300 exponent = 1 - fmt->exp_bias;
1302 /* Build the result algebraically. Might go infinite, underflow, etc;
1303 who cares. */
1305 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
1306 increment the exponent by one to account for the integer bit. */
1308 if (!special_exponent)
1310 if (fmt->intbit == floatformat_intbit_no)
1311 mpfr_set_ui_2exp (to.val, 1, exponent, MPFR_RNDN);
1312 else
1313 exponent++;
1316 gdb_mpfr tmp (to);
1318 while (mant_bits_left > 0)
1320 mant_bits = std::min (mant_bits_left, 32);
1322 mant = get_field (from, order, fmt->totalsize, mant_off, mant_bits);
1324 mpfr_set_ui (tmp.val, mant, MPFR_RNDN);
1325 mpfr_mul_2si (tmp.val, tmp.val, exponent - mant_bits, MPFR_RNDN);
1326 mpfr_add (to.val, to.val, tmp.val, MPFR_RNDN);
1327 exponent -= mant_bits;
1328 mant_off += mant_bits;
1329 mant_bits_left -= mant_bits;
1332 /* Negate it if negative. */
1333 if (get_field (from, order, fmt->totalsize, fmt->sign_start, 1))
1334 mpfr_neg (to.val, to.val, MPFR_RNDN);
1337 void
1338 mpfr_float_ops::from_target (const struct type *type,
1339 const gdb_byte *from, gdb_mpfr &to) const
1341 from_target (floatformat_from_type (type), from, to);
1344 void
1345 mpfr_float_ops::to_target (const struct floatformat *fmt,
1346 const gdb_mpfr &from, gdb_byte *orig_to) const
1348 unsigned char *to = orig_to;
1349 mpfr_exp_t exponent;
1350 unsigned int mant_bits, mant_off;
1351 int mant_bits_left;
1352 enum floatformat_byteorders order = fmt->byteorder;
1353 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
1355 if (order != floatformat_little)
1356 order = floatformat_big;
1358 if (order != fmt->byteorder)
1359 to = newto;
1361 memset (to, 0, floatformat_totalsize_bytes (fmt));
1363 if (fmt->split_half)
1365 gdb_mpfr top (from), bot (from);
1367 mpfr_set (top.val, from.val, MPFR_RNDN);
1368 /* If the rounded top half is Inf, the bottom must be 0 not NaN
1369 or Inf. */
1370 if (mpfr_inf_p (top.val))
1371 mpfr_set_zero (bot.val, 0);
1372 else
1373 mpfr_sub (bot.val, from.val, top.val, MPFR_RNDN);
1375 to_target (fmt->split_half, top, to);
1376 to_target (fmt->split_half, bot,
1377 to + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
1378 return;
1381 gdb_mpfr tmp (from);
1383 if (mpfr_zero_p (from.val))
1384 goto finalize_byteorder; /* Result is zero */
1386 mpfr_set (tmp.val, from.val, MPFR_RNDN);
1388 if (mpfr_nan_p (tmp.val)) /* Result is NaN */
1390 /* From is NaN */
1391 put_field (to, order, fmt->totalsize, fmt->exp_start,
1392 fmt->exp_len, fmt->exp_nan);
1393 /* Be sure it's not infinity, but NaN value is irrel. */
1394 put_field (to, order, fmt->totalsize, fmt->man_start,
1395 fmt->man_len, 1);
1396 goto finalize_byteorder;
1399 /* If negative, set the sign bit. */
1400 if (mpfr_sgn (tmp.val) < 0)
1402 put_field (to, order, fmt->totalsize, fmt->sign_start, 1, 1);
1403 mpfr_neg (tmp.val, tmp.val, MPFR_RNDN);
1406 if (mpfr_inf_p (tmp.val)) /* Result is Infinity. */
1408 /* Infinity exponent is same as NaN's. */
1409 put_field (to, order, fmt->totalsize, fmt->exp_start,
1410 fmt->exp_len, fmt->exp_nan);
1411 /* Infinity mantissa is all zeroes. */
1412 put_field (to, order, fmt->totalsize, fmt->man_start,
1413 fmt->man_len, 0);
1414 goto finalize_byteorder;
1417 mpfr_frexp (&exponent, tmp.val, tmp.val, MPFR_RNDN);
1419 if (exponent + fmt->exp_bias <= 0)
1421 /* The value is too small to be expressed in the destination
1422 type (not enough bits in the exponent. Treat as 0. */
1423 put_field (to, order, fmt->totalsize, fmt->exp_start,
1424 fmt->exp_len, 0);
1425 put_field (to, order, fmt->totalsize, fmt->man_start,
1426 fmt->man_len, 0);
1427 goto finalize_byteorder;
1430 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
1432 /* The value is too large to fit into the destination.
1433 Treat as infinity. */
1434 put_field (to, order, fmt->totalsize, fmt->exp_start,
1435 fmt->exp_len, fmt->exp_nan);
1436 put_field (to, order, fmt->totalsize, fmt->man_start,
1437 fmt->man_len, 0);
1438 goto finalize_byteorder;
1441 put_field (to, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
1442 exponent + fmt->exp_bias - 1);
1444 mant_bits_left = fmt->man_len;
1445 mant_off = fmt->man_start;
1446 while (mant_bits_left > 0)
1448 unsigned long mant_long;
1450 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
1452 mpfr_mul_2ui (tmp.val, tmp.val, 32, MPFR_RNDN);
1453 mant_long = mpfr_get_ui (tmp.val, MPFR_RNDZ) & 0xffffffffL;
1454 mpfr_sub_ui (tmp.val, tmp.val, mant_long, MPFR_RNDZ);
1456 /* If the integer bit is implicit, then we need to discard it.
1457 If we are discarding a zero, we should be (but are not) creating
1458 a denormalized number which means adjusting the exponent
1459 (I think). */
1460 if (mant_bits_left == fmt->man_len
1461 && fmt->intbit == floatformat_intbit_no)
1463 mant_long <<= 1;
1464 mant_long &= 0xffffffffL;
1465 /* If we are processing the top 32 mantissa bits of a doublest
1466 so as to convert to a float value with implied integer bit,
1467 we will only be putting 31 of those 32 bits into the
1468 final value due to the discarding of the top bit. In the
1469 case of a small float value where the number of mantissa
1470 bits is less than 32, discarding the top bit does not alter
1471 the number of bits we will be adding to the result. */
1472 if (mant_bits == 32)
1473 mant_bits -= 1;
1476 if (mant_bits < 32)
1478 /* The bits we want are in the most significant MANT_BITS bits of
1479 mant_long. Move them to the least significant. */
1480 mant_long >>= 32 - mant_bits;
1483 put_field (to, order, fmt->totalsize,
1484 mant_off, mant_bits, mant_long);
1485 mant_off += mant_bits;
1486 mant_bits_left -= mant_bits;
1489 finalize_byteorder:
1490 /* Do we need to byte-swap the words in the result? */
1491 if (order != fmt->byteorder)
1492 floatformat_normalize_byteorder (fmt, newto, orig_to);
1495 void
1496 mpfr_float_ops::to_target (const struct type *type,
1497 const gdb_mpfr &from, gdb_byte *to) const
1499 /* Ensure possible padding bytes in the target buffer are zeroed out. */
1500 memset (to, 0, type->length ());
1502 to_target (floatformat_from_type (type), from, to);
1505 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1506 to a string, optionally using the print format FORMAT. */
1507 std::string
1508 mpfr_float_ops::to_string (const gdb_byte *addr,
1509 const struct type *type,
1510 const char *format) const
1512 const struct floatformat *fmt = floatformat_from_type (type);
1514 /* Unless we need to adhere to a specific format, provide special
1515 output for certain cases. */
1516 if (format == nullptr)
1518 /* Detect invalid representations. */
1519 if (!floatformat_is_valid (fmt, addr))
1520 return "<invalid float value>";
1522 /* Handle NaN and Inf. */
1523 enum float_kind kind = floatformat_classify (fmt, addr);
1524 if (kind == float_nan)
1526 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1527 const char *mantissa = floatformat_mantissa (fmt, addr);
1528 return string_printf ("%snan(0x%s)", sign, mantissa);
1530 else if (kind == float_infinite)
1532 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1533 return string_printf ("%sinf", sign);
1537 /* Determine the format string to use on the host side. */
1538 std::string host_format = floatformat_printf_format (fmt, format, 'R');
1540 gdb_mpfr tmp (type);
1541 from_target (type, addr, tmp);
1543 int size = mpfr_snprintf (NULL, 0, host_format.c_str (), tmp.val);
1544 std::string str (size, '\0');
1545 mpfr_sprintf (&str[0], host_format.c_str (), tmp.val);
1547 return str;
1550 /* Parse string STRING into a target floating-number of type TYPE and
1551 store it as byte-stream ADDR. Return whether parsing succeeded. */
1552 bool
1553 mpfr_float_ops::from_string (gdb_byte *addr,
1554 const struct type *type,
1555 const std::string &in) const
1557 gdb_mpfr tmp (type);
1559 char *endptr;
1560 mpfr_strtofr (tmp.val, in.c_str (), &endptr, 0, MPFR_RNDN);
1562 /* We only accept the whole string. */
1563 if (*endptr)
1564 return false;
1566 to_target (type, tmp, addr);
1567 return true;
1570 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1571 to an integer value (rounding towards zero). */
1572 LONGEST
1573 mpfr_float_ops::to_longest (const gdb_byte *addr,
1574 const struct type *type) const
1576 gdb_mpfr tmp (type);
1577 from_target (type, addr, tmp);
1578 return mpfr_get_sj (tmp.val, MPFR_RNDZ);
1581 /* Convert signed integer VAL to a target floating-number of type TYPE
1582 and store it as byte-stream ADDR. */
1583 void
1584 mpfr_float_ops::from_longest (gdb_byte *addr,
1585 const struct type *type,
1586 LONGEST val) const
1588 gdb_mpfr tmp (type);
1589 mpfr_set_sj (tmp.val, val, MPFR_RNDN);
1590 to_target (type, tmp, addr);
1593 /* Convert unsigned integer VAL to a target floating-number of type TYPE
1594 and store it as byte-stream ADDR. */
1595 void
1596 mpfr_float_ops::from_ulongest (gdb_byte *addr,
1597 const struct type *type,
1598 ULONGEST val) const
1600 gdb_mpfr tmp (type);
1601 mpfr_set_uj (tmp.val, val, MPFR_RNDN);
1602 to_target (type, tmp, addr);
1605 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1606 to a floating-point value in the host "double" format. */
1607 double
1608 mpfr_float_ops::to_host_double (const gdb_byte *addr,
1609 const struct type *type) const
1611 gdb_mpfr tmp (type);
1612 from_target (type, addr, tmp);
1613 return mpfr_get_d (tmp.val, MPFR_RNDN);
1616 /* Convert floating-point value VAL in the host "double" format to a target
1617 floating-number of type TYPE and store it as byte-stream ADDR. */
1618 void
1619 mpfr_float_ops::from_host_double (gdb_byte *addr,
1620 const struct type *type,
1621 double val) const
1623 gdb_mpfr tmp (type);
1624 mpfr_set_d (tmp.val, val, MPFR_RNDN);
1625 to_target (type, tmp, addr);
1628 /* Convert a floating-point number of type FROM_TYPE from the target
1629 byte-stream FROM to a floating-point number of type TO_TYPE, and
1630 store it to the target byte-stream TO. */
1631 void
1632 mpfr_float_ops::convert (const gdb_byte *from,
1633 const struct type *from_type,
1634 gdb_byte *to,
1635 const struct type *to_type) const
1637 gdb_mpfr from_tmp (from_type), to_tmp (to_type);
1638 from_target (from_type, from, from_tmp);
1639 mpfr_set (to_tmp.val, from_tmp.val, MPFR_RNDN);
1640 to_target (to_type, to_tmp, to);
1643 /* Perform the binary operation indicated by OPCODE, using as operands the
1644 target byte streams X and Y, interpreted as floating-point numbers of
1645 types TYPE_X and TYPE_Y, respectively. Convert the result to type
1646 TYPE_RES and store it into the byte-stream RES. */
1647 void
1648 mpfr_float_ops::binop (enum exp_opcode op,
1649 const gdb_byte *x, const struct type *type_x,
1650 const gdb_byte *y, const struct type *type_y,
1651 gdb_byte *res, const struct type *type_res) const
1653 gdb_mpfr x_tmp (type_x), y_tmp (type_y), tmp (type_res);
1655 from_target (type_x, x, x_tmp);
1656 from_target (type_y, y, y_tmp);
1658 switch (op)
1660 case BINOP_ADD:
1661 mpfr_add (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1662 break;
1664 case BINOP_SUB:
1665 mpfr_sub (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1666 break;
1668 case BINOP_MUL:
1669 mpfr_mul (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1670 break;
1672 case BINOP_DIV:
1673 mpfr_div (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1674 break;
1676 case BINOP_EXP:
1677 mpfr_pow (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1678 break;
1680 case BINOP_MIN:
1681 mpfr_min (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1682 break;
1684 case BINOP_MAX:
1685 mpfr_max (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1686 break;
1688 default:
1689 error (_("Integer-only operation on floating point number."));
1690 break;
1693 to_target (type_res, tmp, res);
1696 /* Compare the two target byte streams X and Y, interpreted as floating-point
1697 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
1698 are equal, -1 if X is less than Y, and 1 otherwise. */
1700 mpfr_float_ops::compare (const gdb_byte *x, const struct type *type_x,
1701 const gdb_byte *y, const struct type *type_y) const
1703 gdb_mpfr x_tmp (type_x), y_tmp (type_y);
1705 from_target (type_x, x, x_tmp);
1706 from_target (type_y, y, y_tmp);
1708 if (mpfr_equal_p (x_tmp.val, y_tmp.val))
1709 return 0;
1710 else if (mpfr_less_p (x_tmp.val, y_tmp.val))
1711 return -1;
1712 else
1713 return 1;
1717 /* Helper routines operating on decimal floating-point data. */
1719 /* Decimal floating point is one of the extension to IEEE 754, which is
1720 described in http://grouper.ieee.org/groups/754/revision.html and
1721 http://www2.hursley.ibm.com/decimal/. It completes binary floating
1722 point by representing floating point more exactly. */
1724 /* The order of the following headers is important for making sure
1725 decNumber structure is large enough to hold decimal128 digits. */
1727 #include "dpd/decimal128.h"
1728 #include "dpd/decimal64.h"
1729 #include "dpd/decimal32.h"
1731 /* When using decimal128, this is the maximum string length + 1
1732 (value comes from libdecnumber's DECIMAL128_String constant). */
1733 #define MAX_DECIMAL_STRING 43
1735 /* In GDB, we are using an array of gdb_byte to represent decimal values.
1736 They are stored in host byte order. This routine does the conversion if
1737 the target byte order is different. */
1738 static void
1739 match_endianness (const gdb_byte *from, const struct type *type, gdb_byte *to)
1741 gdb_assert (type->code () == TYPE_CODE_DECFLOAT);
1743 int len = type->length ();
1744 int i;
1746 #if WORDS_BIGENDIAN
1747 #define OPPOSITE_BYTE_ORDER BFD_ENDIAN_LITTLE
1748 #else
1749 #define OPPOSITE_BYTE_ORDER BFD_ENDIAN_BIG
1750 #endif
1752 if (type_byte_order (type) == OPPOSITE_BYTE_ORDER)
1753 for (i = 0; i < len; i++)
1754 to[i] = from[len - i - 1];
1755 else
1756 for (i = 0; i < len; i++)
1757 to[i] = from[i];
1759 return;
1762 /* Helper function to get the appropriate libdecnumber context for each size
1763 of decimal float. */
1764 static void
1765 set_decnumber_context (decContext *ctx, const struct type *type)
1767 gdb_assert (type->code () == TYPE_CODE_DECFLOAT);
1769 switch (type->length ())
1771 case 4:
1772 decContextDefault (ctx, DEC_INIT_DECIMAL32);
1773 break;
1774 case 8:
1775 decContextDefault (ctx, DEC_INIT_DECIMAL64);
1776 break;
1777 case 16:
1778 decContextDefault (ctx, DEC_INIT_DECIMAL128);
1779 break;
1782 ctx->traps = 0;
1785 /* Check for errors signaled in the decimal context structure. */
1786 static void
1787 decimal_check_errors (decContext *ctx)
1789 /* An error here could be a division by zero, an overflow, an underflow or
1790 an invalid operation (from the DEC_Errors constant in decContext.h).
1791 Since GDB doesn't complain about division by zero, overflow or underflow
1792 errors for binary floating, we won't complain about them for decimal
1793 floating either. */
1794 if (ctx->status & DEC_IEEE_854_Invalid_operation)
1796 /* Leave only the error bits in the status flags. */
1797 ctx->status &= DEC_IEEE_854_Invalid_operation;
1798 error (_("Cannot perform operation: %s"),
1799 decContextStatusToString (ctx));
1803 /* Helper function to convert from libdecnumber's appropriate representation
1804 for computation to each size of decimal float. */
1805 static void
1806 decimal_from_number (const decNumber *from,
1807 gdb_byte *to, const struct type *type)
1809 gdb_byte dec[16];
1811 decContext set;
1813 set_decnumber_context (&set, type);
1815 switch (type->length ())
1817 case 4:
1818 decimal32FromNumber ((decimal32 *) dec, from, &set);
1819 break;
1820 case 8:
1821 decimal64FromNumber ((decimal64 *) dec, from, &set);
1822 break;
1823 case 16:
1824 decimal128FromNumber ((decimal128 *) dec, from, &set);
1825 break;
1826 default:
1827 error (_("Unknown decimal floating point type."));
1828 break;
1831 match_endianness (dec, type, to);
1834 /* Helper function to convert each size of decimal float to libdecnumber's
1835 appropriate representation for computation. */
1836 static void
1837 decimal_to_number (const gdb_byte *addr, const struct type *type,
1838 decNumber *to)
1840 gdb_byte dec[16];
1841 match_endianness (addr, type, dec);
1843 switch (type->length ())
1845 case 4:
1846 decimal32ToNumber ((decimal32 *) dec, to);
1847 break;
1848 case 8:
1849 decimal64ToNumber ((decimal64 *) dec, to);
1850 break;
1851 case 16:
1852 decimal128ToNumber ((decimal128 *) dec, to);
1853 break;
1854 default:
1855 error (_("Unknown decimal floating point type."));
1856 break;
1860 /* Returns true if ADDR (which is of type TYPE) is the number zero. */
1861 static bool
1862 decimal_is_zero (const gdb_byte *addr, const struct type *type)
1864 decNumber number;
1866 decimal_to_number (addr, type, &number);
1868 return decNumberIsZero (&number);
1872 /* Implementation of target_float_ops using the libdecnumber decNumber type
1873 as intermediate format. */
1875 class decimal_float_ops : public target_float_ops
1877 public:
1878 std::string to_string (const gdb_byte *addr, const struct type *type,
1879 const char *format) const override;
1880 bool from_string (gdb_byte *addr, const struct type *type,
1881 const std::string &string) const override;
1883 LONGEST to_longest (const gdb_byte *addr,
1884 const struct type *type) const override;
1885 void from_longest (gdb_byte *addr, const struct type *type,
1886 LONGEST val) const override;
1887 void from_ulongest (gdb_byte *addr, const struct type *type,
1888 ULONGEST val) const override;
1889 double to_host_double (const gdb_byte *addr,
1890 const struct type *type) const override
1892 /* We don't support conversions between target decimal floating-point
1893 types and the host double type. */
1894 gdb_assert_not_reached ("invalid operation on decimal float");
1896 void from_host_double (gdb_byte *addr, const struct type *type,
1897 double val) const override
1899 /* We don't support conversions between target decimal floating-point
1900 types and the host double type. */
1901 gdb_assert_not_reached ("invalid operation on decimal float");
1903 void convert (const gdb_byte *from, const struct type *from_type,
1904 gdb_byte *to, const struct type *to_type) const override;
1906 void binop (enum exp_opcode opcode,
1907 const gdb_byte *x, const struct type *type_x,
1908 const gdb_byte *y, const struct type *type_y,
1909 gdb_byte *res, const struct type *type_res) const override;
1910 int compare (const gdb_byte *x, const struct type *type_x,
1911 const gdb_byte *y, const struct type *type_y) const override;
1914 /* Convert decimal type to its string representation. LEN is the length
1915 of the decimal type, 4 bytes for decimal32, 8 bytes for decimal64 and
1916 16 bytes for decimal128. */
1917 std::string
1918 decimal_float_ops::to_string (const gdb_byte *addr, const struct type *type,
1919 const char *format = nullptr) const
1921 gdb_byte dec[16];
1923 match_endianness (addr, type, dec);
1925 if (format != nullptr)
1927 /* We don't handle format strings (yet). If the host printf supports
1928 decimal floating point types, just use this. Otherwise, fall back
1929 to printing the number while ignoring the format string. */
1930 #if defined (PRINTF_HAS_DECFLOAT)
1931 /* FIXME: This makes unwarranted assumptions about the host ABI! */
1932 return string_printf (format, dec);
1933 #endif
1936 std::string result;
1937 result.resize (MAX_DECIMAL_STRING);
1939 switch (type->length ())
1941 case 4:
1942 decimal32ToString ((decimal32 *) dec, &result[0]);
1943 break;
1944 case 8:
1945 decimal64ToString ((decimal64 *) dec, &result[0]);
1946 break;
1947 case 16:
1948 decimal128ToString ((decimal128 *) dec, &result[0]);
1949 break;
1950 default:
1951 error (_("Unknown decimal floating point type."));
1952 break;
1955 return result;
1958 /* Convert the string form of a decimal value to its decimal representation.
1959 LEN is the length of the decimal type, 4 bytes for decimal32, 8 bytes for
1960 decimal64 and 16 bytes for decimal128. */
1961 bool
1962 decimal_float_ops::from_string (gdb_byte *addr, const struct type *type,
1963 const std::string &string) const
1965 decContext set;
1966 gdb_byte dec[16];
1968 set_decnumber_context (&set, type);
1970 switch (type->length ())
1972 case 4:
1973 decimal32FromString ((decimal32 *) dec, string.c_str (), &set);
1974 break;
1975 case 8:
1976 decimal64FromString ((decimal64 *) dec, string.c_str (), &set);
1977 break;
1978 case 16:
1979 decimal128FromString ((decimal128 *) dec, string.c_str (), &set);
1980 break;
1981 default:
1982 error (_("Unknown decimal floating point type."));
1983 break;
1986 match_endianness (dec, type, addr);
1988 /* Check for errors in the DFP operation. */
1989 decimal_check_errors (&set);
1991 return true;
1994 /* Converts a LONGEST to a decimal float of specified LEN bytes. */
1995 void
1996 decimal_float_ops::from_longest (gdb_byte *addr, const struct type *type,
1997 LONGEST from) const
1999 decNumber number;
2001 if ((int32_t) from != from)
2002 /* libdecnumber can convert only 32-bit integers. */
2003 error (_("Conversion of large integer to a "
2004 "decimal floating type is not supported."));
2006 decNumberFromInt32 (&number, (int32_t) from);
2008 decimal_from_number (&number, addr, type);
2011 /* Converts a ULONGEST to a decimal float of specified LEN bytes. */
2012 void
2013 decimal_float_ops::from_ulongest (gdb_byte *addr, const struct type *type,
2014 ULONGEST from) const
2016 decNumber number;
2018 if ((uint32_t) from != from)
2019 /* libdecnumber can convert only 32-bit integers. */
2020 error (_("Conversion of large integer to a "
2021 "decimal floating type is not supported."));
2023 decNumberFromUInt32 (&number, (uint32_t) from);
2025 decimal_from_number (&number, addr, type);
2028 /* Converts a decimal float of LEN bytes to a LONGEST. */
2029 LONGEST
2030 decimal_float_ops::to_longest (const gdb_byte *addr,
2031 const struct type *type) const
2033 /* libdecnumber has a function to convert from decimal to integer, but
2034 it doesn't work when the decimal number has a fractional part. */
2035 std::string str = to_string (addr, type);
2036 return strtoll (str.c_str (), NULL, 10);
2039 /* Perform operation OP with operands X and Y with sizes LEN_X and LEN_Y
2040 and byte orders BYTE_ORDER_X and BYTE_ORDER_Y, and store value in
2041 RESULT with size LEN_RESULT and byte order BYTE_ORDER_RESULT. */
2042 void
2043 decimal_float_ops::binop (enum exp_opcode op,
2044 const gdb_byte *x, const struct type *type_x,
2045 const gdb_byte *y, const struct type *type_y,
2046 gdb_byte *res, const struct type *type_res) const
2048 decContext set;
2049 decNumber number1, number2, number3;
2051 decimal_to_number (x, type_x, &number1);
2052 decimal_to_number (y, type_y, &number2);
2054 set_decnumber_context (&set, type_res);
2056 switch (op)
2058 case BINOP_ADD:
2059 decNumberAdd (&number3, &number1, &number2, &set);
2060 break;
2061 case BINOP_SUB:
2062 decNumberSubtract (&number3, &number1, &number2, &set);
2063 break;
2064 case BINOP_MUL:
2065 decNumberMultiply (&number3, &number1, &number2, &set);
2066 break;
2067 case BINOP_DIV:
2068 decNumberDivide (&number3, &number1, &number2, &set);
2069 break;
2070 case BINOP_EXP:
2071 decNumberPower (&number3, &number1, &number2, &set);
2072 break;
2073 default:
2074 error (_("Operation not valid for decimal floating point number."));
2075 break;
2078 /* Check for errors in the DFP operation. */
2079 decimal_check_errors (&set);
2081 decimal_from_number (&number3, res, type_res);
2084 /* Compares two numbers numerically. If X is less than Y then the return value
2085 will be -1. If they are equal, then the return value will be 0. If X is
2086 greater than the Y then the return value will be 1. */
2088 decimal_float_ops::compare (const gdb_byte *x, const struct type *type_x,
2089 const gdb_byte *y, const struct type *type_y) const
2091 decNumber number1, number2, result;
2092 decContext set;
2093 const struct type *type_result;
2095 decimal_to_number (x, type_x, &number1);
2096 decimal_to_number (y, type_y, &number2);
2098 /* Perform the comparison in the larger of the two sizes. */
2099 type_result = type_x->length () > type_y->length () ? type_x : type_y;
2100 set_decnumber_context (&set, type_result);
2102 decNumberCompare (&result, &number1, &number2, &set);
2104 /* Check for errors in the DFP operation. */
2105 decimal_check_errors (&set);
2107 if (decNumberIsNaN (&result))
2108 error (_("Comparison with an invalid number (NaN)."));
2109 else if (decNumberIsZero (&result))
2110 return 0;
2111 else if (decNumberIsNegative (&result))
2112 return -1;
2113 else
2114 return 1;
2117 /* Convert a decimal value from a decimal type with LEN_FROM bytes to a
2118 decimal type with LEN_TO bytes. */
2119 void
2120 decimal_float_ops::convert (const gdb_byte *from, const struct type *from_type,
2121 gdb_byte *to, const struct type *to_type) const
2123 decNumber number;
2125 decimal_to_number (from, from_type, &number);
2126 decimal_from_number (&number, to, to_type);
2130 /* Typed floating-point routines. These routines operate on floating-point
2131 values in target format, represented by a byte buffer interpreted as a
2132 "struct type", which may be either a binary or decimal floating-point
2133 type (TYPE_CODE_FLT or TYPE_CODE_DECFLOAT). */
2135 /* Return whether TYPE1 and TYPE2 are of the same category (binary or
2136 decimal floating-point). */
2137 static bool
2138 target_float_same_category_p (const struct type *type1,
2139 const struct type *type2)
2141 return type1->code () == type2->code ();
2144 /* Return whether TYPE1 and TYPE2 use the same floating-point format. */
2145 static bool
2146 target_float_same_format_p (const struct type *type1,
2147 const struct type *type2)
2149 if (!target_float_same_category_p (type1, type2))
2150 return false;
2152 switch (type1->code ())
2154 case TYPE_CODE_FLT:
2155 return floatformat_from_type (type1) == floatformat_from_type (type2);
2157 case TYPE_CODE_DECFLOAT:
2158 return (type1->length () == type2->length ()
2159 && (type_byte_order (type1)
2160 == type_byte_order (type2)));
2162 default:
2163 gdb_assert_not_reached ("unexpected type code");
2167 /* Return the size (without padding) of the target floating-point
2168 format used by TYPE. */
2169 static int
2170 target_float_format_length (const struct type *type)
2172 switch (type->code ())
2174 case TYPE_CODE_FLT:
2175 return floatformat_totalsize_bytes (floatformat_from_type (type));
2177 case TYPE_CODE_DECFLOAT:
2178 return type->length ();
2180 default:
2181 gdb_assert_not_reached ("unexpected type code");
2185 /* Identifiers of available host-side intermediate formats. These must
2186 be sorted so the that the more "general" kinds come later. */
2187 enum target_float_ops_kind
2189 /* Target binary floating-point formats that match a host format. */
2190 host_float = 0,
2191 host_double,
2192 host_long_double,
2193 /* Any other target binary floating-point format. */
2194 binary,
2195 /* Any target decimal floating-point format. */
2196 decimal
2199 /* Given a target type TYPE, choose the best host-side intermediate format
2200 to perform operations on TYPE in. */
2201 static enum target_float_ops_kind
2202 get_target_float_ops_kind (const struct type *type)
2204 switch (type->code ())
2206 case TYPE_CODE_FLT:
2208 const struct floatformat *fmt = floatformat_from_type (type);
2210 /* Binary floating-point formats matching a host format. */
2211 if (fmt == host_float_format)
2212 return target_float_ops_kind::host_float;
2213 if (fmt == host_double_format)
2214 return target_float_ops_kind::host_double;
2215 if (fmt == host_long_double_format)
2216 return target_float_ops_kind::host_long_double;
2218 /* Any other binary floating-point format. */
2219 return target_float_ops_kind::binary;
2222 case TYPE_CODE_DECFLOAT:
2224 /* Any decimal floating-point format. */
2225 return target_float_ops_kind::decimal;
2228 default:
2229 gdb_assert_not_reached ("unexpected type code");
2233 /* Return target_float_ops to perform operations for KIND. */
2234 static const target_float_ops *
2235 get_target_float_ops (enum target_float_ops_kind kind)
2237 switch (kind)
2239 /* If the type format matches one of the host floating-point
2240 types, use that type as intermediate format. */
2241 case target_float_ops_kind::host_float:
2243 static host_float_ops<float> host_float_ops_float;
2244 return &host_float_ops_float;
2247 case target_float_ops_kind::host_double:
2249 static host_float_ops<double> host_float_ops_double;
2250 return &host_float_ops_double;
2253 case target_float_ops_kind::host_long_double:
2255 static host_float_ops<long double> host_float_ops_long_double;
2256 return &host_float_ops_long_double;
2259 /* For binary floating-point formats that do not match any host format,
2260 use mpfr_t as intermediate format to provide precise target-floating
2261 point emulation. However, if the MPFR library is not available,
2262 use the largest host floating-point type as intermediate format. */
2263 case target_float_ops_kind::binary:
2265 static mpfr_float_ops binary_float_ops;
2266 return &binary_float_ops;
2269 /* For decimal floating-point types, always use the libdecnumber
2270 decNumber type as intermediate format. */
2271 case target_float_ops_kind::decimal:
2273 static decimal_float_ops decimal_float_ops;
2274 return &decimal_float_ops;
2277 default:
2278 gdb_assert_not_reached ("unexpected target_float_ops_kind");
2282 /* Given a target type TYPE, determine the best host-side intermediate format
2283 to perform operations on TYPE in. */
2284 static const target_float_ops *
2285 get_target_float_ops (const struct type *type)
2287 enum target_float_ops_kind kind = get_target_float_ops_kind (type);
2288 return get_target_float_ops (kind);
2291 /* The same for operations involving two target types TYPE1 and TYPE2. */
2292 static const target_float_ops *
2293 get_target_float_ops (const struct type *type1, const struct type *type2)
2295 gdb_assert (type1->code () == type2->code ());
2297 enum target_float_ops_kind kind1 = get_target_float_ops_kind (type1);
2298 enum target_float_ops_kind kind2 = get_target_float_ops_kind (type2);
2300 /* Given the way the kinds are sorted, we simply choose the larger one;
2301 this will be able to hold values of either type. */
2302 return get_target_float_ops (std::max (kind1, kind2));
2305 /* Return whether the byte-stream ADDR holds a valid value of
2306 floating-point type TYPE. */
2307 bool
2308 target_float_is_valid (const gdb_byte *addr, const struct type *type)
2310 if (type->code () == TYPE_CODE_FLT)
2311 return floatformat_is_valid (floatformat_from_type (type), addr);
2313 if (type->code () == TYPE_CODE_DECFLOAT)
2314 return true;
2316 gdb_assert_not_reached ("unexpected type code");
2319 /* Return whether the byte-stream ADDR, interpreted as floating-point
2320 type TYPE, is numerically equal to zero (of either sign). */
2321 bool
2322 target_float_is_zero (const gdb_byte *addr, const struct type *type)
2324 if (type->code () == TYPE_CODE_FLT)
2325 return (floatformat_classify (floatformat_from_type (type), addr)
2326 == float_zero);
2328 if (type->code () == TYPE_CODE_DECFLOAT)
2329 return decimal_is_zero (addr, type);
2331 gdb_assert_not_reached ("unexpected type code");
2334 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2335 to a string, optionally using the print format FORMAT. */
2336 std::string
2337 target_float_to_string (const gdb_byte *addr, const struct type *type,
2338 const char *format)
2340 /* Unless we need to adhere to a specific format, provide special
2341 output for special cases of binary floating-point numbers. */
2342 if (format == nullptr && type->code () == TYPE_CODE_FLT)
2344 const struct floatformat *fmt = floatformat_from_type (type);
2346 /* Detect invalid representations. */
2347 if (!floatformat_is_valid (fmt, addr))
2348 return "<invalid float value>";
2350 /* Handle NaN and Inf. */
2351 enum float_kind kind = floatformat_classify (fmt, addr);
2352 if (kind == float_nan)
2354 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2355 const char *mantissa = floatformat_mantissa (fmt, addr);
2356 return string_printf ("%snan(0x%s)", sign, mantissa);
2358 else if (kind == float_infinite)
2360 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2361 return string_printf ("%sinf", sign);
2365 const target_float_ops *ops = get_target_float_ops (type);
2366 return ops->to_string (addr, type, format);
2369 /* Parse string STRING into a target floating-number of type TYPE and
2370 store it as byte-stream ADDR. Return whether parsing succeeded. */
2371 bool
2372 target_float_from_string (gdb_byte *addr, const struct type *type,
2373 const std::string &string)
2375 const target_float_ops *ops = get_target_float_ops (type);
2376 return ops->from_string (addr, type, string);
2379 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2380 to an integer value (rounding towards zero). */
2381 LONGEST
2382 target_float_to_longest (const gdb_byte *addr, const struct type *type)
2384 const target_float_ops *ops = get_target_float_ops (type);
2385 return ops->to_longest (addr, type);
2388 /* Convert signed integer VAL to a target floating-number of type TYPE
2389 and store it as byte-stream ADDR. */
2390 void
2391 target_float_from_longest (gdb_byte *addr, const struct type *type,
2392 LONGEST val)
2394 const target_float_ops *ops = get_target_float_ops (type);
2395 ops->from_longest (addr, type, val);
2398 /* Convert unsigned integer VAL to a target floating-number of type TYPE
2399 and store it as byte-stream ADDR. */
2400 void
2401 target_float_from_ulongest (gdb_byte *addr, const struct type *type,
2402 ULONGEST val)
2404 const target_float_ops *ops = get_target_float_ops (type);
2405 ops->from_ulongest (addr, type, val);
2408 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2409 to a floating-point value in the host "double" format. */
2410 double
2411 target_float_to_host_double (const gdb_byte *addr,
2412 const struct type *type)
2414 const target_float_ops *ops = get_target_float_ops (type);
2415 return ops->to_host_double (addr, type);
2418 /* Convert floating-point value VAL in the host "double" format to a target
2419 floating-number of type TYPE and store it as byte-stream ADDR. */
2420 void
2421 target_float_from_host_double (gdb_byte *addr, const struct type *type,
2422 double val)
2424 const target_float_ops *ops = get_target_float_ops (type);
2425 ops->from_host_double (addr, type, val);
2428 /* Convert a floating-point number of type FROM_TYPE from the target
2429 byte-stream FROM to a floating-point number of type TO_TYPE, and
2430 store it to the target byte-stream TO. */
2431 void
2432 target_float_convert (const gdb_byte *from, const struct type *from_type,
2433 gdb_byte *to, const struct type *to_type)
2435 /* We cannot directly convert between binary and decimal floating-point
2436 types, so go via an intermediary string. */
2437 if (!target_float_same_category_p (from_type, to_type))
2439 std::string str = target_float_to_string (from, from_type);
2440 target_float_from_string (to, to_type, str);
2441 return;
2444 /* Convert between two different formats in the same category. */
2445 if (!target_float_same_format_p (from_type, to_type))
2447 const target_float_ops *ops = get_target_float_ops (from_type, to_type);
2448 ops->convert (from, from_type, to, to_type);
2449 return;
2452 /* The floating-point formats match, so we simply copy the data, ensuring
2453 possible padding bytes in the target buffer are zeroed out. */
2454 memset (to, 0, to_type->length ());
2455 memcpy (to, from, target_float_format_length (to_type));
2458 /* Perform the binary operation indicated by OPCODE, using as operands the
2459 target byte streams X and Y, interpreted as floating-point numbers of
2460 types TYPE_X and TYPE_Y, respectively. Convert the result to type
2461 TYPE_RES and store it into the byte-stream RES.
2463 The three types must either be all binary floating-point types, or else
2464 all decimal floating-point types. Binary and decimal floating-point
2465 types cannot be mixed within a single operation. */
2466 void
2467 target_float_binop (enum exp_opcode opcode,
2468 const gdb_byte *x, const struct type *type_x,
2469 const gdb_byte *y, const struct type *type_y,
2470 gdb_byte *res, const struct type *type_res)
2472 gdb_assert (target_float_same_category_p (type_x, type_res));
2473 gdb_assert (target_float_same_category_p (type_y, type_res));
2475 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2476 ops->binop (opcode, x, type_x, y, type_y, res, type_res);
2479 /* Compare the two target byte streams X and Y, interpreted as floating-point
2480 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
2481 are equal, -1 if X is less than Y, and 1 otherwise.
2483 The two types must either both be binary floating-point types, or else
2484 both be decimal floating-point types. Binary and decimal floating-point
2485 types cannot compared directly against each other. */
2487 target_float_compare (const gdb_byte *x, const struct type *type_x,
2488 const gdb_byte *y, const struct type *type_y)
2490 gdb_assert (target_float_same_category_p (type_x, type_y));
2492 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2493 return ops->compare (x, type_x, y, type_y);