+
+/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE,
+ to an integer value (rounding towards zero). */
+LONGEST
+target_float_to_longest (const gdb_byte *addr, const struct type *type)
+{
+ if (TYPE_CODE (type) == TYPE_CODE_FLT)
+ return floatformat_to_longest (floatformat_from_type (type), addr);
+
+ if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
+ return decimal_to_longest (addr, TYPE_LENGTH (type),
+ gdbarch_byte_order (get_type_arch (type)));
+
+ gdb_assert_not_reached ("unexpected type code");
+}
+
+/* Convert signed integer VAL to a target floating-number of type TYPE
+ and store it as byte-stream ADDR. */
+void
+target_float_from_longest (gdb_byte *addr, const struct type *type,
+ LONGEST val)
+{
+ /* Ensure possible padding bytes in the target buffer are zeroed out. */
+ memset (addr, 0, TYPE_LENGTH (type));
+
+ if (TYPE_CODE (type) == TYPE_CODE_FLT)
+ {
+ floatformat_from_longest (floatformat_from_type (type), addr, val);
+ return;
+ }
+
+ if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
+ {
+ decimal_from_longest (val, addr, TYPE_LENGTH (type),
+ gdbarch_byte_order (get_type_arch (type)));
+ return;
+ }
+
+ gdb_assert_not_reached ("unexpected type code");
+}
+
+/* Convert unsigned integer VAL to a target floating-number of type TYPE
+ and store it as byte-stream ADDR. */
+void
+target_float_from_ulongest (gdb_byte *addr, const struct type *type,
+ ULONGEST val)
+{
+ /* Ensure possible padding bytes in the target buffer are zeroed out. */
+ memset (addr, 0, TYPE_LENGTH (type));
+
+ if (TYPE_CODE (type) == TYPE_CODE_FLT)
+ {
+ floatformat_from_ulongest (floatformat_from_type (type), addr, val);
+ return;
+ }
+
+ if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
+ {
+ decimal_from_ulongest (val, addr, TYPE_LENGTH (type),
+ gdbarch_byte_order (get_type_arch (type)));
+ return;
+ }
+
+ gdb_assert_not_reached ("unexpected type code");
+}
+
+/* Convert a floating-point number of type FROM_TYPE from the target
+ byte-stream FROM to a floating-point number of type TO_TYPE, and
+ store it to the target byte-stream TO. */
+void
+target_float_convert (const gdb_byte *from, const struct type *from_type,
+ gdb_byte *to, const struct type *to_type)
+{
+ /* Ensure possible padding bytes in the target buffer are zeroed out. */
+ memset (to, 0, TYPE_LENGTH (to_type));
+
+ /* Use direct conversion routines if we have them. */
+
+ if (TYPE_CODE (from_type) == TYPE_CODE_FLT
+ && TYPE_CODE (to_type) == TYPE_CODE_FLT)
+ {
+ floatformat_convert (from, floatformat_from_type (from_type),
+ to, floatformat_from_type (to_type));
+ return;
+ }
+
+ if (TYPE_CODE (from_type) == TYPE_CODE_DECFLOAT
+ && TYPE_CODE (to_type) == TYPE_CODE_DECFLOAT)
+ {
+ decimal_convert (from, TYPE_LENGTH (from_type),
+ gdbarch_byte_order (get_type_arch (from_type)),
+ to, TYPE_LENGTH (to_type),
+ gdbarch_byte_order (get_type_arch (to_type)));
+ return;
+ }
+
+ /* We cannot directly convert between binary and decimal floating-point
+ types, so go via an intermediary string. */
+
+ if ((TYPE_CODE (from_type) == TYPE_CODE_FLT
+ && TYPE_CODE (to_type) == TYPE_CODE_DECFLOAT)
+ || (TYPE_CODE (from_type) == TYPE_CODE_DECFLOAT
+ && TYPE_CODE (to_type) == TYPE_CODE_FLT))
+ {
+ std::string str = target_float_to_string (from, from_type);
+ target_float_from_string (to, to_type, str);
+ return;
+ }
+
+ gdb_assert_not_reached ("unexpected type code");
+}