О том и речь. Делимое-то тоже целочисленное. Всё целочисленное: и операция деления, и делимое, и делитель, и частное. Но есть нюанс.
Для понимания сути происходящего пришлось погрузиться в чтение исходников Lua. Пересказывать всю цепочку поисков слишком долго. Поэтому кратко изложу принципы. Сначала ищем по всем файлам фрагмент "idiv", затем сопоставляем, что откуда вызывается, а для завершения картины запрашиваем построение ассемблерного листинга нужных файлов с использованием опций из makefile.
В сухом остатке имеем:
Есть две разные операции целочисленного деления: для целых и для дробных чисел, как бы странно это не звучало.
Операция целочисленного деления реализована гораздо более сложным кодом, нежели деление дробных чисел.
Целочисленное деление дробных чисел:
# lobject.c:81: case LUA_OPIDIV: return luai_numidiv(L, v1, v2);
vdivsd %xmm1, %xmm0, %xmm0 # v2, v1, tmp101
vroundsd $9, %xmm0, %xmm0, %xmm0 #, tmp101, <retval>
ret
Целочисленное деление целых чисел:
# lobject.c:60: case LUA_OPIDIV: return luaV_idiv(L, v1, v2);
movq %rcx, %rdx # v2,
movq %rax, %rsi # v1,
jmp luaV_idiv #
...
luaV_idiv:
leaq 1(%rdx), %rax
movq %rdx, %rcx
cmpq $1, %rax
jbe .L350
movq %rsi, %rax
cqto
idivq %rcx
xorq %rsi, %rcx
js .L351
ret
...
Часть кода вырезана, там обрабатываются проверки деления на ноль и работы с отрицательными числами. Но и в этом куске кода почти все операции выполняют эти самые проверки.
Необходимыми же операциями являются лишь idivq, да ret. Возможно, там нужны ещё какие-то операции перемещения из регистра в регистр, но они быстрые в сравнении с названными выше.
Влияют. Тем не менее я рискну предположить, что на чистом Си без вспомогательных проверок целочисленное деление выполнится быстрее нежели дробное. Даже с SSE-оптимизациями. Возможно, кто-то проверит.