Автор: Sulphide
Дата сообщения: 19.09.2011 22:49
Frodo_Torbins А в реальном приложении могут быть такие же подставы, причем найти их будет в разы сложнее и никто от этого не застрахован, особенно если будет много вложенных вызовов процедур и функций + треды + вложенные циклы. И это явный баг компилятора, если уж 3 сравниваемых нормально справились с этим примером. Вот кстати дизасм, можно сравнить как FP делает все очень элегантно и как тупо в лоб компилирует дельфи (само тело цикла):
FreePascal: минимум записей в память, минимум преобразований, синус считается красиво, переменная цикла находится в регистре
.text:00000001000016A8 loc_1000016A8:
.text:00000001000016A8 inc eax
.text:00000001000016AA cvtsi2sd xmm1, eax
.text:00000001000016AE movsd xmm0, qword ptr [rbp-10h]
.text:00000001000016B3 divsd xmm0, cs:qword_10002E3B0
.text:00000001000016BB addsd xmm0, xmm1
.text:00000001000016BF movsd xmm8, xmm0
.text:00000001000016C4 movsd xmm0, xmm8
.text:00000001000016C9 mulsd xmm0, cs:qword_10002E3B8
.text:00000001000016D1 mulsd xmm0, xmm0
.text:00000001000016D5 movsd qword ptr [rbp-88h], xmm0
.text:00000001000016DD fld qword ptr [rbp-88h]
.text:00000001000016E3 fsin
.text:00000001000016E5 fstp qword ptr [rbp-88h]
.text:00000001000016EB movsd xmm0, qword ptr [rbp-88h]
.text:00000001000016F3 movsd xmm9, xmm0
.text:00000001000016F8 cmp eax, 0F4240h
.text:00000001000016FD jl short loc_1000016A8
теперь тоже самое дельфи:
.text:00000000004101D9 loc_4101D9:
.text:00000000004101D9 cvtsi2sd xmm0, cs:qword_418CE8
.text:00000000004101E2 movsd xmm1, cs:qword_418CF0
.text:00000000004101EA divsd xmm1, cs:qword_4102C8
.text:00000000004101F2 addsd xmm0, xmm1
.text:00000000004101F6 movsd cs:qword_418CD8, xmm0 ; эта и следующая строка - ну просто шедевр оптимизации
.text:00000000004101FE movsd xmm0, cs:qword_418CD8
.text:0000000000410206 mulsd xmm0, cs:qword_4102D0
.text:000000000041020E movapd xmm1, xmm0
.text:0000000000410212 mulsd xmm1, xmm0
.text:0000000000410216 movapd xmm0, xmm1
.text:000000000041021A call sub_405E50 ;процедура расчета синуса на sse2 ну просто нереально гиганская
.text:000000000041021F movsd cs:qword_418CE0, xmm0
.text:0000000000410227 add cs:qword_418CE8, 1 ;цикловая переменная в памяти
.text:000000000041022F cmp cs:qword_418CE8, 0F4241h
.text:000000000041023A jnz short loc_4101D9
каждый думаю сам в состоянии сделать выводы из всего этого *)