I understand. I've compiled NASM on Mac OS X and it seems to pass all the tests.
So while those people are working on porting binutils to Mac OS X - perhaps you could isolate assembly code into separate .s (or .asm) files that e.g. I could feed to NASM? Because since GNU incorporated GAS into binutils, it became a pain-in-the-neck to deal with. I personally think that it was a big mistake and a bad move to fold GAS into the binutils package. NASM input syntax is said to be "like Intel but with less complexity". Thanks! P.S. Here's an older test-run , and the current one (64-bit, cryptopp shared library). Recommendation: add some machine/cpu data from "cryptest.exe v" to cryptest.exe b", so one can identify the compilation etc. conditions under which the benchmark tests ran. Or later on (or after you've tried several options) these listings become rather useless (unless you took precautions and named the files appropriately, which not everybody does :-(). On Nov 21, 2009, at 23:16 , Wei Dai wrote: > There is no easy way to do this, as far as I can tell. Crypto++ > doesn't actually use GAS directly. It contains inline assembly, > which GCC mixes with assembly code that it generates, and then > passes on to the assembler. The code that GCC generates is in AT&T > syntax, which NASM doesn't support, I think. > > BTW, apparently someone is working on getting the latest GAS to work > on Mac OS X. See http://gcc.gnu.org/ml/gcc/2009-09/msg00146.html. > > -------------------------------------------------- > From: "Mouse" <[email protected]> > Sent: Wednesday, November 18, 2009 4:38 AM > To: "Crypto++ Users" <[email protected]> > Subject: Re: Performance in Mac OS X > >> Is it possible to configure Crypto++ to use NASM instead of GAS? If >> so >> - any guidance? >> >> I'll post 64-bit Mac OS X numbers later on. >> >> On Nov 17, 2009, at 17:27 , Wei Dai wrote: >> >>> I'm pretty sure GPLv3 came out way after GNU AS >>> supported .intel_syntax. I >>> suspect that Apple doesn't want to upgrade because they've made too >>> many >>> changes to the assembler and don't want to port those changes to a >>> later >>> version of GNU AS. >>> >>> I guess it wouldn't hurt to ask Apple directly. Does anyone know if >>> they >>> have an open source outreach/liason person? >>> >>> BTW, on 64-bit Mac OS X, the performance difference should be much >>> smaller, >>> if you compile Crypto++ into a 64-bit binary. (I don't remember if >>> that >>> happens automatically, or if you have to set some compiler flags.) >>> >>> -------------------------------------------------- >>> From: "Zooko Wilcox-O'Hearn" <[email protected]> >>> Sent: Tuesday, November 17, 2009 2:09 PM >>> To: "Wei Dai" <[email protected]> >>> Cc: "Jose Cisneros" <[email protected]>; "Crypto++ Users" >>> <[email protected]> >>> Subject: Re: Performance in Mac OS X >>> >>>> On Tuesday, 2009-11-17, at 13:47 , Wei Dai wrote: >>>> >>>>> That's because the assembler in Mac OS X is based on a very old >>>>> version >>>>> of GNU AS, which doesn't support .intel_syntax. The assembly code >>>>> in >>>>> Crypto++ is written in Intel syntax to be compatible with >>>>> Microsoft >>>>> compilers/assemblers. >>>> >>>> >>>> It is indeed a very old version. It calls itself "v1.38". GNU AS >>>> v1.38 >>>> was released so long ago that I can't figure out when it was. It >>>> was >>>> released before 1996, and probably many years before 1996. >>>> >>>> I think that Apple refuses to upgrade to the new GNU assembler >>>> because >>>> the new one is under GPLv3 and Apple doesn't like that. >>>> >>>> So, I don't know if or how this situation is ever going to be >>>> improved. >>>> Apple will patch its ancient version of as to do the new syntax? >>>> Wei Dai >>>> will write old-style-syntax variants of all his assembly just for >>>> Mac OS >>>> X? Apple will give up and accept GPLv3- licensed assembler? All >>>> Apple >>>> users will instead install some open source operating system on >>>> their >>>> machines? >>>> >>>> I guess what will happen is Crypto++ will continue to be much >>>> slower on >>>> Mac OS X than on other systems. Maybe this doesn't matter in >>>> practice. >>>> Just how slow is it? Slow enough that it diminishes your battery >>>> life? >>>> Slow enough that it worsens the user experience? >>>> >>>> Maybe someone who cares about this issue should write to Apple and >>>> request that their assembler support Intel syntax. >>>> >>>> Regards, >>>> >>>> Zooko >>>> >>> >>> -- >>> You received this message because you are subscribed to the "Crypto+ >>> + Users" Google Group. >>> To unsubscribe, send an email to [email protected] >>> . >>> More information about Crypto++ and this group is available at >>> http://www.cryptopp.com >>> . >> >> -- >> You received this message because you are subscribed to the "Crypto+ >> + Users" Google Group. >> To unsubscribe, send an email to [email protected] >> . >> More information about Crypto++ and this group is available at >> http://www.cryptopp.com >> . -- You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [email protected]. More information about Crypto++ and this group is available at http://www.cryptopp.com.CPU frequency of the test platform was not provided.
| Algorithm | MiB/Second | Microseconds to Setup Key and IV |
|---|---|---|
| AES/GCM (2K tables) | 32 | 2.782 |
| AES/GCM (64K tables) | 37 | 8.998 |
| AES/CCM | 22 | 0.766 |
| AES/EAX | 22 | 1.931 |
| GMAC(AES) (2K tables) | 109 | 2.757 |
| GMAC(AES) (64K tables) | 201 | 8.983 |
| VMAC(AES)-64 | 512 | 4.717 |
| VMAC(AES)-128 | 272 | 5.777 |
| HMAC(SHA-1) | 198 | 0.699 |
| Two-Track-MAC | 131 | 0.040 |
| CMAC(AES) | 45 | 0.666 |
| DMAC(AES) | 45 | 1.665 |
| CRC32 | 419 | |
| Adler32 | 1246 | |
| MD5 | 339 | |
| SHA-1 | 198 | |
| SHA-256 | 73 | |
| SHA-512 | 34 | |
| Tiger | 90 | |
| Whirlpool | 20 | |
| RIPEMD-160 | 105 | |
| RIPEMD-320 | 114 | |
| RIPEMD-128 | 192 | |
| RIPEMD-256 | 201 | |
| Panama-LE | 291 | 3.579 |
| Panama-BE | 269 | 3.728 |
| Salsa20 | 175 | 0.333 |
| Salsa20/12 | 249 | 0.383 |
| Salsa20/8 | 319 | 0.383 |
| Sosemanuk | 340 | 1.002 |
| MARC4 | 150 | 3.333 |
| SEAL-3.0-LE | 411 | 50.768 |
| WAKE-OFB-LE | 271 | 3.698 |
| AES/CTR (128-bit key) | 45 | 0.594 |
| AES/CTR (192-bit key) | 39 | 0.618 |
| AES/CTR (256-bit key) | 34 | 0.653 |
| AES/CBC (128-bit key) | 44 | 0.460 |
| AES/CBC (192-bit key) | 38 | 0.483 |
| AES/CBC (256-bit key) | 34 | 0.523 |
| AES/OFB (128-bit key) | 44 | 0.582 |
| AES/CFB (128-bit key) | 45 | 0.916 |
| AES/ECB (128-bit key) | 46 | 0.242 |
| Camellia/CTR (128-bit key) | 71 | 0.580 |
| Camellia/CTR (256-bit key) | 56 | 0.668 |
| Twofish/CTR | 60 | 5.682 |
| Serpent/CTR | 43 | 0.938 |
| CAST-256/CTR | 56 | 2.020 |
| RC6/CTR | 88 | 2.544 |
| MARS/CTR | 64 | 2.349 |
| SHACAL-2/CTR (128-bit key) | 61 | 0.817 |
| SHACAL-2/CTR (512-bit key) | 61 | 0.876 |
| DES/CTR | 37 | 7.067 |
| DES-XEX3/CTR | 34 | 7.364 |
| DES-EDE3/CTR | 14 | 21.293 |
| IDEA/CTR | 46 | 0.707 |
| RC5 (r=16) | 104 | 2.223 |
| Blowfish/CTR | 76 | 48.266 |
| TEA/CTR | 39 | 0.521 |
| XTEA/CTR | 17 | 0.517 |
| CAST-128/CTR | 46 | 0.986 |
| SKIPJACK/CTR | 26 | 2.510 |
| SEED/CTR (1/2 K table) | 41 | 0.694 |
| Operation | Milliseconds/Operation |
|---|---|
| RSA 1024 Encryption | 0.14 |
| RSA 1024 Decryption | 4.12 |
| LUC 1024 Encryption | 0.17 |
| LUC 1024 Decryption | 6.90 |
| DLIES 1024 Encryption | 4.61 |
| DLIES 1024 Encryption with precomputation | 3.88 |
| DLIES 1024 Decryption | 2.98 |
| LUCELG 512 Encryption | 2.07 |
| LUCELG 512 Encryption with precomputation | 2.06 |
| LUCELG 512 Decryption | 1.26 |
| RSA 2048 Encryption | 0.39 |
| RSA 2048 Decryption | 29.10 |
| LUC 2048 Encryption | 0.52 |
| LUC 2048 Decryption | 48.91 |
| DLIES 2048 Encryption | 21.96 |
| DLIES 2048 Encryption with precomputation | 19.06 |
| DLIES 2048 Decryption | 12.57 |
| LUCELG 1024 Encryption | 10.50 |
| LUCELG 1024 Encryption with precomputation | 10.67 |
| LUCELG 1024 Decryption | 5.97 |
| RSA 1024 Signature | 4.07 |
| RSA 1024 Verification | 0.14 |
| RW 1024 Signature | 4.40 |
| RW 1024 Verification | 0.06 |
| LUC 1024 Signature | 6.91 |
| LUC 1024 Verification | 0.17 |
| NR 1024 Signature | 2.34 |
| NR 1024 Signature with precomputation | 0.93 |
| NR 1024 Verification | 2.65 |
| NR 1024 Verification with precomputation | 1.52 |
| DSA 1024 Signature | 2.28 |
| DSA 1024 Signature with precomputation | 0.92 |
| DSA 1024 Verification | 2.65 |
| DSA 1024 Verification with precomputation | 1.44 |
| LUC-HMP 512 Signature | 2.03 |
| LUC-HMP 512 Signature with precomputation | 2.02 |
| LUC-HMP 512 Verification | 2.04 |
| LUC-HMP 512 Verification with precomputation | 2.06 |
| ESIGN 1023 Signature | 0.35 |
| ESIGN 1023 Verification | 0.13 |
| ESIGN 1536 Signature | 0.84 |
| ESIGN 1536 Verification | 0.37 |
| RSA 2048 Signature | 29.05 |
| RSA 2048 Verification | 0.40 |
| RW 2048 Signature | 29.86 |
| RW 2048 Verification | 0.13 |
| LUC 2048 Signature | 48.83 |
| LUC 2048 Verification | 0.51 |
| NR 2048 Signature | 11.21 |
| NR 2048 Signature with precomputation | 3.37 |
| NR 2048 Verification | 12.53 |
| NR 2048 Verification with precomputation | 5.43 |
| LUC-HMP 1024 Signature | 10.83 |
| LUC-HMP 1024 Signature with precomputation | 10.65 |
| LUC-HMP 1024 Verification | 10.83 |
| LUC-HMP 1024 Verification with precomputation | 10.83 |
| ESIGN 2046 Signature | 0.97 |
| ESIGN 2046 Verification | 0.39 |
| XTR-DH 171 Key-Pair Generation | 1.58 |
| XTR-DH 171 Key Agreement | 3.13 |
| XTR-DH 342 Key-Pair Generation | 6.72 |
| XTR-DH 342 Key Agreement | 13.50 |
| DH 1024 Key-Pair Generation | 2.37 |
| DH 1024 Key-Pair Generation with precomputation | 1.96 |
| DH 1024 Key Agreement | 2.90 |
| DH 2048 Key-Pair Generation | 11.04 |
| DH 2048 Key-Pair Generation with precomputation | 9.72 |
| DH 2048 Key Agreement | 12.58 |
| LUCDIF 512 Key-Pair Generation | 1.03 |
| LUCDIF 512 Key-Pair Generation with precomputation | 1.03 |
| LUCDIF 512 Key Agreement | 1.29 |
| LUCDIF 1024 Key-Pair Generation | 5.21 |
| LUCDIF 1024 Key-Pair Generation with precomputation | 5.25 |
| LUCDIF 1024 Key Agreement | 5.80 |
| MQV 1024 Key-Pair Generation | 2.32 |
| MQV 1024 Key-Pair Generation with precomputation | 0.89 |
| MQV 1024 Key Agreement | 4.31 |
| MQV 2048 Key-Pair Generation | 11.04 |
| MQV 2048 Key-Pair Generation with precomputation | 3.34 |
| MQV 2048 Key Agreement | 19.94 |
| ECIES over GF(p) 256 Encryption | 8.29 |
| ECIES over GF(p) 256 Encryption with precomputation | 5.30 |
| ECIES over GF(p) 256 Decryption | 5.32 |
| ECDSA over GF(p) 256 Signature | 4.11 |
| ECDSA over GF(p) 256 Signature with precomputation | 2.71 |
| ECDSA over GF(p) 256 Verification | 11.84 |
| ECDSA over GF(p) 256 Verification with precomputation | 4.43 |
| ECDHC over GF(p) 256 Key-Pair Generation | 4.12 |
| ECDHC over GF(p) 256 Key-Pair Generation with precomputation | 2.68 |
| ECDHC over GF(p) 256 Key Agreement | 4.13 |
| ECMQVC over GF(p) 256 Key-Pair Generation | 4.09 |
| ECMQVC over GF(p) 256 Key-Pair Generation with precomputation | 2.65 |
| ECMQVC over GF(p) 256 Key Agreement | 11.88 |
| ECIES over GF(2^n) 233 Encryption | 19.08 |
| ECIES over GF(2^n) 233 Encryption with precomputation | 5.45 |
| ECIES over GF(2^n) 233 Decryption | 10.91 |
| ECNR over GF(2^n) 233 Signature | 9.68 |
| ECNR over GF(2^n) 233 Signature with precomputation | 2.80 |
| ECNR over GF(2^n) 233 Verification | 12.06 |
| ECNR over GF(2^n) 233 Verification with precomputation | 4.67 |
| ECDHC over GF(2^n) 233 Key-Pair Generation | 9.61 |
| ECDHC over GF(2^n) 233 Key-Pair Generation with precomputation | 2.72 |
| ECDHC over GF(2^n) 233 Key Agreement | 9.57 |
| ECMQVC over GF(2^n) 233 Key-Pair Generation | 9.61 |
| ECMQVC over GF(2^n) 233 Key-Pair Generation with precomputation | 2.72 |
| ECMQVC over GF(2^n) 233 Key Agreement | 12.07 |
, and the current one |
| Algorithm | MiB/Second | Microseconds to Setup Key and IV |
|---|---|---|
| AES/GCM (2K tables) | 83 | 1.621 |
| AES/GCM (64K tables) | 82 | 11.323 |
| AES/CCM | 61 | 0.550 |
| AES/EAX | 61 | 1.073 |
| GMAC(AES) (2K tables) | 257 | 1.626 |
| GMAC(AES) (64K tables) | 252 | 11.309 |
| VMAC(AES)-64 | 3481 | 2.106 |
| VMAC(AES)-128 | 1305 | 2.509 |
| HMAC(SHA-1) | 267 | 0.442 |
| Two-Track-MAC | 164 | 0.032 |
| CMAC(AES) | 122 | 0.400 |
| DMAC(AES) | 121 | 1.050 |
| CRC32 | 417 | |
| Adler32 | 1575 | |
| MD5 | 419 | |
| SHA-1 | 266 | |
| SHA-256 | 112 | |
| SHA-512 | 176 | |
| Tiger | 346 | |
| Whirlpool | 48 | |
| RIPEMD-160 | 170 | |
| RIPEMD-320 | 184 | |
| RIPEMD-128 | 257 | |
| RIPEMD-256 | 286 | |
| Panama-LE | 399 | 2.452 |
| Panama-BE | 293 | 3.158 |
| Salsa20 | 228 | 0.189 |
| Salsa20/12 | 329 | 0.228 |
| Salsa20/8 | 418 | 0.228 |
| Sosemanuk | 303 | 1.151 |
| MARC4 | 218 | 2.421 |
| SEAL-3.0-LE | 577 | 34.264 |
| WAKE-OFB-LE | 285 | 2.481 |
| AES/CTR (128-bit key) | 122 | 0.389 |
| AES/CTR (192-bit key) | 105 | 0.383 |
| AES/CTR (256-bit key) | 92 | 0.411 |
| AES/CBC (128-bit key) | 121 | 0.317 |
| AES/CBC (192-bit key) | 104 | 0.314 |
| AES/CBC (256-bit key) | 91 | 0.343 |
| AES/OFB (128-bit key) | 122 | 0.371 |
| AES/CFB (128-bit key) | 122 | 0.503 |
| AES/ECB (128-bit key) | 125 | 0.183 |
| Camellia/CTR (128-bit key) | 82 | 0.313 |
| Camellia/CTR (256-bit key) | 65 | 0.357 |
| Twofish/CTR | 107 | 4.312 |
| Serpent/CTR | 49 | 0.818 |
| CAST-256/CTR | 59 | 1.401 |
| RC6/CTR | 89 | 3.813 |
| MARS/CTR | 104 | 1.857 |
| SHACAL-2/CTR (128-bit key) | 92 | 0.492 |
| SHACAL-2/CTR (512-bit key) | 92 | 0.542 |
| DES/CTR | 47 | 6.772 |
| DES-XEX3/CTR | 44 | 6.970 |
| DES-EDE3/CTR | 19 | 20.664 |
| IDEA/CTR | 46 | 0.392 |
| RC5 (r=16) | 104 | 3.200 |
| Blowfish/CTR | 89 | 39.915 |
| TEA/CTR | 39 | 0.307 |
| XTEA/CTR | 36 | 0.298 |
| CAST-128/CTR | 76 | 0.546 |
| SKIPJACK/CTR | 34 | 3.285 |
| SEED/CTR (1/2 K table) | 35 | 0.413 |
| Operation | Milliseconds/Operation |
|---|---|
| RSA 1024 Encryption | 0.05 |
| RSA 1024 Decryption | 0.90 |
| LUC 1024 Encryption | 0.05 |
| LUC 1024 Decryption | 1.59 |
| DLIES 1024 Encryption | 0.57 |
| DLIES 1024 Encryption with precomputation | 1.03 |
| DLIES 1024 Decryption | 0.78 |
| LUCELG 512 Encryption | 0.39 |
| LUCELG 512 Encryption with precomputation | 0.39 |
| LUCELG 512 Decryption | 0.43 |
| RSA 2048 Encryption | 0.10 |
| RSA 2048 Decryption | 3.97 |
| LUC 2048 Encryption | 0.11 |
| LUC 2048 Decryption | 6.65 |
| DLIES 2048 Encryption | 2.96 |
| DLIES 2048 Encryption with precomputation | 3.30 |
| DLIES 2048 Decryption | 2.52 |
| LUCELG 1024 Encryption | 1.30 |
| LUCELG 1024 Encryption with precomputation | 1.30 |
| LUCELG 1024 Decryption | 1.15 |
| RSA 1024 Signature | 0.94 |
| RSA 1024 Verification | 0.05 |
| RW 1024 Signature | 1.28 |
| RW 1024 Verification | 0.03 |
| LUC 1024 Signature | 1.58 |
| LUC 1024 Verification | 0.05 |
| NR 1024 Signature | 0.31 |
| NR 1024 Signature with precomputation | 0.27 |
| NR 1024 Verification | 0.36 |
| NR 1024 Verification with precomputation | 0.41 |
| DSA 1024 Signature | 0.30 |
| DSA 1024 Signature with precomputation | 0.27 |
| DSA 1024 Verification | 0.35 |
| DSA 1024 Verification with precomputation | 0.40 |
| LUC-HMP 512 Signature | 0.38 |
| LUC-HMP 512 Signature with precomputation | 0.38 |
| LUC-HMP 512 Verification | 0.39 |
| LUC-HMP 512 Verification with precomputation | 0.39 |
| ESIGN 1023 Signature | 0.14 |
| ESIGN 1023 Verification | 0.04 |
| ESIGN 1536 Signature | 0.24 |
| ESIGN 1536 Verification | 0.09 |
| RSA 2048 Signature | 3.94 |
| RSA 2048 Verification | 0.10 |
| RW 2048 Signature | 4.78 |
| RW 2048 Verification | 0.05 |
| LUC 2048 Signature | 6.72 |
| LUC 2048 Verification | 0.11 |
| NR 2048 Signature | 1.52 |
| NR 2048 Signature with precomputation | 0.64 |
| NR 2048 Verification | 1.75 |
| NR 2048 Verification with precomputation | 1.02 |
| LUC-HMP 1024 Signature | 1.31 |
| LUC-HMP 1024 Signature with precomputation | 1.32 |
| LUC-HMP 1024 Verification | 1.31 |
| LUC-HMP 1024 Verification with precomputation | 1.40 |
| ESIGN 2046 Signature | 0.29 |
| ESIGN 2046 Verification | 0.09 |
| XTR-DH 171 Key-Pair Generation | 0.47 |
| XTR-DH 171 Key Agreement | 0.93 |
| XTR-DH 342 Key-Pair Generation | 1.32 |
| XTR-DH 342 Key Agreement | 2.61 |
| DH 1024 Key-Pair Generation | 0.30 |
| DH 1024 Key-Pair Generation with precomputation | 0.52 |
| DH 1024 Key Agreement | 0.77 |
| DH 2048 Key-Pair Generation | 1.50 |
| DH 2048 Key-Pair Generation with precomputation | 1.66 |
| DH 2048 Key Agreement | 2.51 |
| LUCDIF 512 Key-Pair Generation | 0.20 |
| LUCDIF 512 Key-Pair Generation with precomputation | 0.20 |
| LUCDIF 512 Key Agreement | 0.41 |
| LUCDIF 1024 Key-Pair Generation | 0.67 |
| LUCDIF 1024 Key-Pair Generation with precomputation | 0.66 |
| LUCDIF 1024 Key Agreement | 1.12 |
| MQV 1024 Key-Pair Generation | 0.28 |
| MQV 1024 Key-Pair Generation with precomputation | 0.25 |
| MQV 1024 Key Agreement | 0.57 |
| MQV 2048 Key-Pair Generation | 1.48 |
| MQV 2048 Key-Pair Generation with precomputation | 0.61 |
| MQV 2048 Key Agreement | 2.78 |
| ECIES over GF(p) 256 Encryption | 3.30 |
| ECIES over GF(p) 256 Encryption with precomputation | 2.68 |
| ECIES over GF(p) 256 Decryption | 2.28 |
| ECDSA over GF(p) 256 Signature | 1.68 |
| ECDSA over GF(p) 256 Signature with precomputation | 1.39 |
| ECDSA over GF(p) 256 Verification | 5.32 |
| ECDSA over GF(p) 256 Verification with precomputation | 2.33 |
| ECDHC over GF(p) 256 Key-Pair Generation | 1.69 |
| ECDHC over GF(p) 256 Key-Pair Generation with precomputation | 1.35 |
| ECDHC over GF(p) 256 Key Agreement | 1.66 |
| ECMQVC over GF(p) 256 Key-Pair Generation | 1.66 |
| ECMQVC over GF(p) 256 Key-Pair Generation with precomputation | 1.35 |
| ECMQVC over GF(p) 256 Key Agreement | 5.25 |
| ECIES over GF(2^n) 233 Encryption | 10.49 |
| ECIES over GF(2^n) 233 Encryption with precomputation | 3.17 |
| ECIES over GF(2^n) 233 Decryption | 5.88 |
| ECNR over GF(2^n) 233 Signature | 5.22 |
| ECNR over GF(2^n) 233 Signature with precomputation | 1.65 |
| ECNR over GF(2^n) 233 Verification | 6.40 |
| ECNR over GF(2^n) 233 Verification with precomputation | 2.86 |
| ECDHC over GF(2^n) 233 Key-Pair Generation | 5.23 |
| ECDHC over GF(2^n) 233 Key-Pair Generation with precomputation | 1.63 |
| ECDHC over GF(2^n) 233 Key Agreement | 5.17 |
| ECMQVC over GF(2^n) 233 Key-Pair Generation | 5.30 |
| ECMQVC over GF(2^n) 233 Key-Pair Generation with precomputation | 1.59 |
| ECMQVC over GF(2^n) 233 Key Agreement | 6.47 |
(64-bit, cryptopp shared library). Recommendation: add some machine/cpu data from "cryptest.exe v" to cryptest.exe b", so one can identify the compilation etc. conditions under which the benchmark tests ran. Or later on (or after you've tried several options) these listings become rather useless (unless you took precautions and named the files appropriately, which not everybody does :-(). On Nov 21, 2009, at 23:16 , Wei Dai wrote:
|
