]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/target-float.c
[binutils, ARM, 8/16] BFL infrastructure with new global reloc R_ARM_THM_BF18
[thirdparty/binutils-gdb.git] / gdb / target-float.c
CommitLineData
70100014
UW
1/* Floating point routines for GDB, the GNU debugger.
2
42a4f53d 3 Copyright (C) 2017-2019 Free Software Foundation, Inc.
70100014
UW
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
9 the Free Software Foundation; either version 3 of the License, or
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
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
70100014
UW
21#include "gdbtypes.h"
22#include "floatformat.h"
23#include "target-float.h"
24
25
7a26362d 26/* Target floating-point operations.
50637b26 27
7a26362d
UW
28 We provide multiple implementations of those operations, which differ
29 by the host-side intermediate format they perform computations in.
66c02b9e 30
7a26362d
UW
31 Those multiple implementations all derive from the following abstract
32 base class, which specifies the set of operations to be implemented. */
33
34class target_float_ops
35{
36public:
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;
41
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;
54
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;
61};
62
63
64/* Helper routines operating on binary floating-point data. */
65
66#include <cmath>
67#include <limits>
1cfb73db
UW
68
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). */
72enum float_kind {
73 float_nan,
74 float_infinite,
75 float_zero,
76 float_normal,
77 float_subnormal
78};
79
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
84
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
88
89/* Return the floatformat's total size in host bytes. */
90static size_t
91floatformat_totalsize_bytes (const struct floatformat *fmt)
92{
93 return ((fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
94 / FLOATFORMAT_CHAR_BIT);
95}
96
97/* Return the precision of the floating point format FMT. */
98static int
99floatformat_precision (const struct floatformat *fmt)
100{
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);
105
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++;
111
112 return prec;
113}
114
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. */
118static enum floatformat_byteorders
119floatformat_normalize_byteorder (const struct floatformat *fmt,
120 const void *from, void *to)
121{
122 const unsigned char *swapin;
123 unsigned char *swapout;
124 int words;
125
126 if (fmt->byteorder == floatformat_little
127 || fmt->byteorder == floatformat_big)
128 return fmt->byteorder;
129
130 words = fmt->totalsize / FLOATFORMAT_CHAR_BIT;
131 words >>= 2;
132
133 swapout = (unsigned char *)to;
134 swapin = (const unsigned char *)from;
135
136 if (fmt->byteorder == floatformat_vax)
137 {
138 while (words-- > 0)
139 {
140 *swapout++ = swapin[1];
141 *swapout++ = swapin[0];
142 *swapout++ = swapin[3];
143 *swapout++ = swapin[2];
144 swapin += 4;
145 }
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;
149 }
150 else
151 {
152 gdb_assert (fmt->byteorder == floatformat_littlebyte_bigword);
153
154 while (words-- > 0)
155 {
156 *swapout++ = swapin[3];
157 *swapout++ = swapin[2];
158 *swapout++ = swapin[1];
159 *swapout++ = swapin[0];
160 swapin += 4;
161 }
162 return floatformat_big;
163 }
164}
165
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. */
168static unsigned long
169get_field (const bfd_byte *data, enum floatformat_byteorders order,
170 unsigned int total_len, unsigned int start, unsigned int len)
171{
172 unsigned long result;
173 unsigned int cur_byte;
174 int cur_bitshift;
175
176 /* Caller must byte-swap words before calling this routine. */
177 gdb_assert (order == floatformat_little || order == floatformat_big);
178
179 /* Start at the least significant part of the field. */
180 if (order == floatformat_little)
181 {
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);
190
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;
195 }
196 else
197 {
198 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
199 cur_bitshift =
200 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
201 }
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;
211
212 /* Move towards the most significant part of the field. */
213 while (cur_bitshift < len)
214 {
215 result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
216 cur_bitshift += FLOATFORMAT_CHAR_BIT;
217 switch (order)
218 {
219 case floatformat_little:
220 ++cur_byte;
221 break;
222 case floatformat_big:
223 --cur_byte;
224 break;
225 }
226 }
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;
231}
232
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. */
235static void
236put_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)
239{
240 unsigned int cur_byte;
241 int cur_bitshift;
242
243 /* Caller must byte-swap words before calling this routine. */
244 gdb_assert (order == floatformat_little || order == floatformat_big);
245
246 /* Start at the least significant part of the field. */
247 if (order == floatformat_little)
248 {
249 int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
250
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;
255 }
256 else
257 {
258 cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
259 cur_bitshift =
260 ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
261 }
262 if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
263 {
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);
269 }
270 cur_bitshift += FLOATFORMAT_CHAR_BIT;
271 if (order == floatformat_little)
272 ++cur_byte;
273 else
274 --cur_byte;
275
276 /* Move towards the most significant part of the field. */
277 while (cur_bitshift < len)
278 {
279 if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
280 {
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);
285 }
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;
294 }
295}
296
297/* Check if VAL (which is assumed to be a floating point number whose
298 format is described by FMT) is negative. */
299static int
300floatformat_is_negative (const struct floatformat *fmt,
301 const bfd_byte *uval)
302{
303 enum floatformat_byteorders order;
304 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
305
306 gdb_assert (fmt != NULL);
307 gdb_assert (fmt->totalsize
308 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
309
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;
314
315 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
316
317 if (order != fmt->byteorder)
318 uval = newfrom;
319
320 return get_field (uval, order, fmt->totalsize, fmt->sign_start, 1);
321}
322
323/* Check if VAL is "not a number" (NaN) for FMT. */
324static enum float_kind
325floatformat_classify (const struct floatformat *fmt,
326 const bfd_byte *uval)
327{
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;
335
336 gdb_assert (fmt != NULL);
337 gdb_assert (fmt->totalsize
338 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
339
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;
346
347 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
348
349 if (order != fmt->byteorder)
350 uval = newfrom;
351
352 exponent = get_field (uval, order, fmt->totalsize, fmt->exp_start,
353 fmt->exp_len);
354
355 mant_bits_left = fmt->man_len;
356 mant_off = fmt->man_start;
357
358 mant_zero = 1;
359 while (mant_bits_left > 0)
360 {
361 mant_bits = std::min (mant_bits_left, 32);
362
363 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
364
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));
369
370 if (mant)
371 {
372 mant_zero = 0;
373 break;
374 }
375
376 mant_off += mant_bits;
377 mant_bits_left -= mant_bits;
378 }
379
380 /* If exp_nan is not set, assume that inf, NaN, and subnormals are not
381 supported. */
382 if (! fmt->exp_nan)
383 {
384 if (mant_zero)
385 return float_zero;
386 else
387 return float_normal;
388 }
389
390 if (exponent == 0)
391 {
392 if (mant_zero)
393 return float_zero;
394 else
395 return float_subnormal;
396 }
397
398 if (exponent == fmt->exp_nan)
399 {
400 if (mant_zero)
401 return float_infinite;
402 else
403 return float_nan;
404 }
405
406 return float_normal;
407}
408
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. */
412static const char *
413floatformat_mantissa (const struct floatformat *fmt,
414 const bfd_byte *val)
415{
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];
425
426 gdb_assert (fmt != NULL);
427 gdb_assert (fmt->totalsize
428 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
429
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;
439
440 order = floatformat_normalize_byteorder (fmt, uval, newfrom);
441
442 if (order != fmt->byteorder)
443 uval = newfrom;
444
445 if (! fmt->exp_nan)
446 return 0;
447
448 /* Make sure we have enough room to store the mantissa. */
449 gdb_assert (sizeof res > ((fmt->man_len + 7) / 8) * 2);
450
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;
454
455 mant = get_field (uval, order, fmt->totalsize, mant_off, mant_bits);
456
457 len = xsnprintf (res, sizeof res, "%lx", mant);
458
459 mant_off += mant_bits;
460 mant_bits_left -= mant_bits;
461
462 while (mant_bits_left > 0)
463 {
464 mant = get_field (uval, order, fmt->totalsize, mant_off, 32);
465
466 xsnprintf (buf, sizeof buf, "%08lx", mant);
467 gdb_assert (len + strlen (buf) <= sizeof res);
468 strcat (res, buf);
469
470 mant_off += 32;
471 mant_bits_left -= 32;
472 }
473
474 return res;
475}
476
7a26362d
UW
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. */
482static std::string
483floatformat_printf_format (const struct floatformat *fmt,
484 const char *format, char length)
485{
486 std::string host_format;
487 char conversion;
488
489 if (format == nullptr)
490 {
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
494
495 ceil(1 + p * log10(b)),
496
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++;
504
505 host_format = string_printf ("%%.%d", decimal_dig);
506 conversion = 'g';
507 }
508 else
509 {
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--;
519
520 host_format = std::string (format, len);
521 }
522
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;
528
529 return host_format;
530}
531
532/* Implementation of target_float_ops using the host floating-point type T
533 as intermediate type. */
534
535template<typename T> class host_float_ops : public target_float_ops
536{
537public:
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;
542
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;
555
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;
562
563private:
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;
568
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;
573};
574
575
576/* Convert TO/FROM target to the host floating-point format T.
1cfb73db
UW
577
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. */
590
591static const struct floatformat *host_float_format = GDB_HOST_FLOAT_FORMAT;
592static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
593static const struct floatformat *host_long_double_format
594 = GDB_HOST_LONG_DOUBLE_FORMAT;
595
7a26362d
UW
596/* Convert target floating-point value at FROM in format FMT to host
597 floating-point format of type T. */
598template<typename T> void
599host_float_ops<T>::from_target (const struct floatformat *fmt,
600 const gdb_byte *from, T *to) const
1cfb73db
UW
601{
602 gdb_assert (fmt != NULL);
603
604 if (fmt == host_float_format)
605 {
606 float val = 0;
607
608 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
609 *to = val;
610 return;
611 }
612 else if (fmt == host_double_format)
613 {
614 double val = 0;
615
616 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
617 *to = val;
618 return;
619 }
620 else if (fmt == host_long_double_format)
621 {
622 long double val = 0;
623
624 memcpy (&val, from, floatformat_totalsize_bytes (fmt));
625 *to = val;
626 return;
627 }
628
629 unsigned char *ufrom = (unsigned char *) from;
1cfb73db
UW
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;
638
639 gdb_assert (fmt->totalsize
640 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
641
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)
647 {
648 double dto;
649
650 floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
651 from, &dto);
7a26362d 652 *to = (T) dto;
1cfb73db
UW
653 return;
654 }
655
656 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
657
658 if (order != fmt->byteorder)
659 ufrom = newfrom;
660
661 if (fmt->split_half)
662 {
7a26362d 663 T dtop, dbot;
1cfb73db 664
7a26362d 665 from_target (fmt->split_half, ufrom, &dtop);
1cfb73db
UW
666 /* Preserve the sign of 0, which is the sign of the top
667 half. */
668 if (dtop == 0.0)
669 {
670 *to = dtop;
671 return;
672 }
7a26362d
UW
673 from_target (fmt->split_half,
674 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, &dbot);
1cfb73db
UW
675 *to = dtop + dbot;
676 return;
677 }
678
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. */
684
685 mant_bits_left = fmt->man_len;
686 mant_off = fmt->man_start;
b926417a 687 T dto = 0.0;
1cfb73db
UW
688
689 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
690
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;
699
700 /* Build the result algebraically. Might go infinite, underflow, etc;
701 who cares. */
702
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. */
705
706 if (!special_exponent)
707 {
708 if (fmt->intbit == floatformat_intbit_no)
709 dto = ldexp (1.0, exponent);
710 else
711 exponent++;
712 }
713
714 while (mant_bits_left > 0)
715 {
716 mant_bits = std::min (mant_bits_left, 32);
717
718 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
719
7a26362d 720 dto += ldexp ((T) mant, exponent - mant_bits);
1cfb73db
UW
721 exponent -= mant_bits;
722 mant_off += mant_bits;
723 mant_bits_left -= mant_bits;
724 }
725
726 /* Negate it if negative. */
727 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
728 dto = -dto;
729 *to = dto;
730}
731
7a26362d
UW
732template<typename T> void
733host_float_ops<T>::from_target (const struct type *type,
734 const gdb_byte *from, T *to) const
735{
736 from_target (floatformat_from_type (type), from, to);
737}
738
739/* Convert host floating-point value of type T to target floating-point
740 value in format FMT and store at TO. */
741template<typename T> void
742host_float_ops<T>::to_target (const struct floatformat *fmt,
743 const T *from, gdb_byte *to) const
1cfb73db
UW
744{
745 gdb_assert (fmt != NULL);
746
747 if (fmt == host_float_format)
748 {
749 float val = *from;
750
751 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
752 return;
753 }
754 else if (fmt == host_double_format)
755 {
756 double val = *from;
757
758 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
759 return;
760 }
761 else if (fmt == host_long_double_format)
762 {
763 long double val = *from;
764
765 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
766 return;
767 }
768
7a26362d 769 T dfrom;
1cfb73db 770 int exponent;
7a26362d 771 T mant;
1cfb73db
UW
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];
777
778 if (order != floatformat_little)
779 order = floatformat_big;
780
781 if (order != fmt->byteorder)
782 uto = newto;
783
784 memcpy (&dfrom, from, sizeof (dfrom));
785 memset (uto, 0, floatformat_totalsize_bytes (fmt));
786
787 if (fmt->split_half)
788 {
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;
7a26362d 793 T dtopnv, dbotnv;
1cfb73db
UW
794
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
7a26362d 801 dbot = (double) (dfrom - (T) dtop);
1cfb73db
UW
802 dtopnv = dtop;
803 dbotnv = dbot;
7a26362d
UW
804 to_target (fmt->split_half, &dtopnv, uto);
805 to_target (fmt->split_half, &dbotnv,
806 uto + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
1cfb73db
UW
807 return;
808 }
809
810 if (dfrom == 0)
811 goto finalize_byteorder; /* Result is zero */
812 if (dfrom != dfrom) /* Result is NaN */
813 {
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;
821 }
822
823 /* If negative, set the sign bit. */
824 if (dfrom < 0)
825 {
826 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
827 dfrom = -dfrom;
828 }
829
830 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
831 {
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;
839 }
840
1cfb73db 841 mant = frexp (dfrom, &exponent);
1cfb73db
UW
842
843 if (exponent + fmt->exp_bias <= 0)
844 {
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;
852 }
853
854 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
855 {
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;
863 }
864
865 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
866 exponent + fmt->exp_bias - 1);
867
868 mant_bits_left = fmt->man_len;
869 mant_off = fmt->man_start;
870 while (mant_bits_left > 0)
871 {
872 unsigned long mant_long;
873
874 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
875
876 mant *= 4294967296.0;
877 mant_long = ((unsigned long) mant) & 0xffffffffL;
878 mant -= mant_long;
879
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)
886 {
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;
898 }
899
900 if (mant_bits < 32)
901 {
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;
905 }
906
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;
911 }
912
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);
917}
918
7a26362d
UW
919template<typename T> void
920host_float_ops<T>::to_target (const struct type *type,
921 const T *from, gdb_byte *to) const
1cfb73db 922{
7a26362d
UW
923 /* Ensure possible padding bytes in the target buffer are zeroed out. */
924 memset (to, 0, TYPE_LENGTH (type));
1cfb73db 925
7a26362d
UW
926 to_target (floatformat_from_type (type), from, to);
927}
1cfb73db 928
7a26362d
UW
929/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
930 to a string, optionally using the print format FORMAT. */
931template<typename T> struct printf_length_modifier
932{
933 static constexpr char value = 0;
934};
935template<> struct printf_length_modifier<long double>
936{
937 static constexpr char value = 'L';
938};
939template<typename T> std::string
940host_float_ops<T>::to_string (const gdb_byte *addr, const struct type *type,
941 const char *format) const
942{
1cfb73db 943 /* Determine the format string to use on the host side. */
7a26362d
UW
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);
1cfb73db 947
7a26362d
UW
948 T host_float;
949 from_target (type, addr, &host_float);
f1628857
TT
950
951 DIAGNOSTIC_PUSH
952 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
7a26362d 953 return string_printf (host_format.c_str (), host_float);
f1628857 954 DIAGNOSTIC_POP
1cfb73db
UW
955}
956
7a26362d 957/* Parse string IN into a target floating-number of type TYPE and
1cfb73db 958 store it as byte-stream ADDR. Return whether parsing succeeded. */
7a26362d
UW
959template<typename T> struct scanf_length_modifier
960{
961 static constexpr char value = 0;
962};
963template<> struct scanf_length_modifier<double>
964{
965 static constexpr char value = 'l';
966};
967template<> struct scanf_length_modifier<long double>
968{
969 static constexpr char value = 'L';
970};
971template<typename T> bool
972host_float_ops<T>::from_string (gdb_byte *addr, const struct type *type,
973 const std::string &in) const
1cfb73db 974{
7a26362d 975 T host_float;
1cfb73db 976 int n, num;
7a26362d
UW
977
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";
982
f1628857
TT
983 DIAGNOSTIC_PUSH
984 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
7a26362d 985 num = sscanf (in.c_str (), scan_format.c_str(), &host_float, &n);
f1628857 986 DIAGNOSTIC_POP
1cfb73db
UW
987
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;
993
994 /* We only accept the whole string. */
995 if (in[n])
996 return false;
997
7a26362d 998 to_target (type, &host_float, addr);
1cfb73db
UW
999 return true;
1000}
1001
7a26362d 1002/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
50637b26 1003 to an integer value (rounding towards zero). */
7a26362d
UW
1004template<typename T> LONGEST
1005host_float_ops<T>::to_longest (const gdb_byte *addr,
1006 const struct type *type) const
50637b26 1007{
7a26362d
UW
1008 T host_float;
1009 from_target (type, addr, &host_float);
1010 /* Converting an out-of-range value is undefined behavior in C, but we
1011 prefer to return a defined value here. */
1012 if (host_float > std::numeric_limits<LONGEST>::max())
1013 return std::numeric_limits<LONGEST>::max();
1014 if (host_float < std::numeric_limits<LONGEST>::min())
1015 return std::numeric_limits<LONGEST>::min();
1016 return (LONGEST) host_float;
50637b26
UW
1017}
1018
7a26362d 1019/* Convert signed integer VAL to a target floating-number of type TYPE
50637b26 1020 and store it as byte-stream ADDR. */
7a26362d
UW
1021template<typename T> void
1022host_float_ops<T>::from_longest (gdb_byte *addr, const struct type *type,
1023 LONGEST val) const
50637b26 1024{
7a26362d
UW
1025 T host_float = (T) val;
1026 to_target (type, &host_float, addr);
50637b26
UW
1027}
1028
7a26362d 1029/* Convert unsigned integer VAL to a target floating-number of type TYPE
50637b26 1030 and store it as byte-stream ADDR. */
7a26362d
UW
1031template<typename T> void
1032host_float_ops<T>::from_ulongest (gdb_byte *addr, const struct type *type,
1033 ULONGEST val) const
50637b26 1034{
7a26362d
UW
1035 T host_float = (T) val;
1036 to_target (type, &host_float, addr);
50637b26
UW
1037}
1038
7a26362d 1039/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
14ad9311 1040 to a floating-point value in the host "double" format. */
7a26362d
UW
1041template<typename T> double
1042host_float_ops<T>::to_host_double (const gdb_byte *addr,
1043 const struct type *type) const
14ad9311 1044{
7a26362d
UW
1045 T host_float;
1046 from_target (type, addr, &host_float);
1047 return (double) host_float;
14ad9311
UW
1048}
1049
1050/* Convert floating-point value VAL in the host "double" format to a target
7a26362d
UW
1051 floating-number of type TYPE and store it as byte-stream ADDR. */
1052template<typename T> void
1053host_float_ops<T>::from_host_double (gdb_byte *addr, const struct type *type,
1054 double val) const
14ad9311 1055{
7a26362d
UW
1056 T host_float = (T) val;
1057 to_target (type, &host_float, addr);
14ad9311
UW
1058}
1059
7a26362d
UW
1060/* Convert a floating-point number of type FROM_TYPE from the target
1061 byte-stream FROM to a floating-point number of type TO_TYPE, and
50637b26 1062 store it to the target byte-stream TO. */
7a26362d
UW
1063template<typename T> void
1064host_float_ops<T>::convert (const gdb_byte *from,
1065 const struct type *from_type,
1066 gdb_byte *to,
1067 const struct type *to_type) const
50637b26 1068{
7a26362d
UW
1069 T host_float;
1070 from_target (from_type, from, &host_float);
1071 to_target (to_type, &host_float, to);
50637b26
UW
1072}
1073
66c02b9e
UW
1074/* Perform the binary operation indicated by OPCODE, using as operands the
1075 target byte streams X and Y, interpreted as floating-point numbers of
7a26362d
UW
1076 types TYPE_X and TYPE_Y, respectively. Convert the result to format
1077 TYPE_RES and store it into the byte-stream RES. */
1078template<typename T> void
1079host_float_ops<T>::binop (enum exp_opcode op,
1080 const gdb_byte *x, const struct type *type_x,
1081 const gdb_byte *y, const struct type *type_y,
1082 gdb_byte *res, const struct type *type_res) const
66c02b9e 1083{
7a26362d 1084 T v1, v2, v = 0;
66c02b9e 1085
7a26362d
UW
1086 from_target (type_x, x, &v1);
1087 from_target (type_y, y, &v2);
66c02b9e
UW
1088
1089 switch (op)
1090 {
1091 case BINOP_ADD:
1092 v = v1 + v2;
1093 break;
1094
1095 case BINOP_SUB:
1096 v = v1 - v2;
1097 break;
1098
1099 case BINOP_MUL:
1100 v = v1 * v2;
1101 break;
1102
1103 case BINOP_DIV:
1104 v = v1 / v2;
1105 break;
1106
1107 case BINOP_EXP:
1108 errno = 0;
1109 v = pow (v1, v2);
1110 if (errno)
1111 error (_("Cannot perform exponentiation: %s"),
1112 safe_strerror (errno));
1113 break;
1114
1115 case BINOP_MIN:
1116 v = v1 < v2 ? v1 : v2;
1117 break;
1118
1119 case BINOP_MAX:
1120 v = v1 > v2 ? v1 : v2;
1121 break;
1122
1123 default:
1124 error (_("Integer-only operation on floating point number."));
1125 break;
1126 }
1127
7a26362d 1128 to_target (type_res, &v, res);
66c02b9e
UW
1129}
1130
1131/* Compare the two target byte streams X and Y, interpreted as floating-point
7a26362d 1132 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
66c02b9e 1133 are equal, -1 if X is less than Y, and 1 otherwise. */
7a26362d
UW
1134template<typename T> int
1135host_float_ops<T>::compare (const gdb_byte *x, const struct type *type_x,
1136 const gdb_byte *y, const struct type *type_y) const
66c02b9e 1137{
7a26362d 1138 T v1, v2;
66c02b9e 1139
7a26362d
UW
1140 from_target (type_x, x, &v1);
1141 from_target (type_y, y, &v2);
66c02b9e
UW
1142
1143 if (v1 == v2)
1144 return 0;
1145 if (v1 < v2)
1146 return -1;
1147 return 1;
1148}
1149
50637b26 1150
2400729e
UW
1151/* Implementation of target_float_ops using the MPFR library
1152 mpfr_t as intermediate type. */
1153
1154#ifdef HAVE_LIBMPFR
1155
75059544
JB
1156#define MPFR_USE_INTMAX_T
1157
2400729e
UW
1158#include <mpfr.h>
1159
1160class mpfr_float_ops : public target_float_ops
1161{
1162public:
1163 std::string to_string (const gdb_byte *addr, const struct type *type,
1164 const char *format) const override;
1165 bool from_string (gdb_byte *addr, const struct type *type,
1166 const std::string &string) const override;
1167
1168 LONGEST to_longest (const gdb_byte *addr,
1169 const struct type *type) const override;
1170 void from_longest (gdb_byte *addr, const struct type *type,
1171 LONGEST val) const override;
1172 void from_ulongest (gdb_byte *addr, const struct type *type,
1173 ULONGEST val) const override;
1174 double to_host_double (const gdb_byte *addr,
1175 const struct type *type) const override;
1176 void from_host_double (gdb_byte *addr, const struct type *type,
1177 double val) const override;
1178 void convert (const gdb_byte *from, const struct type *from_type,
1179 gdb_byte *to, const struct type *to_type) const override;
1180
1181 void binop (enum exp_opcode opcode,
1182 const gdb_byte *x, const struct type *type_x,
1183 const gdb_byte *y, const struct type *type_y,
1184 gdb_byte *res, const struct type *type_res) const override;
1185 int compare (const gdb_byte *x, const struct type *type_x,
1186 const gdb_byte *y, const struct type *type_y) const override;
1187
1188private:
1189 /* Local wrapper class to handle mpfr_t initalization and cleanup. */
1190 class gdb_mpfr
1191 {
1192 public:
1193 mpfr_t val;
1194
1195 gdb_mpfr (const struct type *type)
1196 {
1197 const struct floatformat *fmt = floatformat_from_type (type);
1198 mpfr_init2 (val, floatformat_precision (fmt));
1199 }
1200
1201 gdb_mpfr (const gdb_mpfr &source)
1202 {
1203 mpfr_init2 (val, mpfr_get_prec (source.val));
1204 }
1205
1206 ~gdb_mpfr ()
1207 {
1208 mpfr_clear (val);
1209 }
1210 };
1211
1212 void from_target (const struct floatformat *fmt,
1213 const gdb_byte *from, gdb_mpfr &to) const;
1214 void from_target (const struct type *type,
1215 const gdb_byte *from, gdb_mpfr &to) const;
1216
1217 void to_target (const struct type *type,
1218 const gdb_mpfr &from, gdb_byte *to) const;
1219 void to_target (const struct floatformat *fmt,
1220 const gdb_mpfr &from, gdb_byte *to) const;
1221};
1222
1223
1224/* Convert TO/FROM target floating-point format to mpfr_t. */
1225
1226void
1227mpfr_float_ops::from_target (const struct floatformat *fmt,
1228 const gdb_byte *orig_from, gdb_mpfr &to) const
1229{
1230 const gdb_byte *from = orig_from;
1231 mpfr_exp_t exponent;
1232 unsigned long mant;
1233 unsigned int mant_bits, mant_off;
1234 int mant_bits_left;
1235 int special_exponent; /* It's a NaN, denorm or zero. */
1236 enum floatformat_byteorders order;
1237 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
1238 enum float_kind kind;
1239
1240 gdb_assert (fmt->totalsize
1241 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
1242
1243 /* Handle non-numbers. */
1244 kind = floatformat_classify (fmt, from);
1245 if (kind == float_infinite)
1246 {
1247 mpfr_set_inf (to.val, floatformat_is_negative (fmt, from) ? -1 : 1);
1248 return;
1249 }
1250 if (kind == float_nan)
1251 {
1252 mpfr_set_nan (to.val);
1253 return;
1254 }
1255
1256 order = floatformat_normalize_byteorder (fmt, from, newfrom);
1257
1258 if (order != fmt->byteorder)
1259 from = newfrom;
1260
1261 if (fmt->split_half)
1262 {
1263 gdb_mpfr top (to), bot (to);
1264
1265 from_target (fmt->split_half, from, top);
1266 /* Preserve the sign of 0, which is the sign of the top half. */
1267 if (mpfr_zero_p (top.val))
1268 {
1269 mpfr_set (to.val, top.val, MPFR_RNDN);
1270 return;
1271 }
1272 from_target (fmt->split_half,
1273 from + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, bot);
1274 mpfr_add (to.val, top.val, bot.val, MPFR_RNDN);
1275 return;
1276 }
1277
1278 exponent = get_field (from, order, fmt->totalsize, fmt->exp_start,
1279 fmt->exp_len);
1280 /* Note that if exponent indicates a NaN, we can't really do anything useful
1281 (not knowing if the host has NaN's, or how to build one). So it will
1282 end up as an infinity or something close; that is OK. */
1283
1284 mant_bits_left = fmt->man_len;
1285 mant_off = fmt->man_start;
1286 mpfr_set_zero (to.val, 0);
1287
1288 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
1289
1290 /* Don't bias NaNs. Use minimum exponent for denorms. For
1291 simplicity, we don't check for zero as the exponent doesn't matter.
1292 Note the cast to int; exp_bias is unsigned, so it's important to
1293 make sure the operation is done in signed arithmetic. */
1294 if (!special_exponent)
1295 exponent -= fmt->exp_bias;
1296 else if (exponent == 0)
1297 exponent = 1 - fmt->exp_bias;
1298
1299 /* Build the result algebraically. Might go infinite, underflow, etc;
1300 who cares. */
1301
1302 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
1303 increment the exponent by one to account for the integer bit. */
1304
1305 if (!special_exponent)
1306 {
1307 if (fmt->intbit == floatformat_intbit_no)
1308 mpfr_set_ui_2exp (to.val, 1, exponent, MPFR_RNDN);
1309 else
1310 exponent++;
1311 }
1312
1313 gdb_mpfr tmp (to);
1314
1315 while (mant_bits_left > 0)
1316 {
1317 mant_bits = std::min (mant_bits_left, 32);
1318
1319 mant = get_field (from, order, fmt->totalsize, mant_off, mant_bits);
1320
f2f9e7ec 1321 mpfr_set_ui (tmp.val, mant, MPFR_RNDN);
2400729e
UW
1322 mpfr_mul_2si (tmp.val, tmp.val, exponent - mant_bits, MPFR_RNDN);
1323 mpfr_add (to.val, to.val, tmp.val, MPFR_RNDN);
1324 exponent -= mant_bits;
1325 mant_off += mant_bits;
1326 mant_bits_left -= mant_bits;
1327 }
1328
1329 /* Negate it if negative. */
1330 if (get_field (from, order, fmt->totalsize, fmt->sign_start, 1))
1331 mpfr_neg (to.val, to.val, MPFR_RNDN);
1332}
1333
1334void
1335mpfr_float_ops::from_target (const struct type *type,
1336 const gdb_byte *from, gdb_mpfr &to) const
1337{
1338 from_target (floatformat_from_type (type), from, to);
1339}
1340
1341void
1342mpfr_float_ops::to_target (const struct floatformat *fmt,
1343 const gdb_mpfr &from, gdb_byte *orig_to) const
1344{
1345 unsigned char *to = orig_to;
1346 mpfr_exp_t exponent;
1347 unsigned int mant_bits, mant_off;
1348 int mant_bits_left;
1349 enum floatformat_byteorders order = fmt->byteorder;
1350 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
1351
1352 if (order != floatformat_little)
1353 order = floatformat_big;
1354
1355 if (order != fmt->byteorder)
1356 to = newto;
1357
1358 memset (to, 0, floatformat_totalsize_bytes (fmt));
1359
1360 if (fmt->split_half)
1361 {
1362 gdb_mpfr top (from), bot (from);
1363
1364 mpfr_set (top.val, from.val, MPFR_RNDN);
1365 /* If the rounded top half is Inf, the bottom must be 0 not NaN
1366 or Inf. */
1367 if (mpfr_inf_p (top.val))
1368 mpfr_set_zero (bot.val, 0);
1369 else
1370 mpfr_sub (bot.val, from.val, top.val, MPFR_RNDN);
1371
1372 to_target (fmt->split_half, top, to);
1373 to_target (fmt->split_half, bot,
1374 to + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
1375 return;
1376 }
1377
1378 gdb_mpfr tmp (from);
1379
1380 if (mpfr_zero_p (from.val))
1381 goto finalize_byteorder; /* Result is zero */
1382
1383 mpfr_set (tmp.val, from.val, MPFR_RNDN);
1384
1385 if (mpfr_nan_p (tmp.val)) /* Result is NaN */
1386 {
1387 /* From is NaN */
1388 put_field (to, order, fmt->totalsize, fmt->exp_start,
1389 fmt->exp_len, fmt->exp_nan);
1390 /* Be sure it's not infinity, but NaN value is irrel. */
1391 put_field (to, order, fmt->totalsize, fmt->man_start,
1392 fmt->man_len, 1);
1393 goto finalize_byteorder;
1394 }
1395
1396 /* If negative, set the sign bit. */
1397 if (mpfr_sgn (tmp.val) < 0)
1398 {
1399 put_field (to, order, fmt->totalsize, fmt->sign_start, 1, 1);
1400 mpfr_neg (tmp.val, tmp.val, MPFR_RNDN);
1401 }
1402
1403 if (mpfr_inf_p (tmp.val)) /* Result is Infinity. */
1404 {
1405 /* Infinity exponent is same as NaN's. */
1406 put_field (to, order, fmt->totalsize, fmt->exp_start,
1407 fmt->exp_len, fmt->exp_nan);
1408 /* Infinity mantissa is all zeroes. */
1409 put_field (to, order, fmt->totalsize, fmt->man_start,
1410 fmt->man_len, 0);
1411 goto finalize_byteorder;
1412 }
1413
1414 mpfr_frexp (&exponent, tmp.val, tmp.val, MPFR_RNDN);
1415
1416 if (exponent + fmt->exp_bias <= 0)
1417 {
1418 /* The value is too small to be expressed in the destination
1419 type (not enough bits in the exponent. Treat as 0. */
1420 put_field (to, order, fmt->totalsize, fmt->exp_start,
1421 fmt->exp_len, 0);
1422 put_field (to, order, fmt->totalsize, fmt->man_start,
1423 fmt->man_len, 0);
1424 goto finalize_byteorder;
1425 }
1426
1427 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
1428 {
1429 /* The value is too large to fit into the destination.
1430 Treat as infinity. */
1431 put_field (to, order, fmt->totalsize, fmt->exp_start,
1432 fmt->exp_len, fmt->exp_nan);
1433 put_field (to, order, fmt->totalsize, fmt->man_start,
1434 fmt->man_len, 0);
1435 goto finalize_byteorder;
1436 }
1437
1438 put_field (to, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
1439 exponent + fmt->exp_bias - 1);
1440
1441 mant_bits_left = fmt->man_len;
1442 mant_off = fmt->man_start;
1443 while (mant_bits_left > 0)
1444 {
1445 unsigned long mant_long;
1446
1447 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
1448
1449 mpfr_mul_2ui (tmp.val, tmp.val, 32, MPFR_RNDN);
1450 mant_long = mpfr_get_ui (tmp.val, MPFR_RNDZ) & 0xffffffffL;
1451 mpfr_sub_ui (tmp.val, tmp.val, mant_long, MPFR_RNDZ);
1452
1453 /* If the integer bit is implicit, then we need to discard it.
1454 If we are discarding a zero, we should be (but are not) creating
1455 a denormalized number which means adjusting the exponent
1456 (I think). */
1457 if (mant_bits_left == fmt->man_len
1458 && fmt->intbit == floatformat_intbit_no)
1459 {
1460 mant_long <<= 1;
1461 mant_long &= 0xffffffffL;
1462 /* If we are processing the top 32 mantissa bits of a doublest
1463 so as to convert to a float value with implied integer bit,
1464 we will only be putting 31 of those 32 bits into the
1465 final value due to the discarding of the top bit. In the
1466 case of a small float value where the number of mantissa
1467 bits is less than 32, discarding the top bit does not alter
1468 the number of bits we will be adding to the result. */
1469 if (mant_bits == 32)
1470 mant_bits -= 1;
1471 }
1472
1473 if (mant_bits < 32)
1474 {
1475 /* The bits we want are in the most significant MANT_BITS bits of
1476 mant_long. Move them to the least significant. */
1477 mant_long >>= 32 - mant_bits;
1478 }
1479
1480 put_field (to, order, fmt->totalsize,
1481 mant_off, mant_bits, mant_long);
1482 mant_off += mant_bits;
1483 mant_bits_left -= mant_bits;
1484 }
1485
1486 finalize_byteorder:
1487 /* Do we need to byte-swap the words in the result? */
1488 if (order != fmt->byteorder)
1489 floatformat_normalize_byteorder (fmt, newto, orig_to);
1490}
1491
1492void
1493mpfr_float_ops::to_target (const struct type *type,
1494 const gdb_mpfr &from, gdb_byte *to) const
1495{
1496 /* Ensure possible padding bytes in the target buffer are zeroed out. */
1497 memset (to, 0, TYPE_LENGTH (type));
1498
1499 to_target (floatformat_from_type (type), from, to);
1500}
1501
1502/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1503 to a string, optionally using the print format FORMAT. */
1504std::string
1505mpfr_float_ops::to_string (const gdb_byte *addr,
1506 const struct type *type,
1507 const char *format) const
1508{
1509 const struct floatformat *fmt = floatformat_from_type (type);
1510
1511 /* Unless we need to adhere to a specific format, provide special
1512 output for certain cases. */
1513 if (format == nullptr)
1514 {
1515 /* Detect invalid representations. */
1516 if (!floatformat_is_valid (fmt, addr))
1517 return "<invalid float value>";
1518
1519 /* Handle NaN and Inf. */
1520 enum float_kind kind = floatformat_classify (fmt, addr);
1521 if (kind == float_nan)
1522 {
1523 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1524 const char *mantissa = floatformat_mantissa (fmt, addr);
1525 return string_printf ("%snan(0x%s)", sign, mantissa);
1526 }
1527 else if (kind == float_infinite)
1528 {
1529 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1530 return string_printf ("%sinf", sign);
1531 }
1532 }
1533
1534 /* Determine the format string to use on the host side. */
1535 std::string host_format = floatformat_printf_format (fmt, format, 'R');
1536
1537 gdb_mpfr tmp (type);
1538 from_target (type, addr, tmp);
1539
1540 int size = mpfr_snprintf (NULL, 0, host_format.c_str (), tmp.val);
1541 std::string str (size, '\0');
1542 mpfr_sprintf (&str[0], host_format.c_str (), tmp.val);
1543
1544 return str;
1545}
1546
1547/* Parse string STRING into a target floating-number of type TYPE and
1548 store it as byte-stream ADDR. Return whether parsing succeeded. */
1549bool
1550mpfr_float_ops::from_string (gdb_byte *addr,
1551 const struct type *type,
1552 const std::string &in) const
1553{
1554 gdb_mpfr tmp (type);
1555
1556 char *endptr;
1557 mpfr_strtofr (tmp.val, in.c_str (), &endptr, 0, MPFR_RNDN);
1558
1559 /* We only accept the whole string. */
1560 if (*endptr)
1561 return false;
1562
1563 to_target (type, tmp, addr);
1564 return true;
1565}
1566
1567/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1568 to an integer value (rounding towards zero). */
1569LONGEST
1570mpfr_float_ops::to_longest (const gdb_byte *addr,
1571 const struct type *type) const
1572{
1573 gdb_mpfr tmp (type);
1574 from_target (type, addr, tmp);
1575 return mpfr_get_sj (tmp.val, MPFR_RNDZ);
1576}
1577
1578/* Convert signed integer VAL to a target floating-number of type TYPE
1579 and store it as byte-stream ADDR. */
1580void
1581mpfr_float_ops::from_longest (gdb_byte *addr,
1582 const struct type *type,
1583 LONGEST val) const
1584{
1585 gdb_mpfr tmp (type);
1586 mpfr_set_sj (tmp.val, val, MPFR_RNDN);
1587 to_target (type, tmp, addr);
1588}
1589
1590/* Convert unsigned integer VAL to a target floating-number of type TYPE
1591 and store it as byte-stream ADDR. */
1592void
1593mpfr_float_ops::from_ulongest (gdb_byte *addr,
1594 const struct type *type,
1595 ULONGEST val) const
1596{
1597 gdb_mpfr tmp (type);
1598 mpfr_set_uj (tmp.val, val, MPFR_RNDN);
1599 to_target (type, tmp, addr);
1600}
1601
1602/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1603 to a floating-point value in the host "double" format. */
1604double
1605mpfr_float_ops::to_host_double (const gdb_byte *addr,
1606 const struct type *type) const
1607{
1608 gdb_mpfr tmp (type);
1609 from_target (type, addr, tmp);
1610 return mpfr_get_d (tmp.val, MPFR_RNDN);
1611}
1612
1613/* Convert floating-point value VAL in the host "double" format to a target
1614 floating-number of type TYPE and store it as byte-stream ADDR. */
1615void
1616mpfr_float_ops::from_host_double (gdb_byte *addr,
1617 const struct type *type,
1618 double val) const
1619{
1620 gdb_mpfr tmp (type);
1621 mpfr_set_d (tmp.val, val, MPFR_RNDN);
1622 to_target (type, tmp, addr);
1623}
1624
1625/* Convert a floating-point number of type FROM_TYPE from the target
1626 byte-stream FROM to a floating-point number of type TO_TYPE, and
1627 store it to the target byte-stream TO. */
1628void
1629mpfr_float_ops::convert (const gdb_byte *from,
1630 const struct type *from_type,
1631 gdb_byte *to,
1632 const struct type *to_type) const
1633{
1634 gdb_mpfr from_tmp (from_type), to_tmp (to_type);
1635 from_target (from_type, from, from_tmp);
1636 mpfr_set (to_tmp.val, from_tmp.val, MPFR_RNDN);
1637 to_target (to_type, to_tmp, to);
1638}
1639
1640/* Perform the binary operation indicated by OPCODE, using as operands the
1641 target byte streams X and Y, interpreted as floating-point numbers of
1642 types TYPE_X and TYPE_Y, respectively. Convert the result to type
1643 TYPE_RES and store it into the byte-stream RES. */
1644void
1645mpfr_float_ops::binop (enum exp_opcode op,
1646 const gdb_byte *x, const struct type *type_x,
1647 const gdb_byte *y, const struct type *type_y,
1648 gdb_byte *res, const struct type *type_res) const
1649{
1650 gdb_mpfr x_tmp (type_x), y_tmp (type_y), tmp (type_res);
1651
1652 from_target (type_x, x, x_tmp);
1653 from_target (type_y, y, y_tmp);
1654
1655 switch (op)
1656 {
1657 case BINOP_ADD:
1658 mpfr_add (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1659 break;
1660
1661 case BINOP_SUB:
1662 mpfr_sub (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1663 break;
1664
1665 case BINOP_MUL:
1666 mpfr_mul (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1667 break;
1668
1669 case BINOP_DIV:
1670 mpfr_div (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1671 break;
1672
1673 case BINOP_EXP:
1674 mpfr_pow (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1675 break;
1676
1677 case BINOP_MIN:
1678 mpfr_min (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1679 break;
1680
1681 case BINOP_MAX:
1682 mpfr_max (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1683 break;
1684
1685 default:
1686 error (_("Integer-only operation on floating point number."));
1687 break;
1688 }
1689
1690 to_target (type_res, tmp, res);
1691}
1692
1693/* Compare the two target byte streams X and Y, interpreted as floating-point
1694 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
1695 are equal, -1 if X is less than Y, and 1 otherwise. */
1696int
1697mpfr_float_ops::compare (const gdb_byte *x, const struct type *type_x,
1698 const gdb_byte *y, const struct type *type_y) const
1699{
1700 gdb_mpfr x_tmp (type_x), y_tmp (type_y);
1701
1702 from_target (type_x, x, x_tmp);
1703 from_target (type_y, y, y_tmp);
1704
1705 if (mpfr_equal_p (x_tmp.val, y_tmp.val))
1706 return 0;
1707 else if (mpfr_less_p (x_tmp.val, y_tmp.val))
1708 return -1;
1709 else
1710 return 1;
1711}
1712
1713#endif
1714
1715
1cfb73db
UW
1716/* Helper routines operating on decimal floating-point data. */
1717
1718/* Decimal floating point is one of the extension to IEEE 754, which is
1719 described in http://grouper.ieee.org/groups/754/revision.html and
1720 http://www2.hursley.ibm.com/decimal/. It completes binary floating
1721 point by representing floating point more exactly. */
1722
1723/* The order of the following headers is important for making sure
1724 decNumber structure is large enough to hold decimal128 digits. */
1725
1726#include "dpd/decimal128.h"
1727#include "dpd/decimal64.h"
1728#include "dpd/decimal32.h"
1729
1730/* When using decimal128, this is the maximum string length + 1
1731 (value comes from libdecnumber's DECIMAL128_String constant). */
1732#define MAX_DECIMAL_STRING 43
1733
1734/* In GDB, we are using an array of gdb_byte to represent decimal values.
1735 They are stored in host byte order. This routine does the conversion if
1736 the target byte order is different. */
1737static void
7a26362d 1738match_endianness (const gdb_byte *from, const struct type *type, gdb_byte *to)
1cfb73db 1739{
7a26362d
UW
1740 gdb_assert (TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
1741
1742 int len = TYPE_LENGTH (type);
1cfb73db
UW
1743 int i;
1744
1745#if WORDS_BIGENDIAN
1746#define OPPOSITE_BYTE_ORDER BFD_ENDIAN_LITTLE
1747#else
1748#define OPPOSITE_BYTE_ORDER BFD_ENDIAN_BIG
1749#endif
1750
7a26362d 1751 if (gdbarch_byte_order (get_type_arch (type)) == OPPOSITE_BYTE_ORDER)
1cfb73db
UW
1752 for (i = 0; i < len; i++)
1753 to[i] = from[len - i - 1];
1754 else
1755 for (i = 0; i < len; i++)
1756 to[i] = from[i];
1757
1758 return;
1759}
1760
1761/* Helper function to get the appropriate libdecnumber context for each size
1762 of decimal float. */
1763static void
7a26362d 1764set_decnumber_context (decContext *ctx, const struct type *type)
1cfb73db 1765{
7a26362d
UW
1766 gdb_assert (TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
1767
1768 switch (TYPE_LENGTH (type))
1cfb73db
UW
1769 {
1770 case 4:
1771 decContextDefault (ctx, DEC_INIT_DECIMAL32);
1772 break;
1773 case 8:
1774 decContextDefault (ctx, DEC_INIT_DECIMAL64);
1775 break;
1776 case 16:
1777 decContextDefault (ctx, DEC_INIT_DECIMAL128);
1778 break;
1779 }
1780
1781 ctx->traps = 0;
1782}
1783
1784/* Check for errors signaled in the decimal context structure. */
1785static void
1786decimal_check_errors (decContext *ctx)
1787{
1788 /* An error here could be a division by zero, an overflow, an underflow or
1789 an invalid operation (from the DEC_Errors constant in decContext.h).
1790 Since GDB doesn't complain about division by zero, overflow or underflow
1791 errors for binary floating, we won't complain about them for decimal
1792 floating either. */
1793 if (ctx->status & DEC_IEEE_854_Invalid_operation)
1794 {
1795 /* Leave only the error bits in the status flags. */
1796 ctx->status &= DEC_IEEE_854_Invalid_operation;
1797 error (_("Cannot perform operation: %s"),
1798 decContextStatusToString (ctx));
1799 }
1800}
1801
1802/* Helper function to convert from libdecnumber's appropriate representation
1803 for computation to each size of decimal float. */
1804static void
d7236961 1805decimal_from_number (const decNumber *from,
7a26362d 1806 gdb_byte *to, const struct type *type)
1cfb73db 1807{
d7236961
UW
1808 gdb_byte dec[16];
1809
1cfb73db
UW
1810 decContext set;
1811
7a26362d 1812 set_decnumber_context (&set, type);
1cfb73db 1813
7a26362d 1814 switch (TYPE_LENGTH (type))
1cfb73db
UW
1815 {
1816 case 4:
d7236961 1817 decimal32FromNumber ((decimal32 *) dec, from, &set);
1cfb73db
UW
1818 break;
1819 case 8:
d7236961 1820 decimal64FromNumber ((decimal64 *) dec, from, &set);
1cfb73db
UW
1821 break;
1822 case 16:
d7236961
UW
1823 decimal128FromNumber ((decimal128 *) dec, from, &set);
1824 break;
1825 default:
1826 error (_("Unknown decimal floating point type."));
1cfb73db
UW
1827 break;
1828 }
d7236961 1829
7a26362d 1830 match_endianness (dec, type, to);
1cfb73db
UW
1831}
1832
1833/* Helper function to convert each size of decimal float to libdecnumber's
1834 appropriate representation for computation. */
1835static void
7a26362d 1836decimal_to_number (const gdb_byte *addr, const struct type *type,
d7236961 1837 decNumber *to)
1cfb73db 1838{
d7236961 1839 gdb_byte dec[16];
7a26362d 1840 match_endianness (addr, type, dec);
d7236961 1841
7a26362d 1842 switch (TYPE_LENGTH (type))
1cfb73db
UW
1843 {
1844 case 4:
d7236961 1845 decimal32ToNumber ((decimal32 *) dec, to);
1cfb73db
UW
1846 break;
1847 case 8:
d7236961 1848 decimal64ToNumber ((decimal64 *) dec, to);
1cfb73db
UW
1849 break;
1850 case 16:
d7236961 1851 decimal128ToNumber ((decimal128 *) dec, to);
1cfb73db
UW
1852 break;
1853 default:
1854 error (_("Unknown decimal floating point type."));
1855 break;
1856 }
1857}
1858
7a26362d
UW
1859/* Returns true if ADDR (which is of type TYPE) is the number zero. */
1860static bool
1861decimal_is_zero (const gdb_byte *addr, const struct type *type)
1862{
1863 decNumber number;
1864
1865 decimal_to_number (addr, type, &number);
1866
1867 return decNumberIsZero (&number);
1868}
1869
1870
1871/* Implementation of target_float_ops using the libdecnumber decNumber type
1872 as intermediate format. */
1873
1874class decimal_float_ops : public target_float_ops
1875{
1876public:
1877 std::string to_string (const gdb_byte *addr, const struct type *type,
1878 const char *format) const override;
1879 bool from_string (gdb_byte *addr, const struct type *type,
1880 const std::string &string) const override;
1881
1882 LONGEST to_longest (const gdb_byte *addr,
1883 const struct type *type) const override;
1884 void from_longest (gdb_byte *addr, const struct type *type,
1885 LONGEST val) const override;
1886 void from_ulongest (gdb_byte *addr, const struct type *type,
1887 ULONGEST val) const override;
1888 double to_host_double (const gdb_byte *addr,
1889 const struct type *type) const override
1890 {
1891 /* We don't support conversions between target decimal floating-point
1892 types and the host double type. */
1893 gdb_assert_not_reached ("invalid operation on decimal float");
1894 }
1895 void from_host_double (gdb_byte *addr, const struct type *type,
1896 double val) const override
1897 {
1898 /* We don't support conversions between target decimal floating-point
1899 types and the host double type. */
1900 gdb_assert_not_reached ("invalid operation on decimal float");
1901 }
1902 void convert (const gdb_byte *from, const struct type *from_type,
1903 gdb_byte *to, const struct type *to_type) const override;
1904
1905 void binop (enum exp_opcode opcode,
1906 const gdb_byte *x, const struct type *type_x,
1907 const gdb_byte *y, const struct type *type_y,
1908 gdb_byte *res, const struct type *type_res) const override;
1909 int compare (const gdb_byte *x, const struct type *type_x,
1910 const gdb_byte *y, const struct type *type_y) const override;
1911};
1912
1cfb73db
UW
1913/* Convert decimal type to its string representation. LEN is the length
1914 of the decimal type, 4 bytes for decimal32, 8 bytes for decimal64 and
1915 16 bytes for decimal128. */
7a26362d
UW
1916std::string
1917decimal_float_ops::to_string (const gdb_byte *addr, const struct type *type,
1918 const char *format = nullptr) const
1cfb73db
UW
1919{
1920 gdb_byte dec[16];
1921
7a26362d 1922 match_endianness (addr, type, dec);
1cfb73db
UW
1923
1924 if (format != nullptr)
1925 {
1926 /* We don't handle format strings (yet). If the host printf supports
1927 decimal floating point types, just use this. Otherwise, fall back
1928 to printing the number while ignoring the format string. */
1929#if defined (PRINTF_HAS_DECFLOAT)
1930 /* FIXME: This makes unwarranted assumptions about the host ABI! */
1931 return string_printf (format, dec);
1932#endif
1933 }
1934
1935 std::string result;
1936 result.resize (MAX_DECIMAL_STRING);
1937
7a26362d 1938 switch (TYPE_LENGTH (type))
1cfb73db
UW
1939 {
1940 case 4:
1941 decimal32ToString ((decimal32 *) dec, &result[0]);
1942 break;
1943 case 8:
1944 decimal64ToString ((decimal64 *) dec, &result[0]);
1945 break;
1946 case 16:
1947 decimal128ToString ((decimal128 *) dec, &result[0]);
1948 break;
1949 default:
1950 error (_("Unknown decimal floating point type."));
1951 break;
1952 }
1953
1954 return result;
1955}
1956
1957/* Convert the string form of a decimal value to its decimal representation.
1958 LEN is the length of the decimal type, 4 bytes for decimal32, 8 bytes for
1959 decimal64 and 16 bytes for decimal128. */
7a26362d
UW
1960bool
1961decimal_float_ops::from_string (gdb_byte *addr, const struct type *type,
1962 const std::string &string) const
1cfb73db
UW
1963{
1964 decContext set;
1965 gdb_byte dec[16];
1966
7a26362d 1967 set_decnumber_context (&set, type);
1cfb73db 1968
7a26362d 1969 switch (TYPE_LENGTH (type))
1cfb73db
UW
1970 {
1971 case 4:
1972 decimal32FromString ((decimal32 *) dec, string.c_str (), &set);
1973 break;
1974 case 8:
1975 decimal64FromString ((decimal64 *) dec, string.c_str (), &set);
1976 break;
1977 case 16:
1978 decimal128FromString ((decimal128 *) dec, string.c_str (), &set);
1979 break;
1980 default:
1981 error (_("Unknown decimal floating point type."));
1982 break;
1983 }
1984
7a26362d 1985 match_endianness (dec, type, addr);
1cfb73db
UW
1986
1987 /* Check for errors in the DFP operation. */
1988 decimal_check_errors (&set);
1989
1990 return true;
1991}
1992
1993/* Converts a LONGEST to a decimal float of specified LEN bytes. */
7a26362d
UW
1994void
1995decimal_float_ops::from_longest (gdb_byte *addr, const struct type *type,
1996 LONGEST from) const
1cfb73db 1997{
1cfb73db 1998 decNumber number;
d7236961 1999
1cfb73db
UW
2000 if ((int32_t) from != from)
2001 /* libdecnumber can convert only 32-bit integers. */
2002 error (_("Conversion of large integer to a "
2003 "decimal floating type is not supported."));
2004
2005 decNumberFromInt32 (&number, (int32_t) from);
2006
7a26362d 2007 decimal_from_number (&number, addr, type);
1cfb73db
UW
2008}
2009
2010/* Converts a ULONGEST to a decimal float of specified LEN bytes. */
7a26362d
UW
2011void
2012decimal_float_ops::from_ulongest (gdb_byte *addr, const struct type *type,
2013 ULONGEST from) const
1cfb73db 2014{
1cfb73db
UW
2015 decNumber number;
2016
2017 if ((uint32_t) from != from)
2018 /* libdecnumber can convert only 32-bit integers. */
2019 error (_("Conversion of large integer to a "
2020 "decimal floating type is not supported."));
2021
2022 decNumberFromUInt32 (&number, (uint32_t) from);
2023
7a26362d 2024 decimal_from_number (&number, addr, type);
1cfb73db
UW
2025}
2026
2027/* Converts a decimal float of LEN bytes to a LONGEST. */
7a26362d
UW
2028LONGEST
2029decimal_float_ops::to_longest (const gdb_byte *addr,
2030 const struct type *type) const
1cfb73db
UW
2031{
2032 /* libdecnumber has a function to convert from decimal to integer, but
2033 it doesn't work when the decimal number has a fractional part. */
7a26362d 2034 std::string str = to_string (addr, type);
1cfb73db
UW
2035 return strtoll (str.c_str (), NULL, 10);
2036}
2037
2038/* Perform operation OP with operands X and Y with sizes LEN_X and LEN_Y
2039 and byte orders BYTE_ORDER_X and BYTE_ORDER_Y, and store value in
2040 RESULT with size LEN_RESULT and byte order BYTE_ORDER_RESULT. */
7a26362d
UW
2041void
2042decimal_float_ops::binop (enum exp_opcode op,
2043 const gdb_byte *x, const struct type *type_x,
2044 const gdb_byte *y, const struct type *type_y,
2045 gdb_byte *res, const struct type *type_res) const
1cfb73db
UW
2046{
2047 decContext set;
2048 decNumber number1, number2, number3;
1cfb73db 2049
7a26362d
UW
2050 decimal_to_number (x, type_x, &number1);
2051 decimal_to_number (y, type_y, &number2);
1cfb73db 2052
7a26362d 2053 set_decnumber_context (&set, type_res);
1cfb73db
UW
2054
2055 switch (op)
2056 {
2057 case BINOP_ADD:
2058 decNumberAdd (&number3, &number1, &number2, &set);
2059 break;
2060 case BINOP_SUB:
2061 decNumberSubtract (&number3, &number1, &number2, &set);
2062 break;
2063 case BINOP_MUL:
2064 decNumberMultiply (&number3, &number1, &number2, &set);
2065 break;
2066 case BINOP_DIV:
2067 decNumberDivide (&number3, &number1, &number2, &set);
2068 break;
2069 case BINOP_EXP:
2070 decNumberPower (&number3, &number1, &number2, &set);
2071 break;
2072 default:
2073 error (_("Operation not valid for decimal floating point number."));
2074 break;
2075 }
2076
2077 /* Check for errors in the DFP operation. */
2078 decimal_check_errors (&set);
2079
7a26362d 2080 decimal_from_number (&number3, res, type_res);
1cfb73db
UW
2081}
2082
2083/* Compares two numbers numerically. If X is less than Y then the return value
2084 will be -1. If they are equal, then the return value will be 0. If X is
2085 greater than the Y then the return value will be 1. */
7a26362d
UW
2086int
2087decimal_float_ops::compare (const gdb_byte *x, const struct type *type_x,
2088 const gdb_byte *y, const struct type *type_y) const
1cfb73db
UW
2089{
2090 decNumber number1, number2, result;
2091 decContext set;
7a26362d 2092 const struct type *type_result;
1cfb73db 2093
7a26362d
UW
2094 decimal_to_number (x, type_x, &number1);
2095 decimal_to_number (y, type_y, &number2);
1cfb73db
UW
2096
2097 /* Perform the comparison in the larger of the two sizes. */
7a26362d
UW
2098 type_result = TYPE_LENGTH (type_x) > TYPE_LENGTH (type_y) ? type_x : type_y;
2099 set_decnumber_context (&set, type_result);
1cfb73db
UW
2100
2101 decNumberCompare (&result, &number1, &number2, &set);
2102
2103 /* Check for errors in the DFP operation. */
2104 decimal_check_errors (&set);
2105
2106 if (decNumberIsNaN (&result))
2107 error (_("Comparison with an invalid number (NaN)."));
2108 else if (decNumberIsZero (&result))
2109 return 0;
2110 else if (decNumberIsNegative (&result))
2111 return -1;
2112 else
2113 return 1;
2114}
2115
2116/* Convert a decimal value from a decimal type with LEN_FROM bytes to a
2117 decimal type with LEN_TO bytes. */
7a26362d
UW
2118void
2119decimal_float_ops::convert (const gdb_byte *from, const struct type *from_type,
2120 gdb_byte *to, const struct type *to_type) const
1cfb73db
UW
2121{
2122 decNumber number;
1cfb73db 2123
7a26362d
UW
2124 decimal_to_number (from, from_type, &number);
2125 decimal_from_number (&number, to, to_type);
1cfb73db
UW
2126}
2127
2128
70100014
UW
2129/* Typed floating-point routines. These routines operate on floating-point
2130 values in target format, represented by a byte buffer interpreted as a
2131 "struct type", which may be either a binary or decimal floating-point
2132 type (TYPE_CODE_FLT or TYPE_CODE_DECFLOAT). */
2133
7a26362d
UW
2134/* Return whether TYPE1 and TYPE2 are of the same category (binary or
2135 decimal floating-point). */
2136static bool
2137target_float_same_category_p (const struct type *type1,
2138 const struct type *type2)
2139{
2140 return TYPE_CODE (type1) == TYPE_CODE (type2);
2141}
2142
2143/* Return whether TYPE1 and TYPE2 use the same floating-point format. */
2144static bool
2145target_float_same_format_p (const struct type *type1,
2146 const struct type *type2)
2147{
2148 if (!target_float_same_category_p (type1, type2))
2149 return false;
2150
2151 switch (TYPE_CODE (type1))
2152 {
2153 case TYPE_CODE_FLT:
2154 return floatformat_from_type (type1) == floatformat_from_type (type2);
2155
2156 case TYPE_CODE_DECFLOAT:
2157 return (TYPE_LENGTH (type1) == TYPE_LENGTH (type2)
2158 && (gdbarch_byte_order (get_type_arch (type1))
2159 == gdbarch_byte_order (get_type_arch (type2))));
2160
2161 default:
2162 gdb_assert_not_reached ("unexpected type code");
2163 }
2164}
2165
2166/* Return the size (without padding) of the target floating-point
2167 format used by TYPE. */
2168static int
2169target_float_format_length (const struct type *type)
2170{
2171 switch (TYPE_CODE (type))
2172 {
2173 case TYPE_CODE_FLT:
2174 return floatformat_totalsize_bytes (floatformat_from_type (type));
2175
2176 case TYPE_CODE_DECFLOAT:
2177 return TYPE_LENGTH (type);
2178
2179 default:
2180 gdb_assert_not_reached ("unexpected type code");
2181 }
2182}
2183
2184/* Identifiers of available host-side intermediate formats. These must
2185 be sorted so the that the more "general" kinds come later. */
2186enum target_float_ops_kind
2187{
2188 /* Target binary floating-point formats that match a host format. */
2189 host_float = 0,
2190 host_double,
2191 host_long_double,
2192 /* Any other target binary floating-point format. */
2193 binary,
2194 /* Any target decimal floating-point format. */
2195 decimal
2196};
2197
2198/* Given a target type TYPE, choose the best host-side intermediate format
2199 to perform operations on TYPE in. */
2200static enum target_float_ops_kind
2201get_target_float_ops_kind (const struct type *type)
2202{
2203 switch (TYPE_CODE (type))
2204 {
2205 case TYPE_CODE_FLT:
2206 {
2207 const struct floatformat *fmt = floatformat_from_type (type);
2208
2209 /* Binary floating-point formats matching a host format. */
2210 if (fmt == host_float_format)
2211 return target_float_ops_kind::host_float;
2212 if (fmt == host_double_format)
2213 return target_float_ops_kind::host_double;
2214 if (fmt == host_long_double_format)
2215 return target_float_ops_kind::host_long_double;
2216
2217 /* Any other binary floating-point format. */
2218 return target_float_ops_kind::binary;
2219 }
2220
2221 case TYPE_CODE_DECFLOAT:
2222 {
2223 /* Any decimal floating-point format. */
2224 return target_float_ops_kind::decimal;
2225 }
2226
2227 default:
2228 gdb_assert_not_reached ("unexpected type code");
2229 }
2230}
2231
2232/* Return target_float_ops to peform operations for KIND. */
2233static const target_float_ops *
2234get_target_float_ops (enum target_float_ops_kind kind)
2235{
2236 switch (kind)
2237 {
2238 /* If the type format matches one of the host floating-point
2239 types, use that type as intermediate format. */
2240 case target_float_ops_kind::host_float:
2241 {
2242 static host_float_ops<float> host_float_ops_float;
2243 return &host_float_ops_float;
2244 }
2245
2246 case target_float_ops_kind::host_double:
2247 {
2248 static host_float_ops<double> host_float_ops_double;
2249 return &host_float_ops_double;
2250 }
2251
2252 case target_float_ops_kind::host_long_double:
2253 {
2254 static host_float_ops<long double> host_float_ops_long_double;
2255 return &host_float_ops_long_double;
2256 }
2257
2258 /* For binary floating-point formats that do not match any host format,
2400729e
UW
2259 use mpfr_t as intermediate format to provide precise target-floating
2260 point emulation. However, if the MPFR library is not availabe,
7a26362d
UW
2261 use the largest host floating-point type as intermediate format. */
2262 case target_float_ops_kind::binary:
2263 {
2400729e
UW
2264#ifdef HAVE_LIBMPFR
2265 static mpfr_float_ops binary_float_ops;
2266#else
7a26362d 2267 static host_float_ops<long double> binary_float_ops;
2400729e 2268#endif
7a26362d
UW
2269 return &binary_float_ops;
2270 }
2271
2272 /* For decimal floating-point types, always use the libdecnumber
2273 decNumber type as intermediate format. */
2274 case target_float_ops_kind::decimal:
2275 {
2276 static decimal_float_ops decimal_float_ops;
2277 return &decimal_float_ops;
2278 }
2279
2280 default:
2281 gdb_assert_not_reached ("unexpected target_float_ops_kind");
2282 }
2283}
2284
2285/* Given a target type TYPE, determine the best host-side intermediate format
2286 to perform operations on TYPE in. */
2287static const target_float_ops *
2288get_target_float_ops (const struct type *type)
2289{
2290 enum target_float_ops_kind kind = get_target_float_ops_kind (type);
2291 return get_target_float_ops (kind);
2292}
2293
2294/* The same for operations involving two target types TYPE1 and TYPE2. */
2295static const target_float_ops *
2296get_target_float_ops (const struct type *type1, const struct type *type2)
2297{
2298 gdb_assert (TYPE_CODE (type1) == TYPE_CODE (type2));
2299
2300 enum target_float_ops_kind kind1 = get_target_float_ops_kind (type1);
2301 enum target_float_ops_kind kind2 = get_target_float_ops_kind (type2);
2302
2303 /* Given the way the kinds are sorted, we simply choose the larger one;
2304 this will be able to hold values of either type. */
2305 return get_target_float_ops (std::max (kind1, kind2));
2306}
2307
70100014
UW
2308/* Return whether the byte-stream ADDR holds a valid value of
2309 floating-point type TYPE. */
2310bool
2311target_float_is_valid (const gdb_byte *addr, const struct type *type)
2312{
2313 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2314 return floatformat_is_valid (floatformat_from_type (type), addr);
2315
2316 if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
2317 return true;
2318
2319 gdb_assert_not_reached ("unexpected type code");
2320}
2321
2322/* Return whether the byte-stream ADDR, interpreted as floating-point
2323 type TYPE, is numerically equal to zero (of either sign). */
2324bool
2325target_float_is_zero (const gdb_byte *addr, const struct type *type)
2326{
2327 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2328 return (floatformat_classify (floatformat_from_type (type), addr)
2329 == float_zero);
2330
2331 if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
7a26362d 2332 return decimal_is_zero (addr, type);
70100014
UW
2333
2334 gdb_assert_not_reached ("unexpected type code");
2335}
2336
f69fdf9b
UW
2337/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2338 to a string, optionally using the print format FORMAT. */
2339std::string
2340target_float_to_string (const gdb_byte *addr, const struct type *type,
2341 const char *format)
2342{
7a26362d
UW
2343 /* Unless we need to adhere to a specific format, provide special
2344 output for special cases of binary floating-point numbers. */
2345 if (format == nullptr && TYPE_CODE (type) == TYPE_CODE_FLT)
2346 {
2347 const struct floatformat *fmt = floatformat_from_type (type);
f69fdf9b 2348
7a26362d
UW
2349 /* Detect invalid representations. */
2350 if (!floatformat_is_valid (fmt, addr))
2351 return "<invalid float value>";
f69fdf9b 2352
7a26362d
UW
2353 /* Handle NaN and Inf. */
2354 enum float_kind kind = floatformat_classify (fmt, addr);
2355 if (kind == float_nan)
2356 {
2357 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2358 const char *mantissa = floatformat_mantissa (fmt, addr);
2359 return string_printf ("%snan(0x%s)", sign, mantissa);
2360 }
2361 else if (kind == float_infinite)
2362 {
2363 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2364 return string_printf ("%sinf", sign);
2365 }
2366 }
2367
2368 const target_float_ops *ops = get_target_float_ops (type);
2369 return ops->to_string (addr, type, format);
f69fdf9b
UW
2370}
2371
2372/* Parse string STRING into a target floating-number of type TYPE and
2373 store it as byte-stream ADDR. Return whether parsing succeeded. */
2374bool
2375target_float_from_string (gdb_byte *addr, const struct type *type,
2376 const std::string &string)
2377{
7a26362d
UW
2378 const target_float_ops *ops = get_target_float_ops (type);
2379 return ops->from_string (addr, type, string);
f69fdf9b 2380}
50637b26
UW
2381
2382/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2383 to an integer value (rounding towards zero). */
2384LONGEST
2385target_float_to_longest (const gdb_byte *addr, const struct type *type)
2386{
7a26362d
UW
2387 const target_float_ops *ops = get_target_float_ops (type);
2388 return ops->to_longest (addr, type);
50637b26
UW
2389}
2390
2391/* Convert signed integer VAL to a target floating-number of type TYPE
2392 and store it as byte-stream ADDR. */
2393void
2394target_float_from_longest (gdb_byte *addr, const struct type *type,
2395 LONGEST val)
2396{
7a26362d
UW
2397 const target_float_ops *ops = get_target_float_ops (type);
2398 ops->from_longest (addr, type, val);
50637b26
UW
2399}
2400
2401/* Convert unsigned integer VAL to a target floating-number of type TYPE
2402 and store it as byte-stream ADDR. */
2403void
2404target_float_from_ulongest (gdb_byte *addr, const struct type *type,
2405 ULONGEST val)
2406{
7a26362d
UW
2407 const target_float_ops *ops = get_target_float_ops (type);
2408 ops->from_ulongest (addr, type, val);
50637b26
UW
2409}
2410
14ad9311
UW
2411/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2412 to a floating-point value in the host "double" format. */
2413double
2414target_float_to_host_double (const gdb_byte *addr,
2415 const struct type *type)
2416{
7a26362d
UW
2417 const target_float_ops *ops = get_target_float_ops (type);
2418 return ops->to_host_double (addr, type);
14ad9311
UW
2419}
2420
2421/* Convert floating-point value VAL in the host "double" format to a target
2422 floating-number of type TYPE and store it as byte-stream ADDR. */
2423void
2424target_float_from_host_double (gdb_byte *addr, const struct type *type,
2425 double val)
2426{
7a26362d
UW
2427 const target_float_ops *ops = get_target_float_ops (type);
2428 ops->from_host_double (addr, type, val);
14ad9311
UW
2429}
2430
50637b26
UW
2431/* Convert a floating-point number of type FROM_TYPE from the target
2432 byte-stream FROM to a floating-point number of type TO_TYPE, and
2433 store it to the target byte-stream TO. */
2434void
2435target_float_convert (const gdb_byte *from, const struct type *from_type,
2436 gdb_byte *to, const struct type *to_type)
2437{
50637b26
UW
2438 /* We cannot directly convert between binary and decimal floating-point
2439 types, so go via an intermediary string. */
7a26362d 2440 if (!target_float_same_category_p (from_type, to_type))
50637b26
UW
2441 {
2442 std::string str = target_float_to_string (from, from_type);
2443 target_float_from_string (to, to_type, str);
2444 return;
2445 }
2446
7a26362d
UW
2447 /* Convert between two different formats in the same category. */
2448 if (!target_float_same_format_p (from_type, to_type))
2449 {
2450 const target_float_ops *ops = get_target_float_ops (from_type, to_type);
2451 ops->convert (from, from_type, to, to_type);
2452 return;
2453 }
2454
2455 /* The floating-point formats match, so we simply copy the data, ensuring
2456 possible padding bytes in the target buffer are zeroed out. */
2457 memset (to, 0, TYPE_LENGTH (to_type));
2458 memcpy (to, from, target_float_format_length (to_type));
50637b26 2459}
66c02b9e
UW
2460
2461/* Perform the binary operation indicated by OPCODE, using as operands the
2462 target byte streams X and Y, interpreted as floating-point numbers of
2463 types TYPE_X and TYPE_Y, respectively. Convert the result to type
2464 TYPE_RES and store it into the byte-stream RES.
2465
2466 The three types must either be all binary floating-point types, or else
2467 all decimal floating-point types. Binary and decimal floating-point
2468 types cannot be mixed within a single operation. */
2469void
2470target_float_binop (enum exp_opcode opcode,
2471 const gdb_byte *x, const struct type *type_x,
2472 const gdb_byte *y, const struct type *type_y,
2473 gdb_byte *res, const struct type *type_res)
2474{
7a26362d
UW
2475 gdb_assert (target_float_same_category_p (type_x, type_res));
2476 gdb_assert (target_float_same_category_p (type_y, type_res));
66c02b9e 2477
7a26362d
UW
2478 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2479 ops->binop (opcode, x, type_x, y, type_y, res, type_res);
66c02b9e
UW
2480}
2481
2482/* Compare the two target byte streams X and Y, interpreted as floating-point
2483 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
2484 are equal, -1 if X is less than Y, and 1 otherwise.
2485
2486 The two types must either both be binary floating-point types, or else
2487 both be decimal floating-point types. Binary and decimal floating-point
2488 types cannot compared directly against each other. */
2489int
2490target_float_compare (const gdb_byte *x, const struct type *type_x,
2491 const gdb_byte *y, const struct type *type_y)
2492{
7a26362d 2493 gdb_assert (target_float_same_category_p (type_x, type_y));
66c02b9e 2494
7a26362d
UW
2495 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2496 return ops->compare (x, type_x, y, type_y);
66c02b9e
UW
2497}
2498