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/xor.c | |
parent | 8ddf4a30748cf34efc645d9b397540b133dde26b (diff) | |
download | gmp-5a3e9708b2f6e87125243178eebb3bbaae046e03.tar.gz |
mpz/{and,ior,xor}.c: Simplify branches.
Diffstat (limited to 'mpz/xor.c')
-rw-r--r-- | mpz/xor.c | 85 |
1 files changed, 24 insertions, 61 deletions
@@ -1,7 +1,7 @@ /* mpz_xor -- Logical xor. -Copyright 1991, 1993, 1994, 1996, 1997, 2000, 2001, 2005, 2012, 2015 -Free Software Foundation, Inc. +Copyright 1991, 1993, 1994, 1996, 1997, 2000, 2001, 2005, 2012, +2015-2017 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -44,61 +44,34 @@ mpz_xor (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 (res_ptr != op1_ptr) { - if (op1_size >= op2_size) - { - if (res_ptr != op1_ptr) - { - 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); - } - MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, - op1_size - op2_size); - } - if (LIKELY (op2_size != 0)) - mpn_xor_n (res_ptr, op1_ptr, op2_ptr, op2_size); - res_size = op1_size; - } - else - { - if (res_ptr != op2_ptr) - { - 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); */ - } - MPN_COPY (res_ptr + op1_size, op2_ptr + op1_size, - op2_size - op1_size); - } - if (LIKELY (op1_size != 0)) - mpn_xor_n (res_ptr, op1_ptr, op2_ptr, op1_size); - res_size = op2_size; - } - - MPN_NORMALIZE (res_ptr, res_size); - SIZ(res) = res_size; - return; - } - else /* op2_size < 0 */ - { - /* Fall through to the code at the end of the function. */ + res_ptr = MPZ_REALLOC (res, op1_size); + MPN_COPY (res_ptr + op2_size, op1_ptr + op2_size, + op1_size - op2_size); } + if (LIKELY (op2_size != 0)) + mpn_xor_n (res_ptr, op1_ptr, PTR(op2), op2_size); + res_size = op1_size; + + MPN_NORMALIZE (res_ptr, res_size); + SIZ(res) = res_size; + return; } else { - if (op2_size < 0) + if (op1_size < 0) { mp_ptr opx, opy; @@ -116,12 +89,9 @@ mpz_xor (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) mpn_sub_1 (opx, op1_ptr, op1_size, (mp_limb_t) 1); op1_ptr = opx; - mpn_sub_1 (opy, op2_ptr, op2_size, (mp_limb_t) 1); + mpn_sub_1 (opy, PTR(op2), op2_size, (mp_limb_t) 1); op2_ptr = opy; - if (op1_size > op2_size) - MPN_SRCPTR_SWAP (op1_ptr,op1_size, op2_ptr,op2_size); - res_alloc = op2_size; res_ptr = MPZ_NEWALLOC (res, res_alloc); /* Don't re-read OP1_PTR and OP2_PTR. They point to temporary @@ -138,13 +108,6 @@ mpz_xor (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); - } } { @@ -159,7 +122,7 @@ mpz_xor (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) op2_size = -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; res_alloc = MAX (op1_size, op2_size) + 1; @@ -186,7 +149,7 @@ mpz_xor (mpz_ptr res, mpz_srcptr op1, mpz_srcptr op2) cy = mpn_add_1 (res_ptr, res_ptr, res_size, (mp_limb_t) 1); res_ptr[res_size] = cy; - res_size += (cy != 0); + res_size += cy; MPN_NORMALIZE_NOT_ZERO (res_ptr, res_size); SIZ(res) = -res_size; |