Provide pid_to_exec_file on Solaris (PR tdep/17903)
[deliverable/binutils-gdb.git] / gdb / target-float.c
1 /* Floating point routines for GDB, the GNU debugger.
2
3 Copyright (C) 2017-2018 Free Software Foundation, Inc.
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"
21 #include "gdbtypes.h"
22 #include "floatformat.h"
23 #include "target-float.h"
24
25
26 /* Target floating-point operations.
27
28 We provide multiple implementations of those operations, which differ
29 by the host-side intermediate format they perform computations in.
30
31 Those multiple implementations all derive from the following abstract
32 base class, which specifies the set of operations to be implemented. */
33
34 class target_float_ops
35 {
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;
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>
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). */
72 enum 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. */
90 static size_t
91 floatformat_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. */
98 static int
99 floatformat_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. */
118 static enum floatformat_byteorders
119 floatformat_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. */
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)
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. */
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)
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. */
299 static int
300 floatformat_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. */
324 static enum float_kind
325 floatformat_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. */
412 static const char *
413 floatformat_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
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)
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
535 template<typename T> class host_float_ops : public target_float_ops
536 {
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;
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
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;
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.
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
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;
595
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
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;
630 T dto;
631 long exponent;
632 unsigned long mant;
633 unsigned int mant_bits, mant_off;
634 int mant_bits_left;
635 int special_exponent; /* It's a NaN, denorm or zero. */
636 enum floatformat_byteorders order;
637 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
638 enum float_kind kind;
639
640 gdb_assert (fmt->totalsize
641 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
642
643 /* For non-numbers, reuse libiberty's logic to find the correct
644 format. We do not lose any precision in this case by passing
645 through a double. */
646 kind = floatformat_classify (fmt, (const bfd_byte *) from);
647 if (kind == float_infinite || kind == float_nan)
648 {
649 double dto;
650
651 floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
652 from, &dto);
653 *to = (T) dto;
654 return;
655 }
656
657 order = floatformat_normalize_byteorder (fmt, ufrom, newfrom);
658
659 if (order != fmt->byteorder)
660 ufrom = newfrom;
661
662 if (fmt->split_half)
663 {
664 T dtop, dbot;
665
666 from_target (fmt->split_half, ufrom, &dtop);
667 /* Preserve the sign of 0, which is the sign of the top
668 half. */
669 if (dtop == 0.0)
670 {
671 *to = dtop;
672 return;
673 }
674 from_target (fmt->split_half,
675 ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, &dbot);
676 *to = dtop + dbot;
677 return;
678 }
679
680 exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
681 fmt->exp_len);
682 /* Note that if exponent indicates a NaN, we can't really do anything useful
683 (not knowing if the host has NaN's, or how to build one). So it will
684 end up as an infinity or something close; that is OK. */
685
686 mant_bits_left = fmt->man_len;
687 mant_off = fmt->man_start;
688 dto = 0.0;
689
690 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
691
692 /* Don't bias NaNs. Use minimum exponent for denorms. For
693 simplicity, we don't check for zero as the exponent doesn't matter.
694 Note the cast to int; exp_bias is unsigned, so it's important to
695 make sure the operation is done in signed arithmetic. */
696 if (!special_exponent)
697 exponent -= fmt->exp_bias;
698 else if (exponent == 0)
699 exponent = 1 - fmt->exp_bias;
700
701 /* Build the result algebraically. Might go infinite, underflow, etc;
702 who cares. */
703
704 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
705 increment the exponent by one to account for the integer bit. */
706
707 if (!special_exponent)
708 {
709 if (fmt->intbit == floatformat_intbit_no)
710 dto = ldexp (1.0, exponent);
711 else
712 exponent++;
713 }
714
715 while (mant_bits_left > 0)
716 {
717 mant_bits = std::min (mant_bits_left, 32);
718
719 mant = get_field (ufrom, order, fmt->totalsize, mant_off, mant_bits);
720
721 dto += ldexp ((T) mant, exponent - mant_bits);
722 exponent -= mant_bits;
723 mant_off += mant_bits;
724 mant_bits_left -= mant_bits;
725 }
726
727 /* Negate it if negative. */
728 if (get_field (ufrom, order, fmt->totalsize, fmt->sign_start, 1))
729 dto = -dto;
730 *to = dto;
731 }
732
733 template<typename T> void
734 host_float_ops<T>::from_target (const struct type *type,
735 const gdb_byte *from, T *to) const
736 {
737 from_target (floatformat_from_type (type), from, to);
738 }
739
740 /* Convert host floating-point value of type T to target floating-point
741 value in format FMT and store at TO. */
742 template<typename T> void
743 host_float_ops<T>::to_target (const struct floatformat *fmt,
744 const T *from, gdb_byte *to) const
745 {
746 gdb_assert (fmt != NULL);
747
748 if (fmt == host_float_format)
749 {
750 float val = *from;
751
752 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
753 return;
754 }
755 else if (fmt == host_double_format)
756 {
757 double val = *from;
758
759 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
760 return;
761 }
762 else if (fmt == host_long_double_format)
763 {
764 long double val = *from;
765
766 memcpy (to, &val, floatformat_totalsize_bytes (fmt));
767 return;
768 }
769
770 T dfrom;
771 int exponent;
772 T mant;
773 unsigned int mant_bits, mant_off;
774 int mant_bits_left;
775 unsigned char *uto = (unsigned char *) to;
776 enum floatformat_byteorders order = fmt->byteorder;
777 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
778
779 if (order != floatformat_little)
780 order = floatformat_big;
781
782 if (order != fmt->byteorder)
783 uto = newto;
784
785 memcpy (&dfrom, from, sizeof (dfrom));
786 memset (uto, 0, floatformat_totalsize_bytes (fmt));
787
788 if (fmt->split_half)
789 {
790 /* Use static volatile to ensure that any excess precision is
791 removed via storing in memory, and so the top half really is
792 the result of converting to double. */
793 static volatile double dtop, dbot;
794 T dtopnv, dbotnv;
795
796 dtop = (double) dfrom;
797 /* If the rounded top half is Inf, the bottom must be 0 not NaN
798 or Inf. */
799 if (dtop + dtop == dtop && dtop != 0.0)
800 dbot = 0.0;
801 else
802 dbot = (double) (dfrom - (T) dtop);
803 dtopnv = dtop;
804 dbotnv = dbot;
805 to_target (fmt->split_half, &dtopnv, uto);
806 to_target (fmt->split_half, &dbotnv,
807 uto + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
808 return;
809 }
810
811 if (dfrom == 0)
812 goto finalize_byteorder; /* Result is zero */
813 if (dfrom != dfrom) /* Result is NaN */
814 {
815 /* From is NaN */
816 put_field (uto, order, fmt->totalsize, fmt->exp_start,
817 fmt->exp_len, fmt->exp_nan);
818 /* Be sure it's not infinity, but NaN value is irrel. */
819 put_field (uto, order, fmt->totalsize, fmt->man_start,
820 fmt->man_len, 1);
821 goto finalize_byteorder;
822 }
823
824 /* If negative, set the sign bit. */
825 if (dfrom < 0)
826 {
827 put_field (uto, order, fmt->totalsize, fmt->sign_start, 1, 1);
828 dfrom = -dfrom;
829 }
830
831 if (dfrom + dfrom == dfrom && dfrom != 0.0) /* Result is Infinity. */
832 {
833 /* Infinity exponent is same as NaN's. */
834 put_field (uto, order, fmt->totalsize, fmt->exp_start,
835 fmt->exp_len, fmt->exp_nan);
836 /* Infinity mantissa is all zeroes. */
837 put_field (uto, order, fmt->totalsize, fmt->man_start,
838 fmt->man_len, 0);
839 goto finalize_byteorder;
840 }
841
842 mant = frexp (dfrom, &exponent);
843
844 if (exponent + fmt->exp_bias <= 0)
845 {
846 /* The value is too small to be expressed in the destination
847 type (not enough bits in the exponent. Treat as 0. */
848 put_field (uto, order, fmt->totalsize, fmt->exp_start,
849 fmt->exp_len, 0);
850 put_field (uto, order, fmt->totalsize, fmt->man_start,
851 fmt->man_len, 0);
852 goto finalize_byteorder;
853 }
854
855 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
856 {
857 /* The value is too large to fit into the destination.
858 Treat as infinity. */
859 put_field (uto, order, fmt->totalsize, fmt->exp_start,
860 fmt->exp_len, fmt->exp_nan);
861 put_field (uto, order, fmt->totalsize, fmt->man_start,
862 fmt->man_len, 0);
863 goto finalize_byteorder;
864 }
865
866 put_field (uto, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
867 exponent + fmt->exp_bias - 1);
868
869 mant_bits_left = fmt->man_len;
870 mant_off = fmt->man_start;
871 while (mant_bits_left > 0)
872 {
873 unsigned long mant_long;
874
875 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
876
877 mant *= 4294967296.0;
878 mant_long = ((unsigned long) mant) & 0xffffffffL;
879 mant -= mant_long;
880
881 /* If the integer bit is implicit, then we need to discard it.
882 If we are discarding a zero, we should be (but are not) creating
883 a denormalized number which means adjusting the exponent
884 (I think). */
885 if (mant_bits_left == fmt->man_len
886 && fmt->intbit == floatformat_intbit_no)
887 {
888 mant_long <<= 1;
889 mant_long &= 0xffffffffL;
890 /* If we are processing the top 32 mantissa bits of a doublest
891 so as to convert to a float value with implied integer bit,
892 we will only be putting 31 of those 32 bits into the
893 final value due to the discarding of the top bit. In the
894 case of a small float value where the number of mantissa
895 bits is less than 32, discarding the top bit does not alter
896 the number of bits we will be adding to the result. */
897 if (mant_bits == 32)
898 mant_bits -= 1;
899 }
900
901 if (mant_bits < 32)
902 {
903 /* The bits we want are in the most significant MANT_BITS bits of
904 mant_long. Move them to the least significant. */
905 mant_long >>= 32 - mant_bits;
906 }
907
908 put_field (uto, order, fmt->totalsize,
909 mant_off, mant_bits, mant_long);
910 mant_off += mant_bits;
911 mant_bits_left -= mant_bits;
912 }
913
914 finalize_byteorder:
915 /* Do we need to byte-swap the words in the result? */
916 if (order != fmt->byteorder)
917 floatformat_normalize_byteorder (fmt, newto, to);
918 }
919
920 template<typename T> void
921 host_float_ops<T>::to_target (const struct type *type,
922 const T *from, gdb_byte *to) const
923 {
924 /* Ensure possible padding bytes in the target buffer are zeroed out. */
925 memset (to, 0, TYPE_LENGTH (type));
926
927 to_target (floatformat_from_type (type), from, to);
928 }
929
930 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
931 to a string, optionally using the print format FORMAT. */
932 template<typename T> struct printf_length_modifier
933 {
934 static constexpr char value = 0;
935 };
936 template<> struct printf_length_modifier<long double>
937 {
938 static constexpr char value = 'L';
939 };
940 template<typename T> std::string
941 host_float_ops<T>::to_string (const gdb_byte *addr, const struct type *type,
942 const char *format) const
943 {
944 /* Determine the format string to use on the host side. */
945 constexpr char length = printf_length_modifier<T>::value;
946 const struct floatformat *fmt = floatformat_from_type (type);
947 std::string host_format = floatformat_printf_format (fmt, format, length);
948
949 T host_float;
950 from_target (type, addr, &host_float);
951
952 DIAGNOSTIC_PUSH
953 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
954 return string_printf (host_format.c_str (), host_float);
955 DIAGNOSTIC_POP
956 }
957
958 /* Parse string IN into a target floating-number of type TYPE and
959 store it as byte-stream ADDR. Return whether parsing succeeded. */
960 template<typename T> struct scanf_length_modifier
961 {
962 static constexpr char value = 0;
963 };
964 template<> struct scanf_length_modifier<double>
965 {
966 static constexpr char value = 'l';
967 };
968 template<> struct scanf_length_modifier<long double>
969 {
970 static constexpr char value = 'L';
971 };
972 template<typename T> bool
973 host_float_ops<T>::from_string (gdb_byte *addr, const struct type *type,
974 const std::string &in) const
975 {
976 T host_float;
977 int n, num;
978
979 std::string scan_format = "%";
980 if (scanf_length_modifier<T>::value)
981 scan_format += scanf_length_modifier<T>::value;
982 scan_format += "g%n";
983
984 DIAGNOSTIC_PUSH
985 DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
986 num = sscanf (in.c_str (), scan_format.c_str(), &host_float, &n);
987 DIAGNOSTIC_POP
988
989 /* The sscanf man page suggests not making any assumptions on the effect
990 of %n on the result, so we don't.
991 That is why we simply test num == 0. */
992 if (num == 0)
993 return false;
994
995 /* We only accept the whole string. */
996 if (in[n])
997 return false;
998
999 to_target (type, &host_float, addr);
1000 return true;
1001 }
1002
1003 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1004 to an integer value (rounding towards zero). */
1005 template<typename T> LONGEST
1006 host_float_ops<T>::to_longest (const gdb_byte *addr,
1007 const struct type *type) const
1008 {
1009 T host_float;
1010 from_target (type, addr, &host_float);
1011 /* Converting an out-of-range value is undefined behavior in C, but we
1012 prefer to return a defined value here. */
1013 if (host_float > std::numeric_limits<LONGEST>::max())
1014 return std::numeric_limits<LONGEST>::max();
1015 if (host_float < std::numeric_limits<LONGEST>::min())
1016 return std::numeric_limits<LONGEST>::min();
1017 return (LONGEST) host_float;
1018 }
1019
1020 /* Convert signed integer VAL to a target floating-number of type TYPE
1021 and store it as byte-stream ADDR. */
1022 template<typename T> void
1023 host_float_ops<T>::from_longest (gdb_byte *addr, const struct type *type,
1024 LONGEST val) const
1025 {
1026 T host_float = (T) val;
1027 to_target (type, &host_float, addr);
1028 }
1029
1030 /* Convert unsigned integer VAL to a target floating-number of type TYPE
1031 and store it as byte-stream ADDR. */
1032 template<typename T> void
1033 host_float_ops<T>::from_ulongest (gdb_byte *addr, const struct type *type,
1034 ULONGEST val) const
1035 {
1036 T host_float = (T) val;
1037 to_target (type, &host_float, addr);
1038 }
1039
1040 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1041 to a floating-point value in the host "double" format. */
1042 template<typename T> double
1043 host_float_ops<T>::to_host_double (const gdb_byte *addr,
1044 const struct type *type) const
1045 {
1046 T host_float;
1047 from_target (type, addr, &host_float);
1048 return (double) host_float;
1049 }
1050
1051 /* Convert floating-point value VAL in the host "double" format to a target
1052 floating-number of type TYPE and store it as byte-stream ADDR. */
1053 template<typename T> void
1054 host_float_ops<T>::from_host_double (gdb_byte *addr, const struct type *type,
1055 double val) const
1056 {
1057 T host_float = (T) val;
1058 to_target (type, &host_float, addr);
1059 }
1060
1061 /* Convert a floating-point number of type FROM_TYPE from the target
1062 byte-stream FROM to a floating-point number of type TO_TYPE, and
1063 store it to the target byte-stream TO. */
1064 template<typename T> void
1065 host_float_ops<T>::convert (const gdb_byte *from,
1066 const struct type *from_type,
1067 gdb_byte *to,
1068 const struct type *to_type) const
1069 {
1070 T host_float;
1071 from_target (from_type, from, &host_float);
1072 to_target (to_type, &host_float, to);
1073 }
1074
1075 /* Perform the binary operation indicated by OPCODE, using as operands the
1076 target byte streams X and Y, interpreted as floating-point numbers of
1077 types TYPE_X and TYPE_Y, respectively. Convert the result to format
1078 TYPE_RES and store it into the byte-stream RES. */
1079 template<typename T> void
1080 host_float_ops<T>::binop (enum exp_opcode op,
1081 const gdb_byte *x, const struct type *type_x,
1082 const gdb_byte *y, const struct type *type_y,
1083 gdb_byte *res, const struct type *type_res) const
1084 {
1085 T v1, v2, v = 0;
1086
1087 from_target (type_x, x, &v1);
1088 from_target (type_y, y, &v2);
1089
1090 switch (op)
1091 {
1092 case BINOP_ADD:
1093 v = v1 + v2;
1094 break;
1095
1096 case BINOP_SUB:
1097 v = v1 - v2;
1098 break;
1099
1100 case BINOP_MUL:
1101 v = v1 * v2;
1102 break;
1103
1104 case BINOP_DIV:
1105 v = v1 / v2;
1106 break;
1107
1108 case BINOP_EXP:
1109 errno = 0;
1110 v = pow (v1, v2);
1111 if (errno)
1112 error (_("Cannot perform exponentiation: %s"),
1113 safe_strerror (errno));
1114 break;
1115
1116 case BINOP_MIN:
1117 v = v1 < v2 ? v1 : v2;
1118 break;
1119
1120 case BINOP_MAX:
1121 v = v1 > v2 ? v1 : v2;
1122 break;
1123
1124 default:
1125 error (_("Integer-only operation on floating point number."));
1126 break;
1127 }
1128
1129 to_target (type_res, &v, res);
1130 }
1131
1132 /* Compare the two target byte streams X and Y, interpreted as floating-point
1133 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
1134 are equal, -1 if X is less than Y, and 1 otherwise. */
1135 template<typename T> int
1136 host_float_ops<T>::compare (const gdb_byte *x, const struct type *type_x,
1137 const gdb_byte *y, const struct type *type_y) const
1138 {
1139 T v1, v2;
1140
1141 from_target (type_x, x, &v1);
1142 from_target (type_y, y, &v2);
1143
1144 if (v1 == v2)
1145 return 0;
1146 if (v1 < v2)
1147 return -1;
1148 return 1;
1149 }
1150
1151
1152 /* Implementation of target_float_ops using the MPFR library
1153 mpfr_t as intermediate type. */
1154
1155 #ifdef HAVE_LIBMPFR
1156
1157 #define MPFR_USE_INTMAX_T
1158
1159 #include <mpfr.h>
1160
1161 class mpfr_float_ops : public target_float_ops
1162 {
1163 public:
1164 std::string to_string (const gdb_byte *addr, const struct type *type,
1165 const char *format) const override;
1166 bool from_string (gdb_byte *addr, const struct type *type,
1167 const std::string &string) const override;
1168
1169 LONGEST to_longest (const gdb_byte *addr,
1170 const struct type *type) const override;
1171 void from_longest (gdb_byte *addr, const struct type *type,
1172 LONGEST val) const override;
1173 void from_ulongest (gdb_byte *addr, const struct type *type,
1174 ULONGEST val) const override;
1175 double to_host_double (const gdb_byte *addr,
1176 const struct type *type) const override;
1177 void from_host_double (gdb_byte *addr, const struct type *type,
1178 double val) const override;
1179 void convert (const gdb_byte *from, const struct type *from_type,
1180 gdb_byte *to, const struct type *to_type) const override;
1181
1182 void binop (enum exp_opcode opcode,
1183 const gdb_byte *x, const struct type *type_x,
1184 const gdb_byte *y, const struct type *type_y,
1185 gdb_byte *res, const struct type *type_res) const override;
1186 int compare (const gdb_byte *x, const struct type *type_x,
1187 const gdb_byte *y, const struct type *type_y) const override;
1188
1189 private:
1190 /* Local wrapper class to handle mpfr_t initalization and cleanup. */
1191 class gdb_mpfr
1192 {
1193 public:
1194 mpfr_t val;
1195
1196 gdb_mpfr (const struct type *type)
1197 {
1198 const struct floatformat *fmt = floatformat_from_type (type);
1199 mpfr_init2 (val, floatformat_precision (fmt));
1200 }
1201
1202 gdb_mpfr (const gdb_mpfr &source)
1203 {
1204 mpfr_init2 (val, mpfr_get_prec (source.val));
1205 }
1206
1207 ~gdb_mpfr ()
1208 {
1209 mpfr_clear (val);
1210 }
1211 };
1212
1213 void from_target (const struct floatformat *fmt,
1214 const gdb_byte *from, gdb_mpfr &to) const;
1215 void from_target (const struct type *type,
1216 const gdb_byte *from, gdb_mpfr &to) const;
1217
1218 void to_target (const struct type *type,
1219 const gdb_mpfr &from, gdb_byte *to) const;
1220 void to_target (const struct floatformat *fmt,
1221 const gdb_mpfr &from, gdb_byte *to) const;
1222 };
1223
1224
1225 /* Convert TO/FROM target floating-point format to mpfr_t. */
1226
1227 void
1228 mpfr_float_ops::from_target (const struct floatformat *fmt,
1229 const gdb_byte *orig_from, gdb_mpfr &to) const
1230 {
1231 const gdb_byte *from = orig_from;
1232 mpfr_exp_t exponent;
1233 unsigned long mant;
1234 unsigned int mant_bits, mant_off;
1235 int mant_bits_left;
1236 int special_exponent; /* It's a NaN, denorm or zero. */
1237 enum floatformat_byteorders order;
1238 unsigned char newfrom[FLOATFORMAT_LARGEST_BYTES];
1239 enum float_kind kind;
1240
1241 gdb_assert (fmt->totalsize
1242 <= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
1243
1244 /* Handle non-numbers. */
1245 kind = floatformat_classify (fmt, from);
1246 if (kind == float_infinite)
1247 {
1248 mpfr_set_inf (to.val, floatformat_is_negative (fmt, from) ? -1 : 1);
1249 return;
1250 }
1251 if (kind == float_nan)
1252 {
1253 mpfr_set_nan (to.val);
1254 return;
1255 }
1256
1257 order = floatformat_normalize_byteorder (fmt, from, newfrom);
1258
1259 if (order != fmt->byteorder)
1260 from = newfrom;
1261
1262 if (fmt->split_half)
1263 {
1264 gdb_mpfr top (to), bot (to);
1265
1266 from_target (fmt->split_half, from, top);
1267 /* Preserve the sign of 0, which is the sign of the top half. */
1268 if (mpfr_zero_p (top.val))
1269 {
1270 mpfr_set (to.val, top.val, MPFR_RNDN);
1271 return;
1272 }
1273 from_target (fmt->split_half,
1274 from + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2, bot);
1275 mpfr_add (to.val, top.val, bot.val, MPFR_RNDN);
1276 return;
1277 }
1278
1279 exponent = get_field (from, order, fmt->totalsize, fmt->exp_start,
1280 fmt->exp_len);
1281 /* Note that if exponent indicates a NaN, we can't really do anything useful
1282 (not knowing if the host has NaN's, or how to build one). So it will
1283 end up as an infinity or something close; that is OK. */
1284
1285 mant_bits_left = fmt->man_len;
1286 mant_off = fmt->man_start;
1287 mpfr_set_zero (to.val, 0);
1288
1289 special_exponent = exponent == 0 || exponent == fmt->exp_nan;
1290
1291 /* Don't bias NaNs. Use minimum exponent for denorms. For
1292 simplicity, we don't check for zero as the exponent doesn't matter.
1293 Note the cast to int; exp_bias is unsigned, so it's important to
1294 make sure the operation is done in signed arithmetic. */
1295 if (!special_exponent)
1296 exponent -= fmt->exp_bias;
1297 else if (exponent == 0)
1298 exponent = 1 - fmt->exp_bias;
1299
1300 /* Build the result algebraically. Might go infinite, underflow, etc;
1301 who cares. */
1302
1303 /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
1304 increment the exponent by one to account for the integer bit. */
1305
1306 if (!special_exponent)
1307 {
1308 if (fmt->intbit == floatformat_intbit_no)
1309 mpfr_set_ui_2exp (to.val, 1, exponent, MPFR_RNDN);
1310 else
1311 exponent++;
1312 }
1313
1314 gdb_mpfr tmp (to);
1315
1316 while (mant_bits_left > 0)
1317 {
1318 mant_bits = std::min (mant_bits_left, 32);
1319
1320 mant = get_field (from, order, fmt->totalsize, mant_off, mant_bits);
1321
1322 mpfr_set_ui (tmp.val, mant, MPFR_RNDN);
1323 mpfr_mul_2si (tmp.val, tmp.val, exponent - mant_bits, MPFR_RNDN);
1324 mpfr_add (to.val, to.val, tmp.val, MPFR_RNDN);
1325 exponent -= mant_bits;
1326 mant_off += mant_bits;
1327 mant_bits_left -= mant_bits;
1328 }
1329
1330 /* Negate it if negative. */
1331 if (get_field (from, order, fmt->totalsize, fmt->sign_start, 1))
1332 mpfr_neg (to.val, to.val, MPFR_RNDN);
1333 }
1334
1335 void
1336 mpfr_float_ops::from_target (const struct type *type,
1337 const gdb_byte *from, gdb_mpfr &to) const
1338 {
1339 from_target (floatformat_from_type (type), from, to);
1340 }
1341
1342 void
1343 mpfr_float_ops::to_target (const struct floatformat *fmt,
1344 const gdb_mpfr &from, gdb_byte *orig_to) const
1345 {
1346 unsigned char *to = orig_to;
1347 mpfr_exp_t exponent;
1348 unsigned int mant_bits, mant_off;
1349 int mant_bits_left;
1350 enum floatformat_byteorders order = fmt->byteorder;
1351 unsigned char newto[FLOATFORMAT_LARGEST_BYTES];
1352
1353 if (order != floatformat_little)
1354 order = floatformat_big;
1355
1356 if (order != fmt->byteorder)
1357 to = newto;
1358
1359 memset (to, 0, floatformat_totalsize_bytes (fmt));
1360
1361 if (fmt->split_half)
1362 {
1363 gdb_mpfr top (from), bot (from);
1364
1365 mpfr_set (top.val, from.val, MPFR_RNDN);
1366 /* If the rounded top half is Inf, the bottom must be 0 not NaN
1367 or Inf. */
1368 if (mpfr_inf_p (top.val))
1369 mpfr_set_zero (bot.val, 0);
1370 else
1371 mpfr_sub (bot.val, from.val, top.val, MPFR_RNDN);
1372
1373 to_target (fmt->split_half, top, to);
1374 to_target (fmt->split_half, bot,
1375 to + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2);
1376 return;
1377 }
1378
1379 gdb_mpfr tmp (from);
1380
1381 if (mpfr_zero_p (from.val))
1382 goto finalize_byteorder; /* Result is zero */
1383
1384 mpfr_set (tmp.val, from.val, MPFR_RNDN);
1385
1386 if (mpfr_nan_p (tmp.val)) /* Result is NaN */
1387 {
1388 /* From is NaN */
1389 put_field (to, order, fmt->totalsize, fmt->exp_start,
1390 fmt->exp_len, fmt->exp_nan);
1391 /* Be sure it's not infinity, but NaN value is irrel. */
1392 put_field (to, order, fmt->totalsize, fmt->man_start,
1393 fmt->man_len, 1);
1394 goto finalize_byteorder;
1395 }
1396
1397 /* If negative, set the sign bit. */
1398 if (mpfr_sgn (tmp.val) < 0)
1399 {
1400 put_field (to, order, fmt->totalsize, fmt->sign_start, 1, 1);
1401 mpfr_neg (tmp.val, tmp.val, MPFR_RNDN);
1402 }
1403
1404 if (mpfr_inf_p (tmp.val)) /* Result is Infinity. */
1405 {
1406 /* Infinity exponent is same as NaN's. */
1407 put_field (to, order, fmt->totalsize, fmt->exp_start,
1408 fmt->exp_len, fmt->exp_nan);
1409 /* Infinity mantissa is all zeroes. */
1410 put_field (to, order, fmt->totalsize, fmt->man_start,
1411 fmt->man_len, 0);
1412 goto finalize_byteorder;
1413 }
1414
1415 mpfr_frexp (&exponent, tmp.val, tmp.val, MPFR_RNDN);
1416
1417 if (exponent + fmt->exp_bias <= 0)
1418 {
1419 /* The value is too small to be expressed in the destination
1420 type (not enough bits in the exponent. Treat as 0. */
1421 put_field (to, order, fmt->totalsize, fmt->exp_start,
1422 fmt->exp_len, 0);
1423 put_field (to, order, fmt->totalsize, fmt->man_start,
1424 fmt->man_len, 0);
1425 goto finalize_byteorder;
1426 }
1427
1428 if (exponent + fmt->exp_bias >= (1 << fmt->exp_len))
1429 {
1430 /* The value is too large to fit into the destination.
1431 Treat as infinity. */
1432 put_field (to, order, fmt->totalsize, fmt->exp_start,
1433 fmt->exp_len, fmt->exp_nan);
1434 put_field (to, order, fmt->totalsize, fmt->man_start,
1435 fmt->man_len, 0);
1436 goto finalize_byteorder;
1437 }
1438
1439 put_field (to, order, fmt->totalsize, fmt->exp_start, fmt->exp_len,
1440 exponent + fmt->exp_bias - 1);
1441
1442 mant_bits_left = fmt->man_len;
1443 mant_off = fmt->man_start;
1444 while (mant_bits_left > 0)
1445 {
1446 unsigned long mant_long;
1447
1448 mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
1449
1450 mpfr_mul_2ui (tmp.val, tmp.val, 32, MPFR_RNDN);
1451 mant_long = mpfr_get_ui (tmp.val, MPFR_RNDZ) & 0xffffffffL;
1452 mpfr_sub_ui (tmp.val, tmp.val, mant_long, MPFR_RNDZ);
1453
1454 /* If the integer bit is implicit, then we need to discard it.
1455 If we are discarding a zero, we should be (but are not) creating
1456 a denormalized number which means adjusting the exponent
1457 (I think). */
1458 if (mant_bits_left == fmt->man_len
1459 && fmt->intbit == floatformat_intbit_no)
1460 {
1461 mant_long <<= 1;
1462 mant_long &= 0xffffffffL;
1463 /* If we are processing the top 32 mantissa bits of a doublest
1464 so as to convert to a float value with implied integer bit,
1465 we will only be putting 31 of those 32 bits into the
1466 final value due to the discarding of the top bit. In the
1467 case of a small float value where the number of mantissa
1468 bits is less than 32, discarding the top bit does not alter
1469 the number of bits we will be adding to the result. */
1470 if (mant_bits == 32)
1471 mant_bits -= 1;
1472 }
1473
1474 if (mant_bits < 32)
1475 {
1476 /* The bits we want are in the most significant MANT_BITS bits of
1477 mant_long. Move them to the least significant. */
1478 mant_long >>= 32 - mant_bits;
1479 }
1480
1481 put_field (to, order, fmt->totalsize,
1482 mant_off, mant_bits, mant_long);
1483 mant_off += mant_bits;
1484 mant_bits_left -= mant_bits;
1485 }
1486
1487 finalize_byteorder:
1488 /* Do we need to byte-swap the words in the result? */
1489 if (order != fmt->byteorder)
1490 floatformat_normalize_byteorder (fmt, newto, orig_to);
1491 }
1492
1493 void
1494 mpfr_float_ops::to_target (const struct type *type,
1495 const gdb_mpfr &from, gdb_byte *to) const
1496 {
1497 /* Ensure possible padding bytes in the target buffer are zeroed out. */
1498 memset (to, 0, TYPE_LENGTH (type));
1499
1500 to_target (floatformat_from_type (type), from, to);
1501 }
1502
1503 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1504 to a string, optionally using the print format FORMAT. */
1505 std::string
1506 mpfr_float_ops::to_string (const gdb_byte *addr,
1507 const struct type *type,
1508 const char *format) const
1509 {
1510 const struct floatformat *fmt = floatformat_from_type (type);
1511
1512 /* Unless we need to adhere to a specific format, provide special
1513 output for certain cases. */
1514 if (format == nullptr)
1515 {
1516 /* Detect invalid representations. */
1517 if (!floatformat_is_valid (fmt, addr))
1518 return "<invalid float value>";
1519
1520 /* Handle NaN and Inf. */
1521 enum float_kind kind = floatformat_classify (fmt, addr);
1522 if (kind == float_nan)
1523 {
1524 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1525 const char *mantissa = floatformat_mantissa (fmt, addr);
1526 return string_printf ("%snan(0x%s)", sign, mantissa);
1527 }
1528 else if (kind == float_infinite)
1529 {
1530 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
1531 return string_printf ("%sinf", sign);
1532 }
1533 }
1534
1535 /* Determine the format string to use on the host side. */
1536 std::string host_format = floatformat_printf_format (fmt, format, 'R');
1537
1538 gdb_mpfr tmp (type);
1539 from_target (type, addr, tmp);
1540
1541 int size = mpfr_snprintf (NULL, 0, host_format.c_str (), tmp.val);
1542 std::string str (size, '\0');
1543 mpfr_sprintf (&str[0], host_format.c_str (), tmp.val);
1544
1545 return str;
1546 }
1547
1548 /* Parse string STRING into a target floating-number of type TYPE and
1549 store it as byte-stream ADDR. Return whether parsing succeeded. */
1550 bool
1551 mpfr_float_ops::from_string (gdb_byte *addr,
1552 const struct type *type,
1553 const std::string &in) const
1554 {
1555 gdb_mpfr tmp (type);
1556
1557 char *endptr;
1558 mpfr_strtofr (tmp.val, in.c_str (), &endptr, 0, MPFR_RNDN);
1559
1560 /* We only accept the whole string. */
1561 if (*endptr)
1562 return false;
1563
1564 to_target (type, tmp, addr);
1565 return true;
1566 }
1567
1568 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1569 to an integer value (rounding towards zero). */
1570 LONGEST
1571 mpfr_float_ops::to_longest (const gdb_byte *addr,
1572 const struct type *type) const
1573 {
1574 gdb_mpfr tmp (type);
1575 from_target (type, addr, tmp);
1576 return mpfr_get_sj (tmp.val, MPFR_RNDZ);
1577 }
1578
1579 /* Convert signed integer VAL to a target floating-number of type TYPE
1580 and store it as byte-stream ADDR. */
1581 void
1582 mpfr_float_ops::from_longest (gdb_byte *addr,
1583 const struct type *type,
1584 LONGEST val) const
1585 {
1586 gdb_mpfr tmp (type);
1587 mpfr_set_sj (tmp.val, val, MPFR_RNDN);
1588 to_target (type, tmp, addr);
1589 }
1590
1591 /* Convert unsigned integer VAL to a target floating-number of type TYPE
1592 and store it as byte-stream ADDR. */
1593 void
1594 mpfr_float_ops::from_ulongest (gdb_byte *addr,
1595 const struct type *type,
1596 ULONGEST val) const
1597 {
1598 gdb_mpfr tmp (type);
1599 mpfr_set_uj (tmp.val, val, MPFR_RNDN);
1600 to_target (type, tmp, addr);
1601 }
1602
1603 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
1604 to a floating-point value in the host "double" format. */
1605 double
1606 mpfr_float_ops::to_host_double (const gdb_byte *addr,
1607 const struct type *type) const
1608 {
1609 gdb_mpfr tmp (type);
1610 from_target (type, addr, tmp);
1611 return mpfr_get_d (tmp.val, MPFR_RNDN);
1612 }
1613
1614 /* Convert floating-point value VAL in the host "double" format to a target
1615 floating-number of type TYPE and store it as byte-stream ADDR. */
1616 void
1617 mpfr_float_ops::from_host_double (gdb_byte *addr,
1618 const struct type *type,
1619 double val) const
1620 {
1621 gdb_mpfr tmp (type);
1622 mpfr_set_d (tmp.val, val, MPFR_RNDN);
1623 to_target (type, tmp, addr);
1624 }
1625
1626 /* Convert a floating-point number of type FROM_TYPE from the target
1627 byte-stream FROM to a floating-point number of type TO_TYPE, and
1628 store it to the target byte-stream TO. */
1629 void
1630 mpfr_float_ops::convert (const gdb_byte *from,
1631 const struct type *from_type,
1632 gdb_byte *to,
1633 const struct type *to_type) const
1634 {
1635 gdb_mpfr from_tmp (from_type), to_tmp (to_type);
1636 from_target (from_type, from, from_tmp);
1637 mpfr_set (to_tmp.val, from_tmp.val, MPFR_RNDN);
1638 to_target (to_type, to_tmp, to);
1639 }
1640
1641 /* Perform the binary operation indicated by OPCODE, using as operands the
1642 target byte streams X and Y, interpreted as floating-point numbers of
1643 types TYPE_X and TYPE_Y, respectively. Convert the result to type
1644 TYPE_RES and store it into the byte-stream RES. */
1645 void
1646 mpfr_float_ops::binop (enum exp_opcode op,
1647 const gdb_byte *x, const struct type *type_x,
1648 const gdb_byte *y, const struct type *type_y,
1649 gdb_byte *res, const struct type *type_res) const
1650 {
1651 gdb_mpfr x_tmp (type_x), y_tmp (type_y), tmp (type_res);
1652
1653 from_target (type_x, x, x_tmp);
1654 from_target (type_y, y, y_tmp);
1655
1656 switch (op)
1657 {
1658 case BINOP_ADD:
1659 mpfr_add (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1660 break;
1661
1662 case BINOP_SUB:
1663 mpfr_sub (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1664 break;
1665
1666 case BINOP_MUL:
1667 mpfr_mul (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1668 break;
1669
1670 case BINOP_DIV:
1671 mpfr_div (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1672 break;
1673
1674 case BINOP_EXP:
1675 mpfr_pow (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1676 break;
1677
1678 case BINOP_MIN:
1679 mpfr_min (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1680 break;
1681
1682 case BINOP_MAX:
1683 mpfr_max (tmp.val, x_tmp.val, y_tmp.val, MPFR_RNDN);
1684 break;
1685
1686 default:
1687 error (_("Integer-only operation on floating point number."));
1688 break;
1689 }
1690
1691 to_target (type_res, tmp, res);
1692 }
1693
1694 /* Compare the two target byte streams X and Y, interpreted as floating-point
1695 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
1696 are equal, -1 if X is less than Y, and 1 otherwise. */
1697 int
1698 mpfr_float_ops::compare (const gdb_byte *x, const struct type *type_x,
1699 const gdb_byte *y, const struct type *type_y) const
1700 {
1701 gdb_mpfr x_tmp (type_x), y_tmp (type_y);
1702
1703 from_target (type_x, x, x_tmp);
1704 from_target (type_y, y, y_tmp);
1705
1706 if (mpfr_equal_p (x_tmp.val, y_tmp.val))
1707 return 0;
1708 else if (mpfr_less_p (x_tmp.val, y_tmp.val))
1709 return -1;
1710 else
1711 return 1;
1712 }
1713
1714 #endif
1715
1716
1717 /* Helper routines operating on decimal floating-point data. */
1718
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. */
1723
1724 /* The order of the following headers is important for making sure
1725 decNumber structure is large enough to hold decimal128 digits. */
1726
1727 #include "dpd/decimal128.h"
1728 #include "dpd/decimal64.h"
1729 #include "dpd/decimal32.h"
1730
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
1734
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)
1740 {
1741 gdb_assert (TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
1742
1743 int len = TYPE_LENGTH (type);
1744 int i;
1745
1746 #if WORDS_BIGENDIAN
1747 #define OPPOSITE_BYTE_ORDER BFD_ENDIAN_LITTLE
1748 #else
1749 #define OPPOSITE_BYTE_ORDER BFD_ENDIAN_BIG
1750 #endif
1751
1752 if (gdbarch_byte_order (get_type_arch (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];
1758
1759 return;
1760 }
1761
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)
1766 {
1767 gdb_assert (TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
1768
1769 switch (TYPE_LENGTH (type))
1770 {
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;
1780 }
1781
1782 ctx->traps = 0;
1783 }
1784
1785 /* Check for errors signaled in the decimal context structure. */
1786 static void
1787 decimal_check_errors (decContext *ctx)
1788 {
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)
1795 {
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));
1800 }
1801 }
1802
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)
1808 {
1809 gdb_byte dec[16];
1810
1811 decContext set;
1812
1813 set_decnumber_context (&set, type);
1814
1815 switch (TYPE_LENGTH (type))
1816 {
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;
1829 }
1830
1831 match_endianness (dec, type, to);
1832 }
1833
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)
1839 {
1840 gdb_byte dec[16];
1841 match_endianness (addr, type, dec);
1842
1843 switch (TYPE_LENGTH (type))
1844 {
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;
1857 }
1858 }
1859
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)
1863 {
1864 decNumber number;
1865
1866 decimal_to_number (addr, type, &number);
1867
1868 return decNumberIsZero (&number);
1869 }
1870
1871
1872 /* Implementation of target_float_ops using the libdecnumber decNumber type
1873 as intermediate format. */
1874
1875 class decimal_float_ops : public target_float_ops
1876 {
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;
1882
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
1891 {
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");
1895 }
1896 void from_host_double (gdb_byte *addr, const struct type *type,
1897 double val) const override
1898 {
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");
1902 }
1903 void convert (const gdb_byte *from, const struct type *from_type,
1904 gdb_byte *to, const struct type *to_type) const override;
1905
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;
1912 };
1913
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
1920 {
1921 gdb_byte dec[16];
1922
1923 match_endianness (addr, type, dec);
1924
1925 if (format != nullptr)
1926 {
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
1934 }
1935
1936 std::string result;
1937 result.resize (MAX_DECIMAL_STRING);
1938
1939 switch (TYPE_LENGTH (type))
1940 {
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;
1953 }
1954
1955 return result;
1956 }
1957
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
1964 {
1965 decContext set;
1966 gdb_byte dec[16];
1967
1968 set_decnumber_context (&set, type);
1969
1970 switch (TYPE_LENGTH (type))
1971 {
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;
1984 }
1985
1986 match_endianness (dec, type, addr);
1987
1988 /* Check for errors in the DFP operation. */
1989 decimal_check_errors (&set);
1990
1991 return true;
1992 }
1993
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
1998 {
1999 decNumber number;
2000
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."));
2005
2006 decNumberFromInt32 (&number, (int32_t) from);
2007
2008 decimal_from_number (&number, addr, type);
2009 }
2010
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
2015 {
2016 decNumber number;
2017
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."));
2022
2023 decNumberFromUInt32 (&number, (uint32_t) from);
2024
2025 decimal_from_number (&number, addr, type);
2026 }
2027
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
2032 {
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);
2037 }
2038
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
2047 {
2048 decContext set;
2049 decNumber number1, number2, number3;
2050
2051 decimal_to_number (x, type_x, &number1);
2052 decimal_to_number (y, type_y, &number2);
2053
2054 set_decnumber_context (&set, type_res);
2055
2056 switch (op)
2057 {
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;
2076 }
2077
2078 /* Check for errors in the DFP operation. */
2079 decimal_check_errors (&set);
2080
2081 decimal_from_number (&number3, res, type_res);
2082 }
2083
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. */
2087 int
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
2090 {
2091 decNumber number1, number2, result;
2092 decContext set;
2093 const struct type *type_result;
2094
2095 decimal_to_number (x, type_x, &number1);
2096 decimal_to_number (y, type_y, &number2);
2097
2098 /* Perform the comparison in the larger of the two sizes. */
2099 type_result = TYPE_LENGTH (type_x) > TYPE_LENGTH (type_y) ? type_x : type_y;
2100 set_decnumber_context (&set, type_result);
2101
2102 decNumberCompare (&result, &number1, &number2, &set);
2103
2104 /* Check for errors in the DFP operation. */
2105 decimal_check_errors (&set);
2106
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;
2115 }
2116
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
2122 {
2123 decNumber number;
2124
2125 decimal_to_number (from, from_type, &number);
2126 decimal_from_number (&number, to, to_type);
2127 }
2128
2129
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). */
2134
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)
2140 {
2141 return TYPE_CODE (type1) == TYPE_CODE (type2);
2142 }
2143
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)
2148 {
2149 if (!target_float_same_category_p (type1, type2))
2150 return false;
2151
2152 switch (TYPE_CODE (type1))
2153 {
2154 case TYPE_CODE_FLT:
2155 return floatformat_from_type (type1) == floatformat_from_type (type2);
2156
2157 case TYPE_CODE_DECFLOAT:
2158 return (TYPE_LENGTH (type1) == TYPE_LENGTH (type2)
2159 && (gdbarch_byte_order (get_type_arch (type1))
2160 == gdbarch_byte_order (get_type_arch (type2))));
2161
2162 default:
2163 gdb_assert_not_reached ("unexpected type code");
2164 }
2165 }
2166
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)
2171 {
2172 switch (TYPE_CODE (type))
2173 {
2174 case TYPE_CODE_FLT:
2175 return floatformat_totalsize_bytes (floatformat_from_type (type));
2176
2177 case TYPE_CODE_DECFLOAT:
2178 return TYPE_LENGTH (type);
2179
2180 default:
2181 gdb_assert_not_reached ("unexpected type code");
2182 }
2183 }
2184
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
2188 {
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
2197 };
2198
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)
2203 {
2204 switch (TYPE_CODE (type))
2205 {
2206 case TYPE_CODE_FLT:
2207 {
2208 const struct floatformat *fmt = floatformat_from_type (type);
2209
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;
2217
2218 /* Any other binary floating-point format. */
2219 return target_float_ops_kind::binary;
2220 }
2221
2222 case TYPE_CODE_DECFLOAT:
2223 {
2224 /* Any decimal floating-point format. */
2225 return target_float_ops_kind::decimal;
2226 }
2227
2228 default:
2229 gdb_assert_not_reached ("unexpected type code");
2230 }
2231 }
2232
2233 /* Return target_float_ops to peform operations for KIND. */
2234 static const target_float_ops *
2235 get_target_float_ops (enum target_float_ops_kind kind)
2236 {
2237 switch (kind)
2238 {
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:
2242 {
2243 static host_float_ops<float> host_float_ops_float;
2244 return &host_float_ops_float;
2245 }
2246
2247 case target_float_ops_kind::host_double:
2248 {
2249 static host_float_ops<double> host_float_ops_double;
2250 return &host_float_ops_double;
2251 }
2252
2253 case target_float_ops_kind::host_long_double:
2254 {
2255 static host_float_ops<long double> host_float_ops_long_double;
2256 return &host_float_ops_long_double;
2257 }
2258
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 availabe,
2262 use the largest host floating-point type as intermediate format. */
2263 case target_float_ops_kind::binary:
2264 {
2265 #ifdef HAVE_LIBMPFR
2266 static mpfr_float_ops binary_float_ops;
2267 #else
2268 static host_float_ops<long double> binary_float_ops;
2269 #endif
2270 return &binary_float_ops;
2271 }
2272
2273 /* For decimal floating-point types, always use the libdecnumber
2274 decNumber type as intermediate format. */
2275 case target_float_ops_kind::decimal:
2276 {
2277 static decimal_float_ops decimal_float_ops;
2278 return &decimal_float_ops;
2279 }
2280
2281 default:
2282 gdb_assert_not_reached ("unexpected target_float_ops_kind");
2283 }
2284 }
2285
2286 /* Given a target type TYPE, determine the best host-side intermediate format
2287 to perform operations on TYPE in. */
2288 static const target_float_ops *
2289 get_target_float_ops (const struct type *type)
2290 {
2291 enum target_float_ops_kind kind = get_target_float_ops_kind (type);
2292 return get_target_float_ops (kind);
2293 }
2294
2295 /* The same for operations involving two target types TYPE1 and TYPE2. */
2296 static const target_float_ops *
2297 get_target_float_ops (const struct type *type1, const struct type *type2)
2298 {
2299 gdb_assert (TYPE_CODE (type1) == TYPE_CODE (type2));
2300
2301 enum target_float_ops_kind kind1 = get_target_float_ops_kind (type1);
2302 enum target_float_ops_kind kind2 = get_target_float_ops_kind (type2);
2303
2304 /* Given the way the kinds are sorted, we simply choose the larger one;
2305 this will be able to hold values of either type. */
2306 return get_target_float_ops (std::max (kind1, kind2));
2307 }
2308
2309 /* Return whether the byte-stream ADDR holds a valid value of
2310 floating-point type TYPE. */
2311 bool
2312 target_float_is_valid (const gdb_byte *addr, const struct type *type)
2313 {
2314 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2315 return floatformat_is_valid (floatformat_from_type (type), addr);
2316
2317 if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
2318 return true;
2319
2320 gdb_assert_not_reached ("unexpected type code");
2321 }
2322
2323 /* Return whether the byte-stream ADDR, interpreted as floating-point
2324 type TYPE, is numerically equal to zero (of either sign). */
2325 bool
2326 target_float_is_zero (const gdb_byte *addr, const struct type *type)
2327 {
2328 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2329 return (floatformat_classify (floatformat_from_type (type), addr)
2330 == float_zero);
2331
2332 if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
2333 return decimal_is_zero (addr, type);
2334
2335 gdb_assert_not_reached ("unexpected type code");
2336 }
2337
2338 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2339 to a string, optionally using the print format FORMAT. */
2340 std::string
2341 target_float_to_string (const gdb_byte *addr, const struct type *type,
2342 const char *format)
2343 {
2344 /* Unless we need to adhere to a specific format, provide special
2345 output for special cases of binary floating-point numbers. */
2346 if (format == nullptr && TYPE_CODE (type) == TYPE_CODE_FLT)
2347 {
2348 const struct floatformat *fmt = floatformat_from_type (type);
2349
2350 /* Detect invalid representations. */
2351 if (!floatformat_is_valid (fmt, addr))
2352 return "<invalid float value>";
2353
2354 /* Handle NaN and Inf. */
2355 enum float_kind kind = floatformat_classify (fmt, addr);
2356 if (kind == float_nan)
2357 {
2358 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2359 const char *mantissa = floatformat_mantissa (fmt, addr);
2360 return string_printf ("%snan(0x%s)", sign, mantissa);
2361 }
2362 else if (kind == float_infinite)
2363 {
2364 const char *sign = floatformat_is_negative (fmt, addr)? "-" : "";
2365 return string_printf ("%sinf", sign);
2366 }
2367 }
2368
2369 const target_float_ops *ops = get_target_float_ops (type);
2370 return ops->to_string (addr, type, format);
2371 }
2372
2373 /* Parse string STRING into a target floating-number of type TYPE and
2374 store it as byte-stream ADDR. Return whether parsing succeeded. */
2375 bool
2376 target_float_from_string (gdb_byte *addr, const struct type *type,
2377 const std::string &string)
2378 {
2379 const target_float_ops *ops = get_target_float_ops (type);
2380 return ops->from_string (addr, type, string);
2381 }
2382
2383 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2384 to an integer value (rounding towards zero). */
2385 LONGEST
2386 target_float_to_longest (const gdb_byte *addr, const struct type *type)
2387 {
2388 const target_float_ops *ops = get_target_float_ops (type);
2389 return ops->to_longest (addr, type);
2390 }
2391
2392 /* Convert signed integer VAL to a target floating-number of type TYPE
2393 and store it as byte-stream ADDR. */
2394 void
2395 target_float_from_longest (gdb_byte *addr, const struct type *type,
2396 LONGEST val)
2397 {
2398 const target_float_ops *ops = get_target_float_ops (type);
2399 ops->from_longest (addr, type, val);
2400 }
2401
2402 /* Convert unsigned integer VAL to a target floating-number of type TYPE
2403 and store it as byte-stream ADDR. */
2404 void
2405 target_float_from_ulongest (gdb_byte *addr, const struct type *type,
2406 ULONGEST val)
2407 {
2408 const target_float_ops *ops = get_target_float_ops (type);
2409 ops->from_ulongest (addr, type, val);
2410 }
2411
2412 /* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
2413 to a floating-point value in the host "double" format. */
2414 double
2415 target_float_to_host_double (const gdb_byte *addr,
2416 const struct type *type)
2417 {
2418 const target_float_ops *ops = get_target_float_ops (type);
2419 return ops->to_host_double (addr, type);
2420 }
2421
2422 /* Convert floating-point value VAL in the host "double" format to a target
2423 floating-number of type TYPE and store it as byte-stream ADDR. */
2424 void
2425 target_float_from_host_double (gdb_byte *addr, const struct type *type,
2426 double val)
2427 {
2428 const target_float_ops *ops = get_target_float_ops (type);
2429 ops->from_host_double (addr, type, val);
2430 }
2431
2432 /* Convert a floating-point number of type FROM_TYPE from the target
2433 byte-stream FROM to a floating-point number of type TO_TYPE, and
2434 store it to the target byte-stream TO. */
2435 void
2436 target_float_convert (const gdb_byte *from, const struct type *from_type,
2437 gdb_byte *to, const struct type *to_type)
2438 {
2439 /* We cannot directly convert between binary and decimal floating-point
2440 types, so go via an intermediary string. */
2441 if (!target_float_same_category_p (from_type, to_type))
2442 {
2443 std::string str = target_float_to_string (from, from_type);
2444 target_float_from_string (to, to_type, str);
2445 return;
2446 }
2447
2448 /* Convert between two different formats in the same category. */
2449 if (!target_float_same_format_p (from_type, to_type))
2450 {
2451 const target_float_ops *ops = get_target_float_ops (from_type, to_type);
2452 ops->convert (from, from_type, to, to_type);
2453 return;
2454 }
2455
2456 /* The floating-point formats match, so we simply copy the data, ensuring
2457 possible padding bytes in the target buffer are zeroed out. */
2458 memset (to, 0, TYPE_LENGTH (to_type));
2459 memcpy (to, from, target_float_format_length (to_type));
2460 }
2461
2462 /* Perform the binary operation indicated by OPCODE, using as operands the
2463 target byte streams X and Y, interpreted as floating-point numbers of
2464 types TYPE_X and TYPE_Y, respectively. Convert the result to type
2465 TYPE_RES and store it into the byte-stream RES.
2466
2467 The three types must either be all binary floating-point types, or else
2468 all decimal floating-point types. Binary and decimal floating-point
2469 types cannot be mixed within a single operation. */
2470 void
2471 target_float_binop (enum exp_opcode opcode,
2472 const gdb_byte *x, const struct type *type_x,
2473 const gdb_byte *y, const struct type *type_y,
2474 gdb_byte *res, const struct type *type_res)
2475 {
2476 gdb_assert (target_float_same_category_p (type_x, type_res));
2477 gdb_assert (target_float_same_category_p (type_y, type_res));
2478
2479 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2480 ops->binop (opcode, x, type_x, y, type_y, res, type_res);
2481 }
2482
2483 /* Compare the two target byte streams X and Y, interpreted as floating-point
2484 numbers of types TYPE_X and TYPE_Y, respectively. Return zero if X and Y
2485 are equal, -1 if X is less than Y, and 1 otherwise.
2486
2487 The two types must either both be binary floating-point types, or else
2488 both be decimal floating-point types. Binary and decimal floating-point
2489 types cannot compared directly against each other. */
2490 int
2491 target_float_compare (const gdb_byte *x, const struct type *type_x,
2492 const gdb_byte *y, const struct type *type_y)
2493 {
2494 gdb_assert (target_float_same_category_p (type_x, type_y));
2495
2496 const target_float_ops *ops = get_target_float_ops (type_x, type_y);
2497 return ops->compare (x, type_x, y, type_y);
2498 }
2499
This page took 0.080303 seconds and 4 git commands to generate.