+/* courtesy of neon/nocturnal :-) */
+unsigned find_parity_32x2(unsigned a, unsigned b)
+{
+ unsigned long long x = (unsigned long long)a | (((unsigned long long)b)<<32);
+ x = x ^ (x >> 1);
+ x = (x ^ (x >> 2)) & 0x1111111111111111ULL;
+ x = x * 0x11111111;
+ return ((x>>28)&1) | ((x>>(32+28-1))&2);
+}
+
+#if PARALLEL_PARITY
+ return find_parity_32x2(data & 0x03b4e996, data & 0x00007fff) |
+ (find_parity_32x2(data & 0x003f80ff, data & 0x01c78f0f) << 2) |
+ (find_parity_32x2(data & 0x02d9b333, data & 0x036ad555) << 4);
+#else
unsigned parity1 = find_parity_32(data & 0x036ad555);
unsigned parity2 = find_parity_32(data & 0x02d9b333);
unsigned parity3 = find_parity_32(data & 0x01c78f0f);
unsigned parity4 = find_parity_32(data & 0x003f80ff);
unsigned parity5 = find_parity_32(data & 0x00007fff);
unsigned parity6 = find_parity_32(data & 0x03b4e996);
unsigned parity1 = find_parity_32(data & 0x036ad555);
unsigned parity2 = find_parity_32(data & 0x02d9b333);
unsigned parity3 = find_parity_32(data & 0x01c78f0f);
unsigned parity4 = find_parity_32(data & 0x003f80ff);
unsigned parity5 = find_parity_32(data & 0x00007fff);
unsigned parity6 = find_parity_32(data & 0x03b4e996);