1. Assembler / Говнокод #25228

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    /*
    x86-64 clang (trunk) -O3
    https://godbolt.org/z/t8NDGG
    
    #include <inttypes.h>
    
    uint32_t saturation_add(uint32_t a, uint32_t b)
    {
        const uint64_t tmp = (uint64_t)a + b;
        if (tmp > UINT32_MAX)
        {
            return UINT32_MAX;
        }
        return tmp;
    }
    */
    
    saturation_add:
            mov     edx, esi
            mov     eax, edi
            add     edi, esi
            add     rax, rdx
            mov     edx, 4294967295
            cmp     rax, rdx
            mov     eax, -1   // ЗАЧЕМ???
            cmovbe  eax, edi
            ret

    https://en.wikipedia.org/wiki/Saturation_arithmetic
    Почему компиляторы до сих пор такое говно

    Запостил: j123123, 26 Декабря 2018

    Комментарии (94) RSS

    • Небольшое пояснение. Вот код который выдает clang (то, что запостил я в самом говнокоде, выдает GCC)
      saturation_add:                         # @saturation_add
              mov     eax, edi
              mov     ecx, esi
              add     rcx, rax
              mov     eax, 4294967295
              cmp     rcx, rax
              mov     eax, -1
              cmovb   eax, ecx
              ret

      Тут это лучше видно. Вот у нас в eax пишется число 4294967295. В 16-ричной системе это 0xFFFFFFFF т.е. одни единицы. "-1", который clang пишет в eax - в дополнительном коде это тоже одни единицы 0xFFFFFFFF. Инструкция cmp нихрена не может испортить, она НЕ МОЖЕТ ПОМЕНЯТЬ ВАМ EAX РЕГИСТР БЛЯДЬ!
      Ответить
      • > лучше видно
        Ну clang хоть джва раза складывать не стал...

        Как-то так?
        mov eax, edi
        add eax, esi
        cmovc eax, -1
        ret
        Ответить
        • Нет, у тебя ошибка в коде.
          Ответить
          • Где именно?
            Ответить
            • add eax, esi
              Ответить
              • Хотя не, все вроде правильно, двигаем при флаге переполнения...
                Ответить
              • А в чем тут проблема?

                З.Ы. Ошибка действительно есть - cmov с константой почему-то не бывает.
                Ответить
                • А в "PDP-11" любая инструкция бывает с любым набором аргументов. Именно поэтому я за "PDP-11".
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • > нельзя иногда память-память хуячить, можо тока через регистр

                      MOVS
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • В 8080 вообще мало что было, это даже не x86
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • https://en.wikipedia.org/wiki/X86_instruction_listings#Original_8086/8088_instructions


                              Тут есть.

                              MOVSB Move byte from string to string
                              MOVSW Move word from string to string

                              Набор инструкций в 8088 и 8086 тот же
                              Ответить
                            • Не было MOVSX/MOVZX –— копирование с расширением нуля/знака.

                              А j123123, насколько я понимаю, имел в виду MOVSB/MOVSW.
                              Ответить
                      • Ещё нужно запоминать, откуда и куда оно копирует.

                        Даже Борманд сходу не вспомнит, какие регистры используются в SCAS.
                        Ответить
                        • из SI/ESI/RSI (source index) в DI/EDI/RDI (destination index)
                          Еще у SI есть 8-битный кусок SIL, и у DI есть 8-битный кусок DIL

                          https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-Purpose_Registers_(GPR)_-_16-bit_naming_conventions


                          У регистров RAX есть еще всякие говнокусочки, т.е. у 64-битного RAX есть младший 32-битный кусок EAX, у которого есть младший 16-битный кусок AX, у которого есть старший 8-битный кусок AH и младший 8-битный кусок AL.

                          …нелегко с Кощеем сладить: смерть его на конце иглы, та игла в яйце, то яйцо в утке, та утка в зайце, тот заяц в сундуке, а сундук стоит на высоком дубу, и то дерево Кощей как свой глаз бережёт.
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • > Во-первых, SIL и DIL используются только в «длинном» 64-битном режиме.

                              Это я знаю.

                              > Во-вторых, тут используются смещения в памяти, на которые указывают SI/ESI/RSI и DI/EDI/RDI, а они 8-битными не бывают (восьмибитные адреса бывают только у инструкции JMP и у условных переходов).

                              Ну зато так можно поменять 8-битный кусок от этих регистров.


                              Но вообще интересно, а зачем это вообще надо? С чего вдруг там в AMD решили сделать 8-битные кусочки для этой хрени в 64-битном режиме? Зачем вообще это говно делать с дроблением больших регистров на меньшие?
                              Ответить
        • https://godbolt.org/z/XjyvTr

          #include <inttypes.h>
          #include <stdbool.h>
          
          uint32_t saturation_add(uint32_t a, uint32_t b)
          {
              uint32_t out;
              if (__builtin_add_overflow(a,b,&out))
              {
                  return UINT32_MAX;
              }
              return out;
          }


          saturation_add:                         # @saturation_add
                  add     edi, esi
                  mov     eax, -1
                  cmovae  eax, edi
                  ret


          Так-то
          Ответить
          • > add edi, esi
            Хех, ну значит я конвеншен забыл. Показалось, что их нельзя портить.
            Ответить
          • А вариант без ветвлений
            uint32_t saturation_add(uint32_t a, uint32_t b)
            {
                uint32_t out;
                int overflow = __builtin_add_overflow(a,b,&out);
                out = ( ((uint32_t)(overflow) - 1) & out ) | (uint32_t)(-overflow);
                return out;
            }


            В GCC оптимизируется как-то неочень https://godbolt.org/z/xvDGaS
            saturation_add:
                    add     edi, esi
                    setc    sil
                    movzx   esi, sil
                    lea     eax, [rsi-1]
                    neg     esi
                    and     eax, edi
                    or      eax, esi
                    ret



            Clang же генерит аналогично тому, что с __builtin_add_overflow в if() :
            saturation_add:                         # @saturation_add
                    add     edi, esi
                    mov     eax, -1
                    cmovae  eax, edi
                    ret
            Ответить
            • > пайплайн так лучше работает
              Маловероятно, все инструкции друг на друга завязаны, переставлять или параллелить нечего (разве что 5 и 6 строки).
              Ответить
      • Есть еще такой вариант:
        uint32_t saturation_add(uint32_t a, uint32_t b)
        {
            uint32_t out = a + b;
            if (out < a)
            {
                return UINT32_MAX;
            }
            return out;
        }



        и оба компилятора эту хрень нормально компилят в
        saturation_add:
                add     edi, esi
                mov     eax, -1
                cmovnc  eax, edi
                ret


        saturation_add:                         # @saturation_add
                add     edi, esi
                mov     eax, -1
                cmovae  eax, edi
                ret


        cmovae и cmovnc это та же самая хрень. Т.е. компиляторы тупо "обучены", что вот если мы два unsigned числа одинаковой разрядности складываем в третье с такой же разрядностью, а потом результат сравниваем с одним из складываемых чисел, то это то же самое, что и флаг переноса.

        А если мы два 32-битных складываем в 64-битное, и потом это 64-битное проверяем, чтобы оно было не больше чем максимальное 32-битное - компиляторы тут обсираются, притом все (и clang, и gcc, и icc, и всякие вижуалстудии).
        Ответить
        • Ну дык костыли и изолента. Никакого ИИ в конпеляторах нет, только набор паттернов для популярных приёмов...
          Ответить
    • Еще один зарепорченный мной баг в GCC подтвержден.
      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88603
      Bug 88603 - optimization missed for saturation arithmetic add
      Ответить
      • Был бы ученым, гордился бы новым открытием, а тут какой-то всратый баговаген.
        Ответить
        • > гордился бы новым открытием

          Сразу видно ушлёпка, который сам ни разу наукой не занимался.
          Ваше мнение очень важно для нас.
          Ответить
          • Ясно. Мнение софтваре девелоперов вообще мало, где ценится.
            Ответить
            • > мало, где

              Запятая не нужна, умник.

              Практически весь основной инструментарий в математике был придуман ради решения практических задач, в основном физических. Разумеется, сейчас полно чистой математики, о которой люди знают гораздо меньше, чем о работе даже самых заедушных анскиллябр.
              Ответить
              • Всё так и было. А почему ты выбрал кодинг, а не те науки, где твой мозг бы создать что-то действительно крутое?
                Ответить
                • Потому что я пришёл в "академию" студентом из любви к математике, посмотрел на то, что они делают, и решил, что ворочать байтиками гораздо интереснее, и платят разработчикам гораздо больше. А если пишешь на каком-нибудь Haskell, то сочетать любовь к математике с программированием довольно просто, да ещё и практической пользы на порядки больше, чем от решения задачек Эрдёша.
                  Ответить
                  • Понятно, это круто. А сейчас по работе приходится писать на Haskell? Или в основном для своих проектов?
                    Ответить
                    • В основном для своих. Использование в качестве профессионального инструмента на рассмотрении.
                      Ответить
                  • А я люблю загружать по указателю на указатель на указатель на подпрограмму указатель на указатель на подпрограмму, которая декрементит указатель на указатель на указатель на указатель на подпрограмму, и помещает по этому адресу первый указатель на указатель на указатель на подпрограмму, потом устанавливает этот указатель на указатель на указатель на подпрограмму адресом другой цепочки указателей на указатель на подпрограмму, а потом разбираться, где я ошибся.
                    Ответить
                    • Но ведь указатели ТОРМОЗЯТ процессор!
                      Ответить
                      • Именно поэтому я за нативный код. Но преимущества у такой ебли с указателями в том, что этот код можно копулировать и мутировать в секции запрещённой для исполнения.
                        Ответить
                    • Хочу генератор вореций в таком стиле.

                      Чтоб на входе было нормальное предложение, а на выходе - указатель на указатель и указателем указатель.

                      >>>  pp_vorec('Использование в качестве профессионального инструмента на рассмотрении.')
                      "Использование указателя на указатель на подпрограмму
                      в качестве профессионального указателя на указатель
                      на инструмент на указатель на указатель на подпрограмму
                      на рассмотрении указателя на цепочку указателей на подпрограмму."
                      Ответить
                      • Надо оцифровать мой моск. Благо у петухов он небольшой.
                        Ответить
                      • Мы работаем над этим:

                        Да ведь указатели своими симбирской при проигрыше должен был девять человек детей. Все же бить жидов. Поневоле пойдешь в указатель— чем чаще прихлебывал я могу: несчастный француз. Было указателем! Обоих российских орденов кавалер! А там что для меня в указатель стремянному савельичу. Смотреть на указатель шириною и меня, в указатель; в указатель. Савельич я и рябая указатели, и после нескольких сильных выражений в указатель, деревне, где его свычаи и свой уроков. Предложил мне что прикажете день я высокого указатели произнес над ним несколько уроков, указатели ни откладывать их неопытность. Указатели, родила дочь, то, а зурин. Меня на указатель как будто у указателя. Зурин. Пригласил меня по-французски, по-немецки и с указателем в указатель полк записан указатели своими милостями что мусье. Как бы указатели ж отправляют меня заячий тулуп, а сверху лисью шубу. Я остановился в указатель басурмана, как будто и нужно было указателем. Тем время бопре очень здраво судить о свойствах борзого кобеля. В географии, указатели швырнул календарь, на указатель и начал мы. Отужинали у указателя я могу несчастный француз было савельичу указатели богу ворчал он было из своих указатели, как уже я отказался по указателю час положил перед собою на указатель дорожная указатели; уложили в. указатель на указатели швырнул календарь, не выпускал уж из указатели на указателем. Барин не в указатель, с указатели, и сказала он, поглядел на указатель выписана указатели еще. Мною так чтоб только не поедет. Чему чаще прихлебывал я стало и чтение это время указатели вошел в указатель, увидел я отказался по указателю пашпорт подать мне, играл на указатель кое-как болтать по-русски любил и с указателем.
                        Ответить
                        • Используется инновационный кобенный олгоритм с применением трёх марковских цепей: для основ слов, для окончаний (здесь используются триграммы) и для пунктуации. Конечный результат указателефицируется специальным натальным олгоритмом, который ещё надо дорабатывать. Завтра насру тестовой версией.

                          P.S. Бопре, очень понимая значение это указатели на указатели на указатели старалась засунуть несчастную книгу как бы указатели как будто и указатели.
                          Ответить
                          • Подскажи, пожалуйста, литературу(или видео какое) для ознакомления с цепями Маркова.
                            Ответить
                            • Если интересует практическая сторона дела, то где-то тут http://govnokod.ru/16567#comment247654.
                              Ещё можно походить по ссылкам с https://github.com/1024--/voretions.

                              Это не теория, но, читая код Инкануса, можно начинать погружаться в прекрасный мир цепей Маркова и прочих вореционных автоматов.

                              В его генераторе неравные дробные вероятности заменены выбором из целого числа дублирующихся вариантов, что с вореационной точки зрения интересно.

                              А вопрос литературы о теории остаётся открытым.
                              Ответить
                              • Спасибо, внимательно изучу ветку и репозиторий.
                                Было бы еще интересно выслушать чей-то опыт изучения data science и machine learnng в прошедшие полгода: что читали, как учили и чем закрепляли.
                                Если у кого-то из посетителей сайта был такой опыт - отзовитесь, пожалуйста!
                                Ответить
                            • Сам литературу не читал, Википедию только. Однако с практической точки зрения (не углубляясь в матан), цепь Маркова — крайне простой объект. Это чёрный ящик, на вход которому мы подаём N последовательно идущих элементов (это могут быть слова, слоги, отдельные символы — разницы особой нет), а на выходе получаем список элементов, которые встречаются в исходной последовательности после данных — и вероятности, с которыми они встречаются.
                              Один из самых простых (но при этом очень изящный) способов реализации вореционного генератора на марковской цепи предложил Инканус: мы просто сохраняем словарь вида {исходный элемент: [список всех встречающихся за исходным элементов]}, а во время генерации просто берём слог, получаем список последующих слогов, выбираем из них случайный — и используемый полученный элемент для повторения процiдурки. Пример: пусть есть последовательность [A, B, A, C A]. Преобразуем её в цепь Маркова-Инкануса, получим словарь: {A: [B, C], B: [A], C: [A]}. Теперь, подав на вход слово A, мы получим список [B, C] — и можем выбрать из них любое слово. Слова B и C дают нам просто A.
                              Ответить
                              • Возможно, модель будет более аккуратной, если добавить веса. В данном примере [A, B] и [A, C] встречаются с равной вероятностью, поэтому во взвешенной модели словарь будет таким:
                                {
                                A: [{next: B, weight: 0.5}, {next: C, weight: 0.5}],
                                B: [{next: A, weight: 1}],
                                C: [{next: A, weight: 1}]
                                }


                                Реализацию алгоритма для улучшенной модели оставим читателю в качестве домашнего задания.
                                Ответить
                                • Так она и будет взвешенной благодаря тому, что новые элементы добавляются в список безусловно. Если, к примеру, B после A будет встречаться три раза, а C — один, то и вероятность выбора B будет в три раза выше вероятности выбора C. Ваш, маэстро, алгоритм, между прочим!
                                  Ответить
                            • показать все, что скрытоВдруг вдали у реки
                              Засверкали штыки -
                              Это были марковкие цепи.
                              Ответить
                          • Это же прекрасно, ворестро! Бис, ворестро!
                            Ответить
                            • Не уподобляйся этим ебанашкам. Твоё будущее намного просторней: вписки-хуиски, групповой секс и анальная любовь.
                              Ответить
                              • Эх, доктор. К белому халату очень идёт надраенный до блеска карманный генератор вореций, позволяющий металлическим голосом вливать в уши пациентов лучшую психозу на диком Западе. Может, кобенём на брудершафт, а?
                                Ответить
                                • Доктор? Кто здесь доктор?
                                  Ответить
                                  • Какой доктор? Это секретная информация.
                                    Ответить
                                    • >секретная информация.
                                      Ольха, ольха, я сосна. Передаю шифровку:
                                      ко-ко-ко—ко—ко—ко-ко-ко!
                                      Ответить
                            • Высрал целый репозиторий для нового генератора: http://govnokod.ru/25280.
                              Ответить
              • >Практически весь основной инструментарий в математике был придуман ради решения практических задач
                Неверно. Так, преобразования Лоренца были придуманы как абстрактная хуйня за 20 лет до их использования в СТО. В общем случае, физики используют наработки математиков, придуманные за неопределенное время до них, и придуманные как вещь в себе, без каких-либо идей для практического использования.
                Более того, практикам и инженерам тоже вполне неплохо без всей этой абстрактной хуйни. Пифагорейская тройка (3,4,5) была использована египтянами задолго до самого Пифагора и его теоремы, Да Винчи строил квадратуру круга подручными средствами задолго до того как была доказана невозможность ее построения с помощью циркуля и линейки.
                Ответить
                • Фундамент современной математики заложен такими товарищами, как Ньютон, Эйлер, Лагранж, Лаплас, и т.п., которые решали кучу практических проблем, связанных, в частности, с механикой. Математика для них была инструментом понимания реальности, а не только вещью в себе. Понятно, что некоторым по фану было и теорию чисел поглубже ковырнуть, примерно как Борманду по фану шифрование на макроподстановках запилить, в этом ничего зазорного нет.
                  Ответить
                  • Тут есть противоречие: если мы математику придумывать как средство понимания реальности, то это означало бы что мы имеем представление о том что абстрактный математический аппарат описывает эту реальность еще до того как этот аппарат придуман.
                    Замечу, что несмотря на то что я описал выше, ощутимая часть математики была формализована именно из интуитивных представлений о ней или же интуитивно понятного геометрического или физического смысла какой-то математической сущности, но обращаю внимание именно на случайную взаимосвязь между математикой и прикладным миром через каких-то людей или явления.
                    Ответить
                    • Можно поспорить с Романом о том, все ли математики рассматривали математику как инструмент для понимания реальности, а также уточнить, о какой реальности идёт речь, и как эта реальность соотносится с нашей.

                      > мы имеем представление о том что абстрактный математический аппарат описывает эту реальность еще до того как этот аппарат придуман.
                      Честно говоря, мы имеем такие представления касательно неоткрытых физических законов. По представлениям учёных, есть какой-то набор теорий, который как-то описывает реальность, но он пока ещё не открыт.
                      Аналогично с математическим аппаратом: его ещё нет, но уже есть те, кто верит, что он что-то описывает :)
                      Ответить
                      • Хорошо, давай порассуждаем о чем-то простом, например, законе тяготения Ньютона.
                        Наблюдаем ли мы его в жизни? Да. Можем ли мы формализовать его? Да. Есть ли у нас математические формулы? Да.
                        Так почему мы не можем решить задачу трех тел?
                        https://en.wikipedia.org/wiki/Three-body_problem
                        Вот и получается, что представление о том, что этот закон как-то описывает реальность есть, представление о том что мат. аппаратом этого закона мы описать систему тел действующих по этому закону можем, но в итоге все равно выходит какая-то хуйня.
                        Ответить
                        • > какая-то хуйня
                          Да все там норм. Формулы общего решения хороши только когда они простые и можно интуитивно заметить, что вот эта хуйня пропорциональна экспоненте другой хуйни, сделать какие-то выводы.

                          А для более сложных кейсов общее решение бесполезно, даже если оно есть, имхо.

                          Зато полезны таблицы и графики, а с ними никаких проблем в данной задаче нет.
                          Ответить
                          • >А для более сложных кейсов общее решение бесполезно, даже если оно есть, имхо.
                            Это конечно замечательно, но мы говорим о математике, где нет общего решения = проблема не решена.
                            Инженерам-то похуй, но это только подтверждает мою первоначальную позицию о том, что связь математики и ее практических применений случайна.
                            Ответить
                            • Доказал, что решение нельзя записать в общем виде - проблема тоже решена.
                              Ответить
                              • Что-то не припоминаю таких проблем. Приведешь пример?
                                Ответить
                                • Про уравнения пятой степени и выше, к примеру.
                                  Ответить
                                  • Так а кто же доказал, что они неразрешимы? Теорема Абеля-Руффини доказывает только неразрешимость в радикалах, и бог с ними. Есть другие способы найти решение частных случаев, а значит, можно вывести и общее решение. Просто пока не вывели.
                                    Ответить
                                    • Т.е. может найтись такая нёх, через которую их таки можно выразить? Ок, не подумал.
                                      Ответить
                                  • Представляю мировой общественности решение гей-таблицей: перебираем все кобенации из 5 неубывающих алгебраических чисел, кладём коэффициенты \product_i (x - x_i) в хэш-табличку coeffs ⇒ {x_i}, при запросе корней конкретного уравнения делаем лукап.
                                    Ответить
                                    • Можно решить через https://en.wikipedia.org/wiki/Zeno_machine которая перебирает бесконечные вореции решений на конечное время, а если зависает то просто самоликвидируется в астрале по истечении заданного времени
                                      Ответить
                            • В математике общие решения вполне себе находятся.
                              В математике не гнушаются пользоваться числами, которых в реальности нет (иррациональные числа и прочее), формулами, которых в реальности нет (разложение через бесконечные ряды).

                              Можно записать дифференциальные законы, бесконечные ряды и решить задачу хоть 100500 тел, имея бесконечное время и машину Тьюринга. В теории это будет точное решение (на бесконечности погрешность исчезнет), на практике - приблизительные численные расчёты, моделирования разные.
                              Ответить
                              • > В математике не гнушаются пользоваться числами, которых в реальности нет

                                В реальности нет вообще никаких чисел. Числа это способ описать количество, вес или иную характеристику чего-либо, но самих чисел в реальности нет.
                                Ответить
                              • Это не будет точным решением, поскольку оно не будет аналитическим.
                                Ответить
                              • > пользоваться числами, которых в реальности нет

                                См. также: «Нестандартный анализ»
                                Ответить
                      • Кмк, математики без интересных жизненных задач ведут себя как программисты ядра без нового железа: они будут пилить новые системы контроля версий, поддерживать 2048 ядер, чистить вилкой рейс-кондишены и т.п., но по-настоящему у них загорятся глаза только когда им потребуется написать драйвер для новой блестящей железки, которая стоит у них на столе.
                        Ответить
                        • Недавно был у тебя в гостях и заметил на книжной полке резиновый фаллос. Зачем он тебе, если не секрет?
                          Ответить
                          • Ты кроме фаллосов вокруг себя ничего не замечаешь?)
                            Ответить
                  • а из современных? покойный Александр Гротендик?
                    Ответить
                    • Кстати, только что прочитал о Гротендике: «Он уже тогда хотел стать математиком, но преподаватель математического анализа Сула сказал ему, что математика уже практически завершённая наука, а последние великие открытия в ней сделал Анри Лебег».

                      Такие дела.
                      Ответить
                      • ага, а Сула в итоге обосрался, потому что Гротендик стал отцом алгебраической геометрии.
                        Ответить
                    • > а из современных?

                      Есть очень много применений, питающих и развивающих теорию.

                      Теория динамических систем, теория управления, теория массового обслуживания, теории расписаний, Теория игр (Нэш, фон Нойман, слышали таких?), etc.

                      Есть математики, которые помогают обкуренным физикам с их 11 измерениями М-теории (пространства Калаби-Яу, вот это всё). Есть смузихлёбы, доказывающие что-то о блок-чейнах. Есть отделы математиков при прикладных институтах, которые пытаются придумать эффективные вычислительные схемы для разных физических применений.

                      Даже если взять что-нибудь мега-абстрактное — алгебраическую топологию и теорию гомотопий, к примеру. Воеводин, мир его праху, сделал значительный вклад, пытаясь приспособить аппарат к разработке компьютерного языка для автоматизации док-в (см. Homotopy Type Theory).
                      Ответить
          • Наука занималась им.
            Ответить
          • Может, и правда работает человек в научном институте, каждый день гордится новым открытием. Шпроты в столовой учёным открывает.
            Ответить

    Добавить комментарий