Итак, я тестирую изменение в имитаторе руки с бэкэндом QEMU, и мои микробенчмарки не запускаются для инструкции Branch и Exchange.
конкретный кусок, который меня волнует: https://github.com/qemu/qemu/blob/19b599f7664b2ebfd0f405fb79c14dd241557452/target/arm/translate.c#L11748
В любом случае, я решил, что сначала проверю биты вручную
так:
insn = (0b010001 << 10)
будет равняться: 100010000000000
, поэтому, если бы мы нажали оператор switch:
switch (insn >> 12)
, мы получили бы: 4. Пока все хорошо.
Сначала мы проверим if (insn & (1 << 11))
то есть 0, все еще хорошо, мы переходим к следующему условному if (insn & (1 << 10))
возвращает 1024, поэтому мы берем ветвь.Вот тут-то и начинаются проблемы.
мы делаем
op = (insn >> 8) & 3;
switch (op)
код обмена филиалами в случае 3, но (0b100010000000000 >> 8) & 3
будет 0: чтобы было понятнее 0b1000100 & 0b11
совсем не выстраивается.
Что мне здесь не хватает?Это ошибка?