Из того, что вы сказали, я считаю, что вы пытаетесь избежать прыжков, поэтому я работаю над этим.
Я почти уверен, что код, который вы разместили, выглядит просто гладко, но на самом деле он не будет настолько хорош, если его скомпилировать для многих процессоров, хотя он может быть и у вас. Большинство известных мне процессоров на самом деле не имеют простого способа получить 1 из сравнения, так что, скорее всего, это будет условный переход или условная операция формы:
set R1, 0
test R2+0, 0
cinc R1 ; conditional increment
test R2+1, 0
cinc R1
...
Это может хорошо работать для графического процессора, если он может выполнять условные приращения и хорошо работать с элементами размером в октет.
Если бы компилятор проделал отличную работу, на многих процессорах это могло бы выглядеть примерно так:
set R1, 0
test R2+0, 0
jz end ; jump if zero
inc R1
test R2+1, 0
jz end
inc R1
...
Это также может быть приемлемо, если несоблюдение условных переходов не причинит вам большого вреда, с тех пор у вас есть только один последующий условный переход (первый, в котором вы найдете 0).
Поскольку вы сказали, что нацелены на графический процессор, и они, как правило, очень дружелюбны по математике, вы можете сделать:
int acc = 0;
acc += str[0]/str[0];
acc += str[1]/str[1];
...
, если вы можете ловить на деление на ноль без особых затрат и просто справляться с беспорядком из ловушки. Это, вероятно, в конечном итоге будет дорого.
Если на вашем компьютере есть регистры, которые могут содержать более одного октета вашей строки, тогда вы можете попробовать выполнить ограниченное количество переходов и проверить 0 на более чем один байт за раз, а затем проверить последнее ненулевое слово в уровень байтов.
Вы должны проверить Bit Twiddling Hacks для крутого способа ускорить strlen, который хорошо работает для больших размеров регистров.
Что-то еще, что вы можете рассмотреть, - это начать измерение с конца строки (вы знаете максимальную длину). Пока за нулевым завершающим байтом следует большее количество нулей, это будет работать, и если у вас, вероятно, будут более длинные строки, это может быть победой, даже если вы бросите туда прыжок.