mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-16 04:18:50 +00:00
* Makefile.in (dfp.o): Depend on expression.h, gdbtypes.h and value.h.
(valarith.o): Depend on dfp.h. (valops.o): Likewise. * dfp.c: Include expression.h, gdbtypes.h, value.h and dfp.h. (set_decnumber_context): New function. (decimal_check_errors): Likewise. (decimal_from_number): Likewise. (decimal_to_number): Likewise. (decimal_from_string): Use set_decnumber_context and decimal_check_errors. (decimal_from_integral): New function. (decimal_from_floating): Likewise. (decimal_to_double): Likewise. (promote_decimal): Likewise. (decimal_binop): Likewise. (decimal_is_zero): Likewise. (decimal_compare): Likewise. (decimal_convert): Likewise. * dfp.h (decimal_from_integral): New prototype. (decimal_from_floating): Likewise. (decimal_to_double): Likewise. (decimal_binop): Likewise. (decimal_is_zero): Likewise. (decimal_compare): Likewise. (decimal_convert): Likewise. * eval.c (evaluate_subexp_standard): Remove expect_type argument from call to value_from_decfloat. * valarith.c: Include dfp.h. (value_args_as_decimal): New function. (value_binop): Add if block to handle TYPE_CODE_DECFLOAT values. (value_logical_not): Likewise. (value_equal): Likewise. (value_less): Likewise. (value_pos): Likewise. (value_neg): Formatting fix. * valops.c: Include dfp.h. (value_cast): Add if block to handle TYPE_CODE_DECFLOAT values. * value.c (unpack_long): Add case to handle TYPE_CODE_DECFLOAT. (unpack_double): Add if block to handle TYPE_CODE_DECFLOAT. (value_from_decfloat): Remove expect_type argument. * value.h (value_from_decfloat): Update prototype.
This commit is contained in:
20
gdb/valops.c
20
gdb/valops.c
@@ -36,6 +36,7 @@
|
||||
#include "infcall.h"
|
||||
#include "dictionary.h"
|
||||
#include "cp-support.h"
|
||||
#include "dfp.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include "gdb_string.h"
|
||||
@@ -338,7 +339,8 @@ value_cast (struct type *type, struct value *arg2)
|
||||
code2 = TYPE_CODE_INT;
|
||||
|
||||
scalar = (code2 == TYPE_CODE_INT || code2 == TYPE_CODE_FLT
|
||||
|| code2 == TYPE_CODE_ENUM || code2 == TYPE_CODE_RANGE);
|
||||
|| code2 == TYPE_CODE_DECFLOAT || code2 == TYPE_CODE_ENUM
|
||||
|| code2 == TYPE_CODE_RANGE);
|
||||
|
||||
if (code1 == TYPE_CODE_STRUCT
|
||||
&& code2 == TYPE_CODE_STRUCT
|
||||
@@ -357,6 +359,22 @@ value_cast (struct type *type, struct value *arg2)
|
||||
}
|
||||
if (code1 == TYPE_CODE_FLT && scalar)
|
||||
return value_from_double (type, value_as_double (arg2));
|
||||
else if (code1 == TYPE_CODE_DECFLOAT && scalar)
|
||||
{
|
||||
int dec_len = TYPE_LENGTH (type);
|
||||
gdb_byte dec[16];
|
||||
|
||||
if (code2 == TYPE_CODE_FLT)
|
||||
decimal_from_floating (arg2, dec, dec_len);
|
||||
else if (code2 == TYPE_CODE_DECFLOAT)
|
||||
decimal_convert (value_contents (arg2), TYPE_LENGTH (type2),
|
||||
dec, dec_len);
|
||||
else
|
||||
/* The only option left is an integral type. */
|
||||
decimal_from_integral (arg2, dec, dec_len);
|
||||
|
||||
return value_from_decfloat (type, dec);
|
||||
}
|
||||
else if ((code1 == TYPE_CODE_INT || code1 == TYPE_CODE_ENUM
|
||||
|| code1 == TYPE_CODE_RANGE)
|
||||
&& (scalar || code2 == TYPE_CODE_PTR
|
||||
|
||||
Reference in New Issue
Block a user