Сравнение FPC и GPC

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Bohdan
новенький
Сообщения: 87
Зарегистрирован: 11.05.2005 11:31:46
Откуда: Ukraine, Kyiv
Контактная информация:

Сообщение Bohdan »

Жаль мы не знаем что выдало бы Delphi...


Легко!

View->Debug Windows->CPU
или Ctrl+Alt+C

Код
004795F8 40              inc eax
004795F9 C3              ret
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

По ходу дела, GPC понимает LongInt как 64-битное целое, и код генерит соответствующий - для увеличения именно 64-битного числа на единицу.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Sergei I. Gorelkin писал(а):По ходу дела, GPC понимает LongInt как 64-битное целое, и код генерит соответствующий - для увеличения именно 64-битного числа на единицу.

:blink: %eax - это всегда 32-х регистр

если учесть, что incl существует исключительно для того чтобы не было

Код: Выделить всё

addl    $1, (%eax)

и это ОЧЕНЬ БОЛЬШОЙ минус для gpc
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

%eax - 32-битный, но (%eax) означает ячейку памяти, адрес которой находится в регистре. Поэтому то, что генерит GPC:

Код: Выделить всё

       addl    $1, (%eax)
       adcl    $0, 4(%eax)


есть именно инкремент 64-битного числа. Тут inc первой командой использовать нельзя, т.к. она не изменяет флаги, а нам нужно получить флаг переноса и прибавить его к старшей половине числа - что и делается второй командой.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

есть именно инкремент 64-битного числа. Тут inc первой командой использовать нельзя, т.к. она не изменяет флаги, а нам нужно получить флаг переноса и прибавить его к старшей половине числа - что и делается второй командой.


а действительно после замены LongInt на Integer от GPC получаем:

Код: Выделить всё

_p__M4_Test_S0_Test1:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx
        movl    (%edx), %eax
        incl    %eax
        movl    %eax, (%edx)
        leave
        ret
Guest

Сообщение Guest »

все равно фуфлыжный код ......... да же дельфи в котором сомпилято считается далеко не лучшым не сохраняет указатель на стек если нет в этом необходимости ......... а тут зачем-то сохраняется бред полный
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

м/б просто stackframes включено?
bw

Сообщение bw »

А что такое stackframes?

..bw
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Иван Шихалев писал(а):Вообще надо помнить, что:
а) GPC — frontend для GCC. А GCC не может учитывать структуру языка, поскольку ничего о ней не знает.
б) Community & Team у FPC куда активнее…

И все-таки, странно, очень странно смотрится inc() через add… Может у GPC/GCC оптимизация напрочь вырублена?

Вообще-то на пентиумах начиная вроде со второго инструкция add работает быстрее, чем inc, потому что может выполняться параллельно с другими инструкциями, это связано с тем, что inc не меняет флагов CF и ему нужно знать значение флагов перед выполнением, add меняет всё и ему их предыдущее значение не нужно... add "регистр, операнд(например 1)" выполняется на 486м за один такт, "add регистр, память" - за два, "add память, память" - за три... inc ведёт себя так же.... т.о. они аналогичны, за исключением того, что inc хуже распараллеливается внутри процессора
Ответить