diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2009-06-03 17:47:54 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2009-06-03 17:47:54 +0000 |
commit | 289bd67a5d1337355072d94f2552389066c2a9db (patch) | |
tree | 31cd135bdad3152b185ee0ce381a2d8653c849c1 /gdb/dfp.c | |
parent | a951221dcc4e433c832e328a7de4c4bc218a6ccd (diff) | |
download | gdb-289bd67a5d1337355072d94f2552389066c2a9db.zip gdb-289bd67a5d1337355072d94f2552389066c2a9db.tar.gz gdb-289bd67a5d1337355072d94f2552389066c2a9db.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/dfp.c')
-rw-r--r-- | gdb/dfp.c | 55 |
1 files changed, 12 insertions, 43 deletions
@@ -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); |