diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2017-01-29 23:33:04 +0100 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2017-01-29 23:33:04 +0100 |
commit | 5a3e9708b2f6e87125243178eebb3bbaae046e03 (patch) | |
tree | de597ac9579becc6892fb55b0f47bccc50b6760f /mpz/ior.c | |
parent | 8ddf4a30748cf34efc645d9b397540b133dde26b (diff) | |
download | gmp-5a3e9708b2f6e87125243178eebb3bbaae046e03.tar.gz |
mpz/{and,ior,xor}.c: Simplify branches.
Diffstat (limited to 'mpz/ior.c')
-rw-r--r-- | mpz/ior.c | 85 |
1 files changed, 25 insertions, 60 deletions
@@ -1,7 +1,7 @@ /* mpz_ior -- Logical inclusive or. Copyright 1991, 1993, 1994, 1996, 1997, 2000, 2001, 2005, 2012, 2013, -2015 Free Software Foundation, Inc. +2015-2017 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -45,58 +45,33 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) op1_size = SIZ(op1); op2_size = SIZ(op2); + if (op1_size < op2_size) + { + MPZ_SRCPTR_SWAP (op1, op2); + MP_SIZE_T_SWAP (op1_size, op2_size); + } + op1_ptr = PTR(op1); - op2_ptr = PTR(op2); res_ptr = PTR(res); - if (op1_size >= 0) + if (op2_size >= 0) { - if (op2_size >= 0) - { - if (op1_size >= op2_size) - { - if (UNLIKELY (ALLOC(res) < op1_size)) - { - res_ptr = (mp_ptr) _mpz_realloc (res, op1_size); - /* No overlapping possible: op1_ptr = PTR(op1); */ - op2_ptr = PTR(op2); - } - - if (res_ptr != op1_ptr) - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - if (LIKELY (op2_size != 0)) - mpn_ior_n (res_ptr, op1_ptr, op2_ptr, op2_size); - res_size = op1_size; - } - else - { - if (UNLIKELY (ALLOC(res) < op2_size)) - { - res_ptr = (mp_ptr) _mpz_realloc (res, op2_size); - op1_ptr = PTR(op1); - /* No overlapping possible: op2_ptr = PTR(op2); */ - } - - if (res_ptr != op2_ptr) - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - if (LIKELY (op1_size != 0)) - mpn_ior_n (res_ptr, op1_ptr, op2_ptr, op1_size); - res_size = op2_size; - } - - SIZ(res) = res_size; - return; - } - else /* op2_size < 0 */ + if (res_ptr != op1_ptr) { - /* Fall through to the code at the end of the function. */ + res_ptr = MPZ_REALLOC (res, op1_size); + /* No overlapping possible: op1_ptr = PTR(op1); */ + MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, + op1_size - op2_size); } + if (LIKELY (op2_size != 0)) + mpn_ior_n (res_ptr, op1_ptr, PTR(op2), op2_size); + + SIZ(res) = op1_size; + return; } else { - if (op2_size < 0) + if (op1_size < 0) { mp_ptr opx, opy; @@ -105,10 +80,7 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) = ~(~(OP1 - 1) | ~(OP2 - 1)) + 1 = = ((OP1 - 1) & (OP2 - 1)) + 1 */ - op1_size = -op1_size; - op2_size = -op2_size; - - res_size = MIN (op1_size, op2_size); + res_size = -op1_size; /* Possible optimization: Decrease mpn_sub precision, as we won't use the entire res of both. */ @@ -116,11 +88,11 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) mpn_sub_1 (opx, op1_ptr, res_size, (mp_limb_t) 1); op1_ptr = opx; - mpn_sub_1 (opy, op2_ptr, res_size, (mp_limb_t) 1); + mpn_sub_1 (opy, PTR(op2), res_size, (mp_limb_t) 1); op2_ptr = opy; /* First loop finds the size of the result. */ - for (i = res_size - 1; i >= 0; i--) + for (i = res_size; --i >= 0;) if ((op1_ptr[i] & op2_ptr[i]) != 0) break; res_size = i + 1; @@ -146,13 +118,6 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) TMP_FREE; return; } - else - { - /* We should compute -OP1 | OP2. Swap OP1 and OP2 and fall - through to the code that handles OP1 | -OP2. */ - MPZ_SRCPTR_SWAP (op1, op2); - MPN_SRCPTR_SWAP (op1_ptr,op1_size, op2_ptr,op2_size); - } } { @@ -171,7 +136,7 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) res_alloc = op2_size; opx = TMP_ALLOC_LIMBS (op2_size); - mpn_sub_1 (opx, op2_ptr, op2_size, (mp_limb_t) 1); + mpn_sub_1 (opx, PTR(op2), op2_size, (mp_limb_t) 1); op2_ptr = opx; op2_size -= op2_ptr[op2_size - 1] == 0; @@ -188,7 +153,7 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) because the result limbs are zero there. */ /* First loop finds the size of the result. */ - for (i = op2_size - 1; i >= 0; i--) + for (i = op2_size; --i >= 0;) if ((~op1_ptr[i] & op2_ptr[i]) != 0) break; res_size = i + 1; @@ -213,7 +178,7 @@ mpz_ior (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) if (cy) { res_ptr[res_size] = cy; - res_size++; + ++res_size; } } else |