From 3f2728affef81d578a496dd3d933f2203e6a3d59 Mon Sep 17 00:00:00 2001 From: pbrook Date: Sat, 30 Oct 2004 14:42:22 +0000 Subject: [PATCH] 2004-10-30 Tobias Schlueter * simplify.c (twos_complement): Calculate mask in GMP arithmetic. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89888 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 4 ++++ gcc/fortran/simplify.c | 16 +++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b66bc3ed8d1..8c81b0bbe14 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,9 @@ 2004-10-30 Tobias Schlueter + * simplify.c (twos_complement): Calculate mask in GMP arithmetic. + +2004-10-30 Tobias Schlueter + * trans.c (gfc_trans_code): Set global locus after recursing. Fix comment typo. diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 253f68677a1..5004b83acc9 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -146,19 +146,17 @@ static void twos_complement (mpz_t x, int bitsize) { mpz_t mask; - char mask_s[bitsize + 1]; if (mpz_tstbit (x, bitsize - 1) == 1) { - /* The mpz_init_set_{u|s}i functions take a long argument, but - the widest integer the target supports might be wider, so we - have to go via an intermediate string. */ - memset (mask_s, '1', bitsize); - mask_s[bitsize] = '\0'; - mpz_init_set_str (mask, mask_s, 2); + mpz_init_set_ui(mask, 1); + mpz_mul_2exp(mask, mask, bitsize); + mpz_sub_ui(mask, mask, 1); - /* We negate the number by hand, zeroing the high bits, and then - have it negated by GMP. */ + /* We negate the number by hand, zeroing the high bits, that is + make it the corresponding positive number, and then have it + negated by GMP, giving the correct representation of the + negative number. */ mpz_com (x, x); mpz_add_ui (x, x, 1); mpz_and (x, x, mask); -- 2.11.4.GIT