Sulphide
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 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 каждый думаю сам в состоянии сделать выводы из всего этого *) | Всего записей: 279 | Зарегистр. 20-03-2008 | Отправлено: 23:49 19-09-2011 | Исправлено: Sulphide, 01:18 20-09-2011 |
|