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