if ((x+rhs.x) < rhs.x) x=x-n+rhs.x;
else x+=rhs.x;
компилируется лучше (догадался, что (a+b)<a для беззнаковых — это тест кэрри-флэга, и даже догадался, что последующие операции сложения используют уже посчитанное x+rhs.x), чем if ((x+=rhs.x) < rhs.x) x-=n;
Забавно.Цитата: mnashe от октября 16, 2011, 18:02Со всеми оптимизациями код
В моей программе есть специальная функция от трёх параметров — muldiv. Она такую цепочку как раз и задействует.
x = ((unsigned long long)x*rhs.x) % n;
Цитата: Drundia от октября 16, 2011, 17:36С умножением ещё веселее. Надо получить int64 из int32*int32, а потом найти остаток от деления этого int64 на int32. Нормальный код получить не выходит, а вот добрый дядя Интел всё необходимое предусмотрел.В моей программе есть специальная функция от трёх параметров — muldiv. Она такую цепочку как раз и задействует.
if ((x+=rhs.x) < rhs.x) x-=n;
mov eax, DWORD PTR [edx+4]
add eax, DWORD PTR [ecx+4]
mov DWORD PTR [ecx+4], eax
cmp eax, DWORD PTR [edx+4] ;ересь
jae L2
LVL1:
sub eax, DWORD PTR [ecx]
mov DWORD PTR [ecx+4], eax
L2:
asm (
"mul %[b0]\n\t"
"div %[d0]\n\t"
:[a] "=d" (x) // лучше "=&d"?
:[a0] "a" (x), [b0] "g" (rhs.x), [d0] "g" (n)
);
Цитата: Drundia от октября 14, 2011, 21:32Вот-вот.Цитата: Python от октября 14, 2011, 15:22Ой-ой-ой, таки не факт, обнаружил жуткую ересь!
Не факт.c = a/b; d = a%b;
даётmov eax, DWORD PTR [esp+20]
mov edx, DWORD PTR [esp+16]
mov ecx, edx
cdq
idiv ecx
mov DWORD PTR [esp+24], eax
mov eax, DWORD PTR [esp+20]
mov edx, DWORD PTR [esp+16]
mov ecx, edx
cdq
idiv ecx
mov DWORD PTR [esp+28], edx
Цитата: Python от октября 14, 2011, 15:22Ой-ой-ой, таки не факт, обнаружил жуткую ересь!
Не факт.
c = a/b; d = a%b;
mov eax, DWORD PTR [esp+20]
mov edx, DWORD PTR [esp+16]
mov ecx, edx
cdq
idiv ecx
mov DWORD PTR [esp+24], eax
mov eax, DWORD PTR [esp+20]
mov edx, DWORD PTR [esp+16]
mov ecx, edx
cdq
idiv ecx
mov DWORD PTR [esp+28], edx
ЦитироватьА нынче компиляторы умные пошли. Оптимизируют.Не факт.
Цитата: jvarg от октября 14, 2011, 11:47Тогда лучше было не функции использовать, а goto.
Угу, только это лишние байты, что при тогдашних объемах памяти и быстродействии имело огромное значение.
Цитата: jvarg от октября 14, 2011, 11:47Ну да, передавайте через регистры... Только кто полезные значения из регистров и где сохранять будет? Правильно, в стэке.
Для тогдашних маленьких машин были и компиляторы высокоуровневых языков, однако именно потому для создания практических программ и использовался, в основном, ассемблер, что он позволял сократить объем программы даже на таких мелочах, как передача параметров через стек.
Цитата: mnashe от октября 14, 2011, 14:06А нынче компиляторы умные пошли. Оптимизируют.
И не только объём программы, но и быстродействие.
Цитата: jvarg от октября 14, 2011, 11:47И не только объём программы, но и быстродействие.
Для тогдашних маленьких машин были и компиляторы высокоуровневых языков, однако именно потому для создания практических программ и использовался, в основном, ассемблер, что он позволял сократить объем программы даже на таких мелочах, как передача параметров через стек.
Страница создана за 0.033 сек. Запросов: 21.