Я и мой ёбаный кот на фоне ковра. Войти !bnw Сегодня Клубы
Привет, TbI — HRWKA! 1235.3 пользователей не могут ошибаться!
?6907
прекрасное6424
говно5887
говнорашка5512
хуита4695
anime3056
linux2645
music2620
bnw2588
рашка2560
log2337
ололо2113
pic1812
дунч1734
сталирасты1488
украина1437
быдло1434
bnw_ppl1370
дыбр1237
гімно1158

А чо, норм.
http://gcc.godbolt.org/

#0520FR (4) / @ninesigns / 3795 дней назад

Проверял GCC на предмет того, как он умеет рекурсию оптимизировать.
Вот такая штука

unsigned int plus(unsigned int a, unsigned int b)
{
  if (b == 0) return a;
  return plus (a+1, b-1);
}

Относительно успешно сворачивается сложение. Получается такая шняга:

movl %edi, %eax
addl %esi, %eax
ret

Хотя в идеале можно было бы обойтись

leal (%rsi,%rdi), %eax
ret

Что касается умножения, там ситуация более печальная

inline unsigned long int product_0(const unsigned int a, const unsigned int b, const unsigned long int tmp)
{
  if (b == 0) return tmp;
  return product_0(a, b-1, tmp+a);
}

unsigned long int product(const unsigned int a, const unsigned int b)
{
  return product_0(a, b, 0);
}

В ассемблере получается такая фигня

product:
.LFB34:
.cfi_startproc
    xorl %eax, %eax
    testl %esi, %esi
    je .L7
    leal -1(%rsi), %eax
    mov %edi, %edi
    addq $1, %rax
    imulq %rdi, %rax
.L7:
    rep
    ret
.cfi_endproc

Тут оно зачем-то зануляет значение регистра, в котором хранится возврашемое из функции значение и сравнивает с нулем значение регистра, в котором в функцию передается число. Если ноль то прыгаем в конец функции, возвращая 0. Тогда внезапно появляется смысл в этом rep ret http://repzret.org/p/repzret/

Why? Because “The processor is unable to apply a branch prediction to the single-byte near-return form (opcode C3h) of the ret instruction.” Thus, “Use of a two-byte near-return can improve performance”, because it is not affected by this shortcoming.

Ну а дальше через leal из регистра rsi число копируется в eax, уменьшаясь при этом на 1 (нахрена?) и потом из регистра edi двигается в edi (НАХРЕНА??), увеличиваем rax на 1 через addq (ну тут понятно зачем, перед этим ведь оно было непонятно зачем уменьшено на 1, но нахрена уменьшать и потом увеличивать? И вообще, для увеличения на 1 лучше incq использовать) ну и в итоге компилятор таки вставляет инструкцию imulq. Распознать умножение в этой рекурсивной хрени компилятор смог, но при этом как-то через жопу все, нагенерировал кучу говна всякого. Можно было намного проще сделать

movl %esi, %eax
imull %edi, %eax

gcc version 4.5.1 если что

#3BR06J (1+1) / @j123123 / 3846 дней назад

А вот и gcc:4.7 стабилизировали, пришло время для использования emplace.

#R7WZDF (1) / @o01eg / 3853 дня назад

http://gcc.1065356.n5.nabble.com/Ways-to-fill-the-stack-td912561.html#none
Если через запятую объявлять члены массива из char в C и откомпилить это в GCC, оно это запишет как куча mov-ов по байтику
sztfg - я

#SG2QH2 (6) / @j123123 / 3945 дней назад
gcc ?

Как узнать, что gcc пытается прилинковать, когда ты не дёргаешь -nostdlib?

#NJGOFG (8) / @l29ah / 3947 дней назад

Обожаю ебучее GCC. Такой горы недореализованных фишечек, от которых где-нибудь что-нибудь ломается, ещё поискать.
Сказать, что сборка i686->amd64 кросскомпилера сломана - значит ничего не сказать.
Выключи это, отогни то, руками попатч это. И молись сотоне чтобы это говно не умерло через час сборки.
И ведь всё это давно везде зарепорчено, в мейллистах километровые дискуссии, но всем похуй. А может быть просто лень окунаться в говно чтобы починить.

#NFYB93 (2+1) / @stiletto / 4007 дней назад
Это ок ставить __attribute__ ((weak)) на заглушки, которые будут оверлоаднуты не-заглушками?
#X9FZVU (1) / @lexszero / 4410 дней назад
Набор статей на тему реализации модели памяти C++11 в gcc. http://gcc.gnu.org/wiki/Atomic/GCCMM
#2GADLN (0) / @ninesigns / 4432 дня назад
Есть такой быдлокод: http://paste.pocoo.org/show/530725/ Скастовал на него gcc -m32 -O0, дизасмлю и вижу, что после вызова printf стоит тупо ноп и выход из main, даже goto проебалось, алсо вызов f() делает call по адресу куска вычисления code_size, хуй знает почему - т.е. все тупо зацикливается. Попробовал тот же быдлокод скормить шлангу - получил _code_start = 0x01 и соответственно сегфолт. От исходной асмовставки не нашел даже нопа. ЧЯДНТ ЧЯДНТ
#FDXE9Q (0+1) / @lexszero / 4491 день назад
"Nevertheless, what is present is useful, and a far sight better than nothing at all." --- GCC Internals про pass manager Вся суть прыщесофта.
#J8GC7G (0+1) / @lexszero / 4503 дня назад
[06:04:42]<LexsZero> я нашел в gcc встроенный обфускатор [06:06:24]<LexsZero> а, не, это не совсем обфускатор [06:06:30]<LexsZero> просто транслятор в говноязычок [06:07:25]<LexsZero> но выглядит как плод группового секса бейсика, сишки и асма [06:07:43]<LexsZero> -fdump-tree-gimple - отличная говнофича
#OQCUDA (0+1) / @lexszero / 4503 дня назад
CC fs/9p/vfs_file.o fs/9p/vfs_file.c:313:1: внутренняя ошибка компилятора: Ошибка сегментирования
#FLE7N9 (0+1) / @l29ah / 4657 дней назад
брыкинг нюз: штилетта пилил гцц: http://gcc.gnu.org/viewcvs/branches/bnw-simple-branch/
#527UNF (0) / @hate-engine / 4678 дней назад
-fomit-frame-pointer очень важный ключ компиляции: уменьшает жор рамы в разы, мешает отладке. в убунте выключен, убунтоёбы соснули
#K85CBT (3) / @hate-engine / 4765 дней назад
гоцеце делает по два-три дубликата конструктора: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3187 а самое дебильное что баге уже почти 10 сука лет и всем похуй
#QKFBAX (0) / @hate-engine / 4771 день назад
в этом ссаном мире есть хоть один обмудок который целиком понимает архитектуру gcc?
#BUGA35 (8+1) / @stiletto / 4785 дней назад
Сишкоблядуйк, скажи, что делает эта поебень? devc->hw_channels = devc->hw_channels = oss_audio_set_channels (devc->hw_dev, devc->hw_channels); и нет, это не опечатка
#G1UH98 (6) / @stiletto / 4879 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.