* dfp.h (decimal_binop): Convert LEN_RESULT to input parameter.

* dfp.c (promote_decimal): Remove.
	(decimal_binop): Convert LEN_RESULT to input parameter.
	Remove call to decimal_binop.
	(decimal_compare): Remove call to decimal_binop.

	* valarith.c (value_binop): Pass desired result type length
	to decimal_binop.
This commit is contained in:
Ulrich Weigand 2009-06-03 17:47:54 +00:00
parent a951221dcc
commit 289bd67a5d
4 changed files with 42 additions and 60 deletions

View file

@ -1,3 +1,14 @@
2009-06-03 Ulrich Weigand <uweigand@de.ibm.com>
* dfp.h (decimal_binop): Convert LEN_RESULT to input parameter.
* dfp.c (promote_decimal): Remove.
(decimal_binop): Convert LEN_RESULT to input parameter.
Remove call to decimal_binop.
(decimal_compare): Remove call to decimal_binop.
* valarith.c (value_binop): Pass desired result type length
to decimal_binop.
2009-06-01 Tristan Gingold <gingold@adacore.com>
* configure.tgt (avr): Set gdb_sim to use the simulator.

View file

@ -255,38 +255,11 @@ decimal_to_doublest (const gdb_byte *from, int len)
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;
@ -295,14 +268,10 @@ decimal_binop (enum exp_opcode op, const gdb_byte *x, int len_x,
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)
{
@ -330,9 +299,9 @@ decimal_binop (enum exp_opcode op, const gdb_byte *x, int len_x,
/* 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. */
@ -362,11 +331,11 @@ decimal_compare (const gdb_byte *x, int len_x, const gdb_byte *y, int len_y)
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);

View file

@ -35,7 +35,7 @@ extern void decimal_from_integral (struct value *from, gdb_byte *to, int len);
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,

View file

@ -887,22 +887,6 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
gdb_byte v1[16], v2[16];
gdb_byte v[16];
value_args_as_decimal (arg1, arg2, v1, &len_v1, v2, &len_v2);
switch (op)
{
case BINOP_ADD:
case BINOP_SUB:
case BINOP_MUL:
case BINOP_DIV:
case BINOP_EXP:
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)
@ -914,6 +898,24 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
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_ADD:
case BINOP_SUB:
case BINOP_MUL:
case BINOP_DIV:
case BINOP_EXP:
decimal_binop (op, v1, len_v1, v2, len_v2, v, len_v);
break;
default:
error (_("Operation not valid for decimal floating point number."));
}
val = value_from_decfloat (result_type, v);
}
else if (TYPE_CODE (type1) == TYPE_CODE_FLT