From patchwork Thu Nov 16 17:51:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Weigand X-Patchwork-Id: 24294 Received: (qmail 71539 invoked by alias); 16 Nov 2017 17:51:38 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 71176 invoked by uid 89); 16 Nov 2017 17:51:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KB_WAM_FROM_NAME_SINGLEWORD, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=H*Ad:U*uweigand, H*x:version, H*UA:version, H*Ad:D*de.ibm.com X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0b-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.158.5) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 16 Nov 2017 17:51:36 +0000 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vAGHnKOJ065850 for ; Thu, 16 Nov 2017 12:51:34 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2e9erm2m0q-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Thu, 16 Nov 2017 12:51:33 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 16 Nov 2017 17:51:32 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 16 Nov 2017 17:51:29 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vAGHpSLB40108256 for ; Thu, 16 Nov 2017 17:51:28 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3714711C054 for ; Thu, 16 Nov 2017 17:46:15 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1E3AB11C050 for ; Thu, 16 Nov 2017 17:46:15 +0000 (GMT) Received: from oc3748833570.ibm.com (unknown [9.152.213.29]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP for ; Thu, 16 Nov 2017 17:46:15 +0000 (GMT) Received: by oc3748833570.ibm.com (Postfix, from userid 1000) id 56D37D80106; Thu, 16 Nov 2017 18:51:28 +0100 (CET) Subject: [pushed] Refactor endian handling in DFP routines To: gdb-patches@sourceware.org Date: Thu, 16 Nov 2017 18:51:28 +0100 (CET) From: "Ulrich Weigand" MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17111617-0008-0000-0000-000004AC32D0 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17111617-0009-0000-0000-00001E3EEC15 Message-Id: <20171116175128.56D37D80106@oc3748833570.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-11-16_06:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1711160238 Hello, this patch moves endian conversion into the decimal_from_number and decimal_to_number routines, and removes it from all their callers, making the code simpler overall. No functional change. Bye, Ulrich gdb/ChangeLog: 2017-11-16 Ulrich Weigand * target-float.c (decimal_from_number): Add byte_order argument and call match_endianness. Error if unknown floating-point type. (decimal_to_number): Add byte_order argument and call match_endianness. (decimal_from_longest): Update call. Do not call match_endianness. (decimal_from_ulongest): Likewise. (decimal_binop): Likewise. (decimal_is_zero): Likewise. (decimal_compare): Likewise. (decimal_convert): Likewise. Index: binutils-gdb/gdb/target-float.c =================================================================== --- binutils-gdb.orig/gdb/target-float.c +++ binutils-gdb/gdb/target-float.c @@ -1136,8 +1136,11 @@ decimal_check_errors (decContext *ctx) /* Helper function to convert from libdecnumber's appropriate representation for computation to each size of decimal float. */ static void -decimal_from_number (const decNumber *from, gdb_byte *to, int len) +decimal_from_number (const decNumber *from, + gdb_byte *to, int len, enum bfd_endian byte_order) { + gdb_byte dec[16]; + decContext set; set_decnumber_context (&set, len); @@ -1145,32 +1148,41 @@ decimal_from_number (const decNumber *fr switch (len) { case 4: - decimal32FromNumber ((decimal32 *) to, from, &set); + decimal32FromNumber ((decimal32 *) dec, from, &set); break; case 8: - decimal64FromNumber ((decimal64 *) to, from, &set); + decimal64FromNumber ((decimal64 *) dec, from, &set); break; case 16: - decimal128FromNumber ((decimal128 *) to, from, &set); + decimal128FromNumber ((decimal128 *) dec, from, &set); + break; + default: + error (_("Unknown decimal floating point type.")); break; } + + match_endianness (dec, len, byte_order, to); } /* Helper function to convert each size of decimal float to libdecnumber's appropriate representation for computation. */ static void -decimal_to_number (const gdb_byte *from, int len, decNumber *to) +decimal_to_number (const gdb_byte *from, int len, enum bfd_endian byte_order, + decNumber *to) { + gdb_byte dec[16]; + match_endianness (from, len, byte_order, dec); + switch (len) { case 4: - decimal32ToNumber ((decimal32 *) from, to); + decimal32ToNumber ((decimal32 *) dec, to); break; case 8: - decimal64ToNumber ((decimal64 *) from, to); + decimal64ToNumber ((decimal64 *) dec, to); break; case 16: - decimal128ToNumber ((decimal128 *) from, to); + decimal128ToNumber ((decimal128 *) dec, to); break; default: error (_("Unknown decimal floating point type.")); @@ -1263,8 +1275,8 @@ static void decimal_from_longest (LONGEST from, gdb_byte *to, int len, enum bfd_endian byte_order) { - gdb_byte dec[16]; decNumber number; + if ((int32_t) from != from) /* libdecnumber can convert only 32-bit integers. */ error (_("Conversion of large integer to a " @@ -1272,8 +1284,7 @@ decimal_from_longest (LONGEST from, decNumberFromInt32 (&number, (int32_t) from); - decimal_from_number (&number, dec, len); - match_endianness (dec, len, byte_order, to); + decimal_from_number (&number, to, len, byte_order); } /* Converts a ULONGEST to a decimal float of specified LEN bytes. */ @@ -1281,7 +1292,6 @@ static void decimal_from_ulongest (ULONGEST from, gdb_byte *to, int len, enum bfd_endian byte_order) { - gdb_byte dec[16]; decNumber number; if ((uint32_t) from != from) @@ -1291,8 +1301,7 @@ decimal_from_ulongest (ULONGEST from, decNumberFromUInt32 (&number, (uint32_t) from); - decimal_from_number (&number, dec, len); - match_endianness (dec, len, byte_order, to); + decimal_from_number (&number, to, len, byte_order); } /* Converts a decimal float of LEN bytes to a LONGEST. */ @@ -1317,13 +1326,9 @@ decimal_binop (enum exp_opcode op, { decContext set; decNumber number1, number2, number3; - gdb_byte dec1[16], dec2[16], dec3[16]; - match_endianness (x, len_x, byte_order_x, dec1); - match_endianness (y, len_y, byte_order_y, dec2); - - decimal_to_number (dec1, len_x, &number1); - decimal_to_number (dec2, len_y, &number2); + decimal_to_number (x, len_x, byte_order_x, &number1); + decimal_to_number (y, len_y, byte_order_y, &number2); set_decnumber_context (&set, len_result); @@ -1352,9 +1357,7 @@ decimal_binop (enum exp_opcode op, /* Check for errors in the DFP operation. */ decimal_check_errors (&set); - decimal_from_number (&number3, dec3, len_result); - - match_endianness (dec3, len_result, byte_order_result, result); + decimal_from_number (&number3, result, len_result, byte_order_result); } /* Returns true if X (which is LEN bytes wide) is the number zero. */ @@ -1362,10 +1365,8 @@ static int decimal_is_zero (const gdb_byte *x, int len, enum bfd_endian byte_order) { decNumber number; - gdb_byte dec[16]; - match_endianness (x, len, byte_order, dec); - decimal_to_number (dec, len, &number); + decimal_to_number (x, len, byte_order, &number); return decNumberIsZero (&number); } @@ -1379,14 +1380,10 @@ decimal_compare (const gdb_byte *x, int { decNumber number1, number2, result; decContext set; - gdb_byte dec1[16], dec2[16]; int len_result; - match_endianness (x, len_x, byte_order_x, dec1); - match_endianness (y, len_y, byte_order_y, dec2); - - decimal_to_number (dec1, len_x, &number1); - decimal_to_number (dec2, len_y, &number2); + decimal_to_number (x, len_x, byte_order_x, &number1); + decimal_to_number (y, len_y, byte_order_y, &number2); /* Perform the comparison in the larger of the two sizes. */ len_result = len_x > len_y ? len_x : len_y; @@ -1415,14 +1412,9 @@ decimal_convert (const gdb_byte *from, i enum bfd_endian byte_order_to) { decNumber number; - gdb_byte dec[16]; - - match_endianness (from, len_from, byte_order_from, dec); - - decimal_to_number (dec, len_from, &number); - decimal_from_number (&number, dec, len_to); - match_endianness (dec, len_to, byte_order_to, to); + decimal_to_number (from, len_from, byte_order_from, &number); + decimal_from_number (&number, to, len_to, byte_order_to); }