Главная идея простая:
пусть есть
if (a < b)
{
x = f(1);
}
else
{
x = f(2);
}
это можно заменить так:
f1 = f(1);
f2 = f(2);
mask = (a < b) * 0xFFFFFFFF;/// это просто упрощенный пример, что бы вернуть или 0 или 0xFFFFFFFF
//тогда
x = (mask & f1) | (~mask & f2);
Если f1 и f2 вычисляются быстро, то получаем выгоду за счет конвейерной архитектуры процессора. Так как условный переход у нас исчезает. Но если f - тяжелая функция, то скорее всего будет намного быстрее проверить иф и посчитать только один из вариантов.
Правда чаще всего такое делал работая с SSE2.