From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp33.i.mail.ru (smtp33.i.mail.ru [95.163.41.74]) by sourceware.org (Postfix) with ESMTPS id 8B8623861806 for ; Tue, 2 Apr 2024 20:18:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8B8623861806 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=mail.ru Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mail.ru ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8B8623861806 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=95.163.41.74 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712089085; cv=none; b=APs1BB0uEh9JEuGmpyq8HesZnB16g021MCKv17Mv39wjtnUlWsxjcnffFzNDTjOiV0VWplrPiY0ap6A0AXAUVmWnjFQEuyyVKwT3/Dyd+9d+ZhGk0XQjX9nONv1pTntXNB7rbv57DPMzn8w9elmklQAZoiiNwzQAlnSZehW640M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712089085; c=relaxed/simple; bh=NBinqQrVzZJbibF7rddD1095BFO7gvanYsuhQjMx9as=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=gK4t9RLCYRY1nfwGMXXz2IjIpwMWTveHJvjTPMvB5AOZzg2SemXgKjolQpeDx7RERbniAZ1Xi5Qcz5QJ7OPnlSvclTuPRBv+XkDsu1LTZhAHz4S+ckL0Qe0dA9tsQnff/fc822FIsIIG4sDdvOeT/0q01MMQhx4h2oQpDhb9afg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail4; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:From:Sender:Reply-To:To:Cc:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive: X-Cloud-Ids:Disposition-Notification-To; bh=V6e9tsHIHPuTSBBWBP90Tr6bf4Paw+93Pm0z+1YFceA=; t=1712089082; x=1712179082; b=aEHwkUxA+hlZ/z/B7YfbAEziKO7LkiOvTjlCU+Sqcu27T4uU7tBfi1n2w2XAdJFs256v61mGqp2 MKkceU/UosYV7pl+U6YqXwJifRoN2AxQ10nsFqig+XpcUR3SFTpBePoz3bWnIz8mr8nN8XJcIMpiW S1S6KEwU5wEpsc4iZciLMJSvwxeBft/AtKk5konGdSAf/+OurX7UbzKVe29vOLVVmahsukudYh9JI ArqQ0f1fJ9nk3SlfiyfzpGbt3jDv2HxxtIdg1qYy9Ranzo5AH1MOUadSIa/R9HfR0mTI8DzMXITSY ohEbDH06VWPH0LuR0VihBpgwj1D+304Wv3Cw==; Received: by smtp33.i.mail.ru with esmtpa (envelope-from ) id 1rrka0-00000001qSd-3m1w; Tue, 02 Apr 2024 23:18:01 +0300 From: Sergey Kaplun To: gdb-patches@sourceware.org Cc: Sergey Kaplun Subject: [PATCH v1 2/2] Fix the right shift of negative numbers Date: Tue, 2 Apr 2024 23:17:58 +0300 Message-ID: <1ec0c7b71c5dcc85d194aad7acf0e4e3b4c21527.1712086444.git.sergey_v_kaplun@mail.ru> X-Mailer: git-send-email 2.43.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Authentication-Results: smtp33.i.mail.ru; auth=pass smtp.auth=sergey_v_kaplun@mail.ru smtp.mailfrom=sergey_v_kaplun@mail.ru X-Mailru-Src: smtp X-7564579A: EEAE043A70213CC8 X-77F55803: 4F1203BC0FB41BD9A6CD9ED7FA2D9CC9A100C9D52C6E91DFD956B63951F4B03D1313CFAB8367EF908E2BE116634AD74D99E007FB9DE256BC2FF179000BF0C848E136126466B4E111EB78924A8C5CD7FE4A43D3E7D3A7B3F6 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7011EB7026DD4A9BAEA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006379C6BD13E0D9523298638F802B75D45FF36EB9D2243A4F8B5A6FCA7DBDB1FC311F39EFFDF887939037866D6147AF826D8E6F16A774BF26BB29DA389CB1A35E69871AFE39F5DEB2E5E20879F7C8C5043D14489FFFB0AA5F4BF176DF2183F8FC7C06030C3405640F6718941B15DA834481FA18204E546F3947CFE4D9CDE3FF759CFF6B57BC7E64490618DEB871D839B7333395957E7521B51C2DFABB839C843B9C08941B15DA834481F8AA50765F7900637FBF931FEADDDACF0389733CBF5DBD5E9B5C8C57E37DE458BD9DD9810294C998ED8FC6C240DEA76428AA50765F7900637EB52220108A1A954D81D268191BDAD3DBD4B6F7A4D31EC0BE2F48590F00D11D6D81D268191BDAD3D78DA827A17800CE7DD5D117F5FD577DDEC76A7562686271ED91E3A1F190DE8FD2E808ACE2090B5E14AD6D5ED66289B5278DA827A17800CE76631511D42670FFE2EB15956EA79C166A417C69337E82CC275ECD9A6C639B01B78DA827A17800CE783573928F8DF1ADB731C566533BA786AA5CC5B56E945C8DA X-C1DE0DAB: 0D63561A33F958A57C0ECFC0A6E409085002B1117B3ED69626B60D8DF2B5C5EC30E4A65F242F5898823CB91A9FED034534781492E4B8EEAD21D4E6D365FE45D1C79554A2A72441328621D336A7BC284946AD531847A6065A535571D14F44ED41 X-C8649E89: 1C3962B70DF3F0ADE00A9FD3E00BEEDF77DD89D51EBB7742D3581295AF09D3DF87807E0823442EA2ED31085941D9CD0AF7F820E7B07EA4CF3E2A6F2D5A9AC2AB0CB534C6DD7C2EDCADAC09DB4AFBE3DA2F9F3289FD4C95E23D4CAFFB26F46A3D58CF1FE2B37DBE106DF5582518BA9CDE24C7178CAE2AE7EBACEC812952D1FF33111DC66A97D0BFE2913E6812662D5F2AB9AF64DB468876803B9091C2F776607721F8114A732E981437E69C174A41D00C X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojmSy8L1hSZUOYEwV+seI1zw== X-Mailru-Sender: 583F1D7ACE8F49BD4747F3DF20327BFB67A454E5EA3F803784F268382E0D6913FC0920703C89B6C421C6BD6F04BD51C9160348CE3D9367842C22B24405C8F0CC0C99F7F8EF33C0CE4F0A872F021F90597E6EE165445FBF8EC77752E0C033A69E3453F38A29522196 X-Mras: Ok X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,PDS_BTC_ID,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Since commit 303a881f8789 ("Use gdb_gmp for scalar arithmetic"), the incorrect values are returned for the right shift of negative numbers, which are truncated during the division. ``` (gdb) p /t -3 $1 = 11111111111111111111111111111101 (gdb) p /t -3 >> 1 $2 = 11111111111111111111111111111111 ``` According to the documentation of gmplib [1]: ``` For positive n both mpz_fdiv_q_2exp and mpz_tdiv_q_2exp are simple bitwise right shifts. For negative n, mpz_fdiv_q_2exp is effectively an arithmetic right shift treating n as twos complement the same as the bitwise logical functions do, whereas mpz_tdiv_q_2exp effectively treats n as sign and magnitude. ``` So, use the mpz_fdiv_q_2exp variant to avoid truncation for negative values since the behaviour for positive values is equivalent. [1]: https://gmplib.org/gmp-man-6.2.1.pdf#Integer%20Division --- gdb/gmp-utils.h | 4 ++-- gdb/testsuite/gdb.base/bitshift.exp | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gdb/gmp-utils.h b/gdb/gmp-utils.h index 51e06abc050..878ce1da43a 100644 --- a/gdb/gmp-utils.h +++ b/gdb/gmp-utils.h @@ -280,13 +280,13 @@ struct gdb_mpz gdb_mpz operator>> (unsigned long nbits) const { gdb_mpz result; - mpz_tdiv_q_2exp (result.m_val, m_val, nbits); + mpz_fdiv_q_2exp (result.m_val, m_val, nbits); return result; } gdb_mpz &operator>>= (unsigned long nbits) { - mpz_tdiv_q_2exp (m_val, m_val, nbits); + mpz_fdiv_q_2exp (m_val, m_val, nbits); return *this; } diff --git a/gdb/testsuite/gdb.base/bitshift.exp b/gdb/testsuite/gdb.base/bitshift.exp index 806886cc1bf..0bc99cc438f 100644 --- a/gdb/testsuite/gdb.base/bitshift.exp +++ b/gdb/testsuite/gdb.base/bitshift.exp @@ -346,6 +346,9 @@ proc test_shifts {} { test_shift $lang "print -1 >> 1" " = -1" test_shift $lang "print -8 >> 1" " = -4" test_shift $lang "print [make_int64 $lang -8] >> 1" " = -4" + # Make sure an negative value isn't truncated by shift + # operator. + test_shift $lang "print -3 >> 1" " = -2" } # Make sure an unsigned 64-bit value with high bit set isn't -- 2.43.2