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

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

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

Сообщение Bohdan » 15.11.2005 13:38:32

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


Легко!

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

Код
004795F8 40              inc eax
004795F9 C3              ret
Bohdan
новенький
 
Сообщения: 87
Зарегистрирован: 11.05.2005 11:31:46
Откуда: Ukraine, Kyiv

Сообщение Sergei I. Gorelkin » 15.11.2005 19:20:48

По ходу дела, GPC понимает LongInt как 64-битное целое, и код генерит соответствующий - для увеличения именно 64-битного числа на единицу.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение STAKANOV » 15.11.2005 19:31:32

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

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

если учесть, что incl существует исключительно для того чтобы не было
Код: Выделить всё
addl    $1, (%eax)

и это ОЧЕНЬ БОЛЬШОЙ минус для gpc
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin » 16.11.2005 11:59:01

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

Код: Выделить всё
       addl    $1, (%eax)
       adcl    $0, 4(%eax)


есть именно инкремент 64-битного числа. Тут inc первой командой использовать нельзя, т.к. она не изменяет флаги, а нам нужно получить флаг переноса и прибавить его к старшей половине числа - что и делается второй командой.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение STAKANOV » 16.11.2005 13:54:02

есть именно инкремент 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
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Guest » 18.11.2005 09:25:41

все равно фуфлыжный код ......... да же дельфи в котором сомпилято считается далеко не лучшым не сохраняет указатель на стек если нет в этом необходимости ......... а тут зачем-то сохраняется бред полный
Guest
 

Сообщение pda » 18.11.2005 20:32:12

м/б просто stackframes включено?
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение bw » 23.11.2005 06:15:35

А что такое stackframes?

..bw
bw
 

Сообщение unC0Rr » 02.02.2006 03:54:26

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

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

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

Пред.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru