X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fvalarith.c;h=9771ac83c0b7908e9a7da3c2dde622256a07b4b6;hb=71983bf85183974ba732682672cada50528b441d;hp=2e5e97a0aeef2ef5d06a838abc399ddfd93180e5;hpb=13d6656b12097181737610bfb405a3276555c51c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valarith.c b/gdb/valarith.c index 2e5e97a0ae..9771ac83c0 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1,14 +1,14 @@ /* Perform arithmetic and other operations on values, for GDB. - Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, + 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,9 +17,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "value.h" @@ -808,8 +806,8 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) /* If either arg was long double, make sure that value is also long double. */ - if (TYPE_LENGTH (type1) * 8 > TARGET_DOUBLE_BIT - || TYPE_LENGTH (type2) * 8 > TARGET_DOUBLE_BIT) + if (TYPE_LENGTH (type1) * 8 > gdbarch_double_bit (current_gdbarch) + || TYPE_LENGTH (type2) * 8 > gdbarch_double_bit (current_gdbarch)) val = allocate_value (builtin_type_long_double); else val = allocate_value (builtin_type_double); @@ -1028,7 +1026,7 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) /* Can't just call init_type because we wouldn't know what name to give the type. */ val = allocate_value - (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT + (result_len > gdbarch_long_bit (current_gdbarch) / HOST_CHAR_BIT ? builtin_type_unsigned_long_long : builtin_type_unsigned_long); store_unsigned_integer (value_contents_raw (val), @@ -1153,7 +1151,7 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) /* Can't just call init_type because we wouldn't know what name to give the type. */ val = allocate_value - (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT + (result_len > gdbarch_long_bit (current_gdbarch) / HOST_CHAR_BIT ? builtin_type_long_long : builtin_type_long); store_signed_integer (value_contents_raw (val), @@ -1378,6 +1376,23 @@ value_neg (struct value *arg1) type = check_typedef (value_type (arg1)); + if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT) + { + struct value *val = allocate_value (result_type); + int len = TYPE_LENGTH (type); + gdb_byte decbytes[16]; /* a decfloat is at most 128 bits long */ + + memcpy(decbytes, value_contents(arg1), len); + + if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_LITTLE) + decbytes[len-1] = decbytes[len - 1] | 0x80; + else + decbytes[0] = decbytes[0] | 0x80; + + memcpy (value_contents_raw (val), decbytes, len); + return val; + } + if (TYPE_CODE (type) == TYPE_CODE_FLT) return value_from_double (result_type, -value_as_double (arg1)); else if (is_integral_type (type))