Есть спецы по ИЛу?
Интересно, почему компилятор шарпа для такого вот кода:
var x = 1;
if (x > 0)
{
Console.WriteLine(x);
}
генерирует вот такую вот хреновину:
L_0000: nop
L_0001: ldc.i4.1
L_0002: stloc.0
L_0003: ldloc.0
L_0004: ldc.i4.0
L_0005: cgt
L_0007: ldc.i4.0
L_0008: ceq
L_000a: stloc.1
L_000b: ldloc.1
L_000c: brtrue.s L_0017
L_000e: nop
L_000f: ldloc.0
L_0010: call void [mscorlib]System.Console::WriteLine(int32)
L_0015: nop
L_0016: nop
L_0017: ret
Интересует выделенное. Есть ли какая хитрость в этом?
Переписанный вручную пример прекрасно работает:
ldc.i4.1
stloc.0
ldloc.0
ldc.i4.0
cgt
brfalse.s L_0017
ldloc.0
call void [mscorlib]System.Console::WriteLine(int32)
L_0017: ret
Интересно, почему вместо brfalse, используется brtrue, ради чего приходится поднимать в стек дополнительное значение (ceq) и сравнивать с результатами первоначального сравнения (cgt).
Есть какая-то причина не использовать brfalse? Есть паттерн, при котором мой код не будет работать?