8. 古典的なテクニック
範囲チェック
unsigned int a, b, x;
if (a <= x && x <= b) { ... }
分岐が2回
cmp x, a
jb #elese
cmp x, b
ja #else
...
次のようにすると分岐は1回
if ((x – a) <= (b – a)) { ... }
後半の文字列で再度登場
8 /24
15. 条件分岐は重たい?
与えられた配列の最大値の取得(cmov vs. jge)
int getMax_C(const int *x, size_t n)
{
int max = x[0];
for (size_t i = 1; i < n; i++) {
if (x[i] > max) max = x[i];
}
return max;
}
// a = max // a = max
cmp(a, ptr [x + n * 4]); cmp(a, ptr [x + n * 4]);
jge(".skip");
// if (a > x[i]) a = x[i] mov(a, ptr [x + n * 4]);
cmovl(a, ptr [x + n * 4]); L(".skip");
15 /24