| Gerhard Niklasch on Fri, 3 Jul 1998 16:24:52 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Now if we are utterly pedantic... |
...and take the utterly remote possiblity of a 1's complement machine
into account, then the following should go over Louis Granboulan's
recent `signed minus' patch (we discussed this in email off the list):
bash$ diff -u src/kernel/none/mp.c~ src/kernel/none/mp.c
--- src/kernel/none/mp.c~ Thu Jul 2 11:19:41 1998
+++ src/kernel/none/mp.c Fri Jul 3 16:08:29 1998
@@ -876,7 +876,7 @@
#ifdef LONG_IS_64BIT
if (! (z&0xffffffff)) { s = 32; z >>=32; } else s = 0;
#endif
- z = z | -(long)z;
+ z = z | (~z + 1);
z = (z<<4) + z;
z = (z<<6) + z;
z = z ^ (z<<16); /* or z = z - (z<<16); or z = z &~ (z<<16); */
(the reason being that here we really want the bit pattern of ~z+1,
regardless of whether it happens to be minus z for the machine integer
addition).
(However, I wouldn't vouch for all the remainder of the PARI code not
to rely anywhere on 2's complement arithmetic...:^)
Then again, many modern processors have a single machine instruction
for counting the _leading_ zeros in a word (bfffo() in the PARI kernel),
and there is a cute little trick to use this for doing what the above
vals() code does (counting the _trailing_ zeros). Friday trivia quiz:
(1) what is this trick?
(2) why is that other function called bfffo? ;)
Merry guessing and have a nice weekend everywhere,
Gerhard "while (--bugs_in_factorizing) fix_them() && do_test;"