Инструкция QEMU Branch and Exchange (arm thumb) не вызывается - PullRequest
0 голосов
/ 22 сентября 2018

Итак, я тестирую изменение в имитаторе руки с бэкэндом 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совсем не выстраивается.

Что мне здесь не хватает?Это ошибка?

1 Ответ

0 голосов
/ 25 сентября 2018

0100010000000000 (т. Е. 0b010001 << 10) не является инструкцией Thumb BX, поэтому, если вы передадите ее в декодер, она не пойдет по пути кода для BX.Как говорится в комментарии в коде, insx BX и BLX - 0b0100_0111_xxxx_xxxx.0100010000000000 - это инструкция ADD регистр-регистр. </p>

В этом можно убедиться, посмотрев ARM ARM v7A (DDI0406C.c, доступный по адресу https://developer.arm.com/docs/ddi0406/c/arm-architecture-reference-manual-armv7-a-and-armv7-r-edition) и, в частности, таблицы декодирования в разделе A6.2..

...