私の仕事はチェック(>兆チェック)です。2つのintには、事前定義されたニブルのペア(最初のペアは0x2 0x7、2番目のペアは0xd 0x8)が含まれていますか。例えば:
bit offset: 12345678
first int: 0x3d542783 first pair of 0x2 second: 0xd
second int: 0x486378d9 nibbles: 0x7 pair: 0x8
^ ^
したがって、この例では、必要なペアで2つのオフセットをマークします(オフセットは2と5ですが、7ではありません)。実際のオフセットと見つかったペアの数は、私のタスクでは必要ありません。
したがって、与えられた2つのintについて、問題は次のとおりです。同じオフセットにこれらのニブルのペアのいずれかが含まれていますか。
私は自分のプログラムをチェックしました。この部分は最もホットな場所です(gprof
証明済み)。そしてそれは非常に何度も呼ばれます(gcov
証明されています)。実際には、ネストされたループの3番目または4番目のループ(最もネストされたループ)です。
私の現在のコードは遅いです(私はそれを関数として書き直しますが、それは内部ループからのコードです):
static inline int nibble_check (uint32_t A, uint32_t B)
__attribute__((always_inline))
{
int i;
for(i=0;i<8;i++)
if( ( ( (A&0xf) ==0xD) && ( (B&0xf) ==0x8) ) // first pair
|| ( ( (A&0xf) ==0x2) && ( (B&0xf) ==0x7) ) ) // second pair
return 1; // nibbles found
else {
A>>=4;
B>>=4;
}
return 0; // nibbles not found
}
もう1つのタスクは、オフセット0、4、8ビットなどだけでなく、オフセット0、2、4、8、10、...ビットでもこのペアを見つけることです。
#define douburu_nibble_check(A,B) (nibble_check(A,B) || nibble_check(A>>2, B>>2) )
この関数とマクロを並行して書き直すことは可能ですか?
私のコンパイラはgcc452で、CPUは32ビットモード(x86)のIntelCore2Soloです。