Я использую компилятор vbcc для перевода моего кода C в Motorola 68000 ASM.
По какой-то причине каждый раз, когда я использую в коде деление (просто целое, а не с плавающей запятой), компилятор вставляет в вывод ASM только следующую заглушку (которая генерируется при каждой перекомпиляции):
public __ldivs
jsr __ldivs
Я явно искал все варианты DIVS/DIVU, но каждый раз находил только эту заглушку выше. Сам код работает (я отлаживал его на целевом устройстве), поэтому в окончательном коде есть инструкция DIV, а не промежуточный вывод.
Поскольку это самая дорогая инструкция, и она находится во внутреннем цикле, мне действительно нужно поэкспериментировать с настройкой кода, чтобы добиться максимальной производительности.
Однако я не могу этого сделать, если не вижу результирующий код ASM. Любые идеи, как включить его? В руководстве по компилятору ничего подобного не указано, поэтому явно должен быть какой-то другой - возможно, общий - высший принцип в игре?
DIV
из соображений производительности, черт возьми. Проверьте параметры; возможно, это какой-то общий код 680x0 (у 68020+ был полный набор целочисленного деления, IIRC, так что это может просто связать соответствующую библиотеку) - person too honest for this site   schedule 29.09.2015l
в__ldivs
, кажется, означаетlong
,s
вместоsigned
. Каким-то образом компилятор убежден, что 16-битной версии недостаточно. Одна из возможностей состоит в том, что-32768/-1
переполняетdivs
, но стандарт C требует вернуть 32768, поэтому компилятор решает отказаться отdivs
. - person user3528438   schedule 30.09.2015/
расширяет оба операнда как минимум доint
/unsigned int
, как того требует стандарт C. Так что похоже, что VBCC не удалось оптимизировать его до более узких типов. - person user3528438   schedule 01.10.2015