return strtod (buffer, NULL);
}
-/* Check if operands have the same size and convert them to the
- biggest of the two if necessary. */
-static int
-promote_decimal (gdb_byte *x, int len_x, gdb_byte *y, int len_y)
-{
- int len_result;
- decNumber number;
-
- if (len_x < len_y)
- {
- decimal_to_number (x, len_x, &number);
- decimal_from_number (&number, x, len_y);
- len_result = len_y;
- }
- else if (len_x > len_y)
- {
- decimal_to_number (y, len_y, &number);
- decimal_from_number (&number, y, len_x);
- len_result = len_x;
- }
- else
- len_result = len_x;
-
- return len_result;
-}
-
-/* Perform operation OP with operands X and Y and store value in RESULT.
- If LEN_X and LEN_Y are not equal, RESULT will have the size of the biggest
- of the two, and LEN_RESULT will be set accordingly. */
+/* Perform operation OP with operands X and Y with sizes LEN_X and LEN_Y
+ and store value in RESULT with size LEN_RESULT. */
void
decimal_binop (enum exp_opcode op, const gdb_byte *x, int len_x,
- const gdb_byte *y, int len_y, gdb_byte *result, int *len_result)
+ const gdb_byte *y, int len_y, gdb_byte *result, int len_result)
{
decContext set;
decNumber number1, number2, number3;
match_endianness (x, len_x, dec1);
match_endianness (y, len_y, dec2);
- *len_result = promote_decimal (dec1, len_x, dec2, len_y);
+ decimal_to_number (dec1, len_x, &number1);
+ decimal_to_number (dec2, len_y, &number2);
- /* Both operands are of size *len_result from now on. */
-
- decimal_to_number (dec1, *len_result, &number1);
- decimal_to_number (dec2, *len_result, &number2);
-
- set_decnumber_context (&set, *len_result);
+ set_decnumber_context (&set, len_result);
switch (op)
{
/* Check for errors in the DFP operation. */
decimal_check_errors (&set);
- decimal_from_number (&number3, dec3, *len_result);
+ decimal_from_number (&number3, dec3, len_result);
- match_endianness (dec3, *len_result, result);
+ match_endianness (dec3, len_result, result);
}
/* Returns true if X (which is LEN bytes wide) is the number zero. */
match_endianness (x, len_x, dec1);
match_endianness (y, len_y, dec2);
- len_result = promote_decimal (dec1, len_x, dec2, len_y);
-
- decimal_to_number (dec1, len_result, &number1);
- decimal_to_number (dec2, len_result, &number2);
+ decimal_to_number (dec1, len_x, &number1);
+ decimal_to_number (dec2, len_y, &number2);
+ /* Perform the comparison in the larger of the two sizes. */
+ len_result = len_x > len_y ? len_x : len_y;
set_decnumber_context (&set, len_result);
decNumberCompare (&result, &number1, &number2, &set);
extern void decimal_from_floating (struct value *from, gdb_byte *to, int len);
extern DOUBLEST decimal_to_doublest (const gdb_byte *from, int len);
extern void decimal_binop (enum exp_opcode, const gdb_byte *, int,
- const gdb_byte *, int, gdb_byte *, int *);
+ const gdb_byte *, int, gdb_byte *, int);
extern int decimal_is_zero (const gdb_byte *x, int len);
extern int decimal_compare (const gdb_byte *x, int len_x, const gdb_byte *y, int len_y);
extern void decimal_convert (const gdb_byte *from, int len_from, gdb_byte *to,
gdb_byte v1[16], v2[16];
gdb_byte v[16];
+ /* If only one type is decimal float, use its type.
+ Otherwise use the bigger type. */
+ if (TYPE_CODE (type1) != TYPE_CODE_DECFLOAT)
+ result_type = type2;
+ else if (TYPE_CODE (type2) != TYPE_CODE_DECFLOAT)
+ result_type = type1;
+ else if (TYPE_LENGTH (type2) > TYPE_LENGTH (type1))
+ result_type = type2;
+ else
+ result_type = type1;
+
+ len_v = TYPE_LENGTH (result_type);
+
value_args_as_decimal (arg1, arg2, v1, &len_v1, v2, &len_v2);
switch (op)
case BINOP_MUL:
case BINOP_DIV:
case BINOP_EXP:
- decimal_binop (op, v1, len_v1, v2, len_v2, v, &len_v);
+ decimal_binop (op, v1, len_v1, v2, len_v2, v, len_v);
break;
default:
error (_("Operation not valid for decimal floating point number."));
}
- /* If only one type is decimal float, use its type.
- Otherwise use the bigger type. */
- if (TYPE_CODE (type1) != TYPE_CODE_DECFLOAT)
- result_type = type2;
- else if (TYPE_CODE (type2) != TYPE_CODE_DECFLOAT)
- result_type = type1;
- else if (TYPE_LENGTH (type2) > TYPE_LENGTH (type1))
- result_type = type2;
- else
- result_type = type1;
-
val = value_from_decfloat (result_type, v);
}
else if (TYPE_CODE (type1) == TYPE_CODE_FLT