合わせて手動アンロールも少し修正
int64_t __attribute__ ((noinline)) simple_unroll4(std::vector<uint> const &data)
{
int64_t sum = 0;
size_t const size = data.size();
size_t i = 0;
size_t const overflow_safe_chunk_size = (1ULL<< (8*sizeof(uint)))/(1ULL<<8); // 0xff = (1<<8)-1
for(size_t ichunk = 0; ichunk < size ; ichunk += overflow_safe_chunk_size){
uint sub[4]{};
for ( ; i < ichunk; i+=4)
{
if (128 <= data[i+0]) sub[0] += data[i+0];
if (128 <= data[i+1]) sub[1] += data[i+1];
if (128 <= data[i+2]) sub[2] += data[i+2];
if (128 <= data[i+3]) sub[3] += data[i+3];

}
sum += sub[0]+sub[1]+sub[2]+sub[3];
}
for ( ; i < size; i+=1)
{
if (128 <= data[i]) sum += data[i];
}

return sum;
}
gccとclangでかなりの違いが出てるのでSIMD intrinsicsで書くべきなんだろうけど
そこまでするとM1/M2で使えなくなるのでこの辺が落としどころ?