結局もう1パターン

int _strncmp(void *buf, void *str, size_t size){
    int *b = (int *)buf;
    int *s = (int *)str;
    unsigned int k = size >> 2;
    for(unsigned int i=0;i<k;i++){
        if( (b[i])^(s[i]) ){ return (b[i] - s[i]); }
    }
    k <<= 1;
    short *sb = (short *)buf;
    short *ss = (short *)str;
    if( (size & 2) && ( (sb[k])^(ss[k]) ) ){ return (sb[k] - ss[k]); }
    k <<= 1;
    char *cb = (char *)buf;
    char *cs = (char *)str;
    if( (size & 1) && ( (cb[k])^(cs[k]) ) ){ return (cb[k] - cs[k]); }
    return 0;
}

shortも使うことで比較の回数が減っているはず。shortやcharでわざわざ変数を用意しているのはポインタのキャストをいまいちよくわかっていないせい。おかげで2変数*2回の計4回ほど無駄なmov命令が発行されるわけで。
これ以上何かやるとしたら端数では上位に0を埋めて無理矢理全部32bit比較とか?(ぉ
ちなみに、今回の関数とmemcmp()で130文字まで等しい文字列の比較を3億回ほどさせたところ、_strncmp()で84秒、memcmp()で217秒かかりました。130文字というのは気まぐれです(^^;
SSEで128bit単位の比較だとどれくらい早くなるものか?わくわく(ぉ