Linus Torvalds wrote: > > On Thu, 6 Aug 2009, Artur Skawina wrote: >>> The way it's written, I can easily make it do one or the other by just >>> turning the macro inside a loop (and we can have a preprocessor flag to >>> choose one or the other), but let me work on it a bit more first. >> that's of course how i measured it.. :) > > Well, with my "rolling 512-bit array" I can't do that easily any more. > > Now it actually depends on the compiler being able to statically do that > circular list calculation. If I were to turn it back into the chunks of > loops, my new code would suck, because it would have all those nasty > dynamic address calculations. i did try (obvious patch below) and in fact the loops still win on p4: #Initializing... Rounds: 1000000, size: 62500K, time: 1.428s, speed: 42.76MB/s # TIME[s] SPEED[MB/s] rfc3174 1.437 42.47 rfc3174 1.438 42.45 linus 0.5791 105.4 linusas 0.5052 120.8 mozilla 1.525 40.01 mozillaas 1.192 51.19 artur --- block-sha1/sha1.c 2009-08-06 06:45:03.407322970 +0200 +++ block-sha1/sha1as.c 2009-08-06 07:36:41.332318683 +0200 @@ -107,13 +107,17 @@ #define T_0_15(t) \ TEMP = htonl(data[t]); array[t] = TEMP; \ - TEMP += SHA_ROL(A,5) + (((C^D)&B)^D) + E + 0x5a827999; \ - E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; \ + TEMP += SHA_ROL(A,5) + (((C^D)&B)^D) + E; \ + E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP + 0x5a827999; \ +#if UNROLL T_0_15( 0); T_0_15( 1); T_0_15( 2); T_0_15( 3); T_0_15( 4); T_0_15( 5); T_0_15( 6); T_0_15( 7); T_0_15( 8); T_0_15( 9); T_0_15(10); T_0_15(11); T_0_15(12); T_0_15(13); T_0_15(14); T_0_15(15); +#else + for (int t = 0; t <= 15; t++) { T_0_15(t); } +#endif /* This "rolls" over the 512-bit array */ #define W(x) (array[(x)&15]) @@ -125,37 +129,53 @@ TEMP += SHA_ROL(A,5) + (((C^D)&B)^D) + E + 0x5a827999; \ E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; \ +#if UNROLL T_16_19(16); T_16_19(17); T_16_19(18); T_16_19(19); +#else + for (int t = 16; t <= 19; t++) { T_16_19(t); } +#endif #define T_20_39(t) \ SHA_XOR(t); \ - TEMP += SHA_ROL(A,5) + (B^C^D) + E + 0x6ed9eba1; \ - E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; + TEMP += SHA_ROL(A,5) + (B^C^D) + E; \ + E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP + 0x6ed9eba1; +#if UNROLL T_20_39(20); T_20_39(21); T_20_39(22); T_20_39(23); T_20_39(24); T_20_39(25); T_20_39(26); T_20_39(27); T_20_39(28); T_20_39(29); T_20_39(30); T_20_39(31); T_20_39(32); T_20_39(33); T_20_39(34); T_20_39(35); T_20_39(36); T_20_39(37); T_20_39(38); T_20_39(39); +#else + for (int t = 20; t <= 39; t++) { T_20_39(t); } +#endif #define T_40_59(t) \ SHA_XOR(t); \ - TEMP += SHA_ROL(A,5) + ((B&C)|(D&(B|C))) + E + 0x8f1bbcdc; \ - E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; + TEMP += SHA_ROL(A,5) + ((B&C)|(D&(B|C))) + E; \ + E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP + 0x8f1bbcdc; +#if UNROLL T_40_59(40); T_40_59(41); T_40_59(42); T_40_59(43); T_40_59(44); T_40_59(45); T_40_59(46); T_40_59(47); T_40_59(48); T_40_59(49); T_40_59(50); T_40_59(51); T_40_59(52); T_40_59(53); T_40_59(54); T_40_59(55); T_40_59(56); T_40_59(57); T_40_59(58); T_40_59(59); +#else + for (int t = 40; t <= 59; t++) { T_40_59(t); } +#endif #define T_60_79(t) \ SHA_XOR(t); \ TEMP += SHA_ROL(A,5) + (B^C^D) + E + 0xca62c1d6; \ E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; +#if UNROLL T_60_79(60); T_60_79(61); T_60_79(62); T_60_79(63); T_60_79(64); T_60_79(65); T_60_79(66); T_60_79(67); T_60_79(68); T_60_79(69); T_60_79(70); T_60_79(71); T_60_79(72); T_60_79(73); T_60_79(74); T_60_79(75); T_60_79(76); T_60_79(77); T_60_79(78); T_60_79(79); +#else + for (int t = 60; t <= 79; t++) { T_60_79(t); } +#endif ctx->H[0] += A; ctx->H[1] += B; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html