1. Си / Говнокод #28325

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    unsigned mul(unsigned a, unsigned b)
    {
     char arr[a][b];
     return &arr[a][b] - (char *)arr;
    }

    Умножение через VLA

    Запостил: j123123, 09 Августа 2022

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

    • Кстати, там баг. Вот так правильней
      unsigned mul(unsigned a, unsigned b)
      {
       char arr[a][b];
       return &arr[a-1][b] - (char *)arr;
      }
      Ответить
      • или [a][0]

        Правда, теряюсь в догадках насчет целесообразности (если это не прикол).
        Ответить
      • И снова фейл.

        https://godbolt.org/z/1KhYPK1bc
        Питушарское умножение:
        govno1:                                 # @govno1
                push    rbp
                mov     rbp, rsp
                mov     eax, edi
                mov     ecx, esi
                imul    rcx, rax
                add     rcx, 15
                and     rcx, -16
                mov     rdx, rsp
                sub     rdx, rcx
                mov     rsp, rdx
                lea     eax, [rdi - 1]
                imul    eax, esi
                add     eax, edx
                add     eax, esi
                sub     eax, edx
                mov     rsp, rbp
                pop     rbp
                ret
        govno2:                                 # @govno2
                push    rbp
                mov     rbp, rsp
                mov     ecx, edi
                mov     eax, esi
                imul    rax, rcx
                lea     rcx, [rax + 15]
                and     rcx, -16
                mov     rdx, rsp
                sub     rdx, rcx
                mov     rsp, rdx
                add     eax, edx
                add     eax, esi
                sub     eax, edx
                mov     rsp, rbp
                pop     rbp
                ret




        Код чёткого сишкопацана:
        pacan_mul:                              # @pacan_mul
                mov     eax, edi
                imul    eax, esi
                ret


        Множь, множь, сука. Вот как, блядь, нужно множить, вот, быстро. Быстро Раз-раз! Множь, множь, множь-мно-мно-мнж-ж-множь! Множь! Инты! Множь!
        Давай, работай, чтобы mul был.
        Ответить
        • А вот у gcc все ок:
          https://godbolt.org/z/Knv576o9x

          govno1:
                  mov     eax, edi
                  imul    eax, esi
                  ret
          govno2:
                  lea     eax, [rdi+1]
                  imul    eax, esi
                  ret
          pacan_mul:
                  mov     eax, esi
                  imul    eax, edi
                  ret
          pacan_mul_2:
                  mov     eax, edi
                  imul    eax, esi
                  ret


          Правда, я не знаю, лучше ли 'mov eax, esi' чем 'lea eax, [rdi+1]'
          Ответить
          • В древности LEA работала на другой части процессора, и это позволяло ему быть немного быстрее

            теперь отличие разве что в количестве байт в опкоде
            Ответить
            • lea = трёхоперандная инструкция.
              Перемещение и сложение, иногда ещё умножение на степень двойки.

              А божественный mov уже больше 10 лет как выпиливается элиминатором на этапе переименования регистров и вообще не доходит до портов исполнения.

              LEA выполняется на AGU.
              Ответить
              • > на этапе переименования регистров

                Это значит, начиная с P6 (Pentium Pro, Pentium II), когда внедрили RISC-ядро и микрокоды? Или позже?
                Ответить
                • Нет. Блок mov elimination ввели в sandy bridge.

                  Сначала написал «sandy bridge», а потом стёр, заменив «больше 10 лет как», посчитав что все кому надо и так в курсе.

                  Уже говорил об этом на ГК:
                  https://govnokod.ru/26439#comment528180

                  https://i.stack.imgur.com/Kmmp3.png

                  Чтобы было понятно, там посредине Rename /Mov elimination.

                  Эти инструкции даже не доходят до шедулера (не забивают собой порты и RS).
                  Ответить
                  • Спасибо. Я так глубоко не копал. У меня в «PHP» ничего из этого нет.
                    Ответить
                    • Говорят, скоро ISA процессоров заменят на джаваскрипт

                      на кой хуй нам еще одна лишняя прослойка, не имеющая отношения к реальности?

                      что блядь вообще такое XOR RAX, RAX? Это же как морская свинка : и не морская, и не свинка

                      нету давно никаокго RAX, это чистая абстракция (как в LLVM), и ксор тоже никакого нету
                      Ответить
                    • Именно поэтому я за «PHP».
                      Ответить
                  • Однако же сами переименования регистров (парковачные станции Томасуло и ко) появились в P6?
                    Ответить
                  • PS: забавно, как в очередной раз принятая идиома диктует условия

                    Допустим, я бы каждый раз кричал "эгегегей" перед тем, как пойти в толчок во дворе, чтобы отпугнуть медведя

                    И вот, медведей давно уже нет, а я все равно кричу "эгегегй", потому что производитель унитазов по этой команде включает вентиляцию, потому что начал так делать, когда медлведи еще были
                    Ответить
                    • > И вот, медведей давно уже нет, а я все равно кричу "эгегегй", потому что производитель унитазов по этой команде включает вентиляцию

                      Именно так. Все привыкли, и это стало идиомой.

                      Вот например раньше «Какой багор» было обычным спамом, которым засирали треды.

                      А теперь это общеупотребительное, причём стандартизированное.

                      Гость-линтер даже ворнинги выдаёт когда не по Стандарту — не хватает скобочки или пробела.
                      Ответить
                      • Не хватает про бела и трёх скобочек.
                        Ответить
                      • Подтверждаю. Я дошёл до того, что теперь употребляю «Какой багор )))» в рабочих чатах.
                        Ответить
                        • Какой багор )))

                          А это чисто говнокодовская питушня, или ещё где-то используется?
                          Ответить
                          • В рыбалке.
                            Ответить
                          • Подтверждаю слова ISO: в рыболовецком деле.

                            — Багор, багор тащи, упустим!
                            — Да где ж я тебе возьму багор? Я тебе что волжский матрос что ли?

                            https://yewtu.be/ag-SgljVLw8?t=1500
                            Ответить
                            • The uploader has not made this video available in your country
                              Ответить
                              • Странно. Неужели у кого-то от этого кина до сих пор печёт? Или это yewtu.be не работает?

                                «Сознался обкомовец во всём и помер со страху.... Терпеть не могу обкомовцев, даже мёртвых...»

                                Больше нет на ютубе. Мне выдаёт только ссылки на хостинги говнорашки вроде ok и vk.

                                По ссылке фильм Окраина (1998)
                                Ответить
                                • Знаю разгадку, всё очень просто, это рашисты огородились, чтобы абама не посмотрел увлекательный мусор на совке.
                                  Ответить
                            • > волжский матрос что ли?
                              Какой ты вор? Ты волжский грузчик, а не вор! Ты - олень самый настоящий!
                              Ответить
              • ебать ты Фог:)

                то есть леа можно не делать?
                Ответить
                • LEA это такой олдскульный, целочисленный предшественник FMA 3.
                  Им конечно можно делать MOV, но зачем?

                  Зачем брать грузовик чтобы перенести килограм картошки на 10 метров?
                  Ответить
          • > лучше ли 'mov eax, esi' чем 'lea eax, [rdi+1]'
            Вообще-то там ошибка.
            lea eax, [rdi+1] ; эквивалентно mov eax, esi; inc eax


            Оно умножало (a+1)*b.
            j123123 попытался это починить &arr[a-1][b].

            Но теперь уже обосрался с UB при a=0 происходит взятие за адреса за пределами массива &arr[-1][b]

            Именно поэтому это питушарское говно.
            Ответить
            • Кстати, при '-O1' выхлоп такой (gcc):

              govno1:
                      mov     eax, edi
                      imul    eax, esi
                      ret
              govno2:
                      imul    edi, esi
                      lea     eax, [rdi+rsi]
                      ret
              pacan_mul:
                      mov     eax, esi
                      imul    eax, edi
                      ret
              pacan_mul_2:
                      mov     eax, edi
                      imul    eax, esi
                      ret
              Ответить
              • Гцц не панацея. На ARM64 -O3 он тоже начинает выдавать странную дичь.

                Потому что это UB.

                When two pointers are subtracted, both must point to elements of the same array object or just one past the last element of the array object (C Standard, 6.5. 6 [ISO/IEC 9899:2011]); the result is the difference of the subscripts of the two array elements. Otherwise, the operation is undefined behavior.

                https://godbolt.org/z/v8EP76Pvx
                
                govno1:
                        sub     w0, w0, #1
                        madd    w0, w1, w0, w1
                        ret
                govno2:
                        madd    w0, w1, w0, w1
                        ret
                pacan_mul:
                        mul     w0, w1, w0
                        ret
                pacan_mul_2:
                        mul     w0, w0, w1
                        ret
                Ответить
    • так вот ты какая: арифметика указателей:)

      Кстати, а специфцировал ли лейаут двумреного массива?
      Ответить
      • Специфицирован:

        1. В сишке нету многомерных массивов, в ней есть только array of array (of array etc).

        2. Одномерный массив должен быть совместим с арифметикой указателей. Никаких дыр, размер памяти, занятой массивом, равен сумме размеров его элементов.

        Поэтому этот код работает.

        https://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory
        Ответить
        • Понятно, тогда это просто массив с массивами, лейаут которых проистекает из самого определения массива (даже и не знаю, в каком языке массивы могут быть с дырами: в скриптокале разве что)

          Арифметика должна работать внутри массива, и вроде можно кончиком укозателя вылезти за пределы массива на 1, но нельзя разыменовывать (только сравнивать с другими указателями внутри того же массива)

          зы: использование указательной арифметики для умножения напомнило мне LEA почему-то
          Ответить
          • Ну... как-то одно из другого не следует. Разве не может компилятор сделать sizeof(char[3]) == 4, добавив один байт паддинга до 32-х бит? Вроде это ничему не противоречит, a[4] будет end-ом, внутри массива тоже дырок не будет...
            Ответить
            • > компилятор сделать sizeof(char[3]) == 4, добавив один байт паддинга до 32-х бит

              Это только в структах и питушарских крестах, где всё усложнили своими классами.
              В пацанской Сишке и единственно полезной структуре данных такого нет.
              Ответить
              • > единственно полезной структуре данных
                В общем-то, неявный pack(1) для массивов - недоработка комиссии подкомитета.
                Ответить
            • > добавив один байт паддинга до 32-х бит?
              Зачем? Зачем?

              Паддинг в конце добавляется только если без него у следующего объекта в массиве алаймент по пизде бы пошёл, что в случае, когда у тебя уже массив, невозможно.
              Ответить
              • Вот что Сишный Стандарт говорит. Не знаю как в питушарских крестах (что будет в случае извратов в стиле массив EBO)

                6.5.3.4 The sizeof and alignof operators

                When sizeof is applied to an operand that has type char, unsigned char , or signed char , (or a qualified version thereof) the result is 1.

                When applied to an operand that has array type, the result is the total number of bytes in the array.

                When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding


                Именно поэтому массив — единственно полезная структура данных.
                Ответить
                • > When applied to an operand that has array type, the result is the total number of bytes in the array.
                  Компилятор: ну правильно, у меня в массиве из трех элементов - четыре байта. А будете ворчать - вообще двенадцать сделаю.
                  Ответить
          • В некоторых языках есть динамические массивы. В них хранятся метаданные (текущий размер массива, объём выделенной под него памяти и т. п.). В Delphi и в FPC эта питушня, кажется, хранится по отрицательному смещению, чтобы не мешать арифметике указателей. Многомерных динамических массивов в FPC и в Delphi нет, но можно составить array of array, и как следствие на многомерных динамических уже не будет работать арифметика указателей, потому что каждая строка выделяется отдельно. Но можно создать динамический массив статических массивов, тогда и арифметика указателей будет работать.

            В Кубейсике вроде динамические многомерные есть, но в Кубейсике нету указателей, поэтому там массив имеет право быть чёрным ящиком.

            Разреженные массивы в каком-нибудь ЯП отдельно бывают или в качестве них везде используют хэшмапы?
            Ответить
            • > В Кубейсике вроде динамические многомерные есть

              Там какая-то дикая пирдоль скорби была.
              REDIM вроде их обнулял при растягивании. Нужно было какое-то ключевое слово писать. Кажется Preserve.

              Не знаю что в них "динамического". Это не плюсовый вектор.
              Redim был больше похоже на Сишный реаллок куска памяти.

              А многомерность это по сути сахарок для арифметики индексации.

              Ну есть в сухом остатке Redim = free + calloc.
              Redim Preserve = realloc.
              Ответить
            • В луа можно сделать из таблицы разреженный массив. Там всё таблица, как ты вероятно знаешь. Вроде в пыхокале еще можно.

              В Perl, Ruby, некоторых шеллах (korn, bash) и TCL есть массивы (в питоне это лист), я не знаю, дают ли они гарантию последжовательного расположения в памяти, но вероятно дают, иначе очень трудно было бы гарантировать O(1) при доступе к елементу по индексу (а пользователь этого ждет)


              В комплированных языках такие гарантии про массивы обычно дают
              Ответить
          • > напомнило мне LEA почему-то

            Мне тоже.
            Ответить
    • Уже обсасывали это.
      Ответить
    • Там умножение, вычитание, деление, min, max.

      https://govnokod.ru/26942

      https://yewtu.be/watch?v=csmOuJFOeVw
      Ответить
    • Посылаю немного саркомы
      Всем сотрудникам Ростелекома

      Пидары гнойные стали DNSом для FB отдавать хуйню, и у родственников перестал FB открываться не смотря на VPN.

      Я не могу настроить их ротуер на свой bind, потому что тогда в случае отвала VPS всё станет раком

      Попробую пушить DNS c VPNа или насктриптую смену DNS при поднятии VPN
      ------


      В идеальном мире эти люди должны сидеть, конечно. "Я работал простым наборщиком в газете "Народный Обозреватель"" -- хуёывая отмазка. Но в реальном мире им нихуя не будет.
      Ответить
      • А просто в Гiгетох поставить DNS over HTTPS?

        В снгоме это Use secure DNS toggle.

        У меня так даже без vpn многие сайты одно время работали.
        Ответить
        • Так я хочу на роутере, чтобы не ебаца с отдельной настройкой всех устройств
          Ответить
          • Ну тогда надо ебаца с роутером. А так одна опция.

            Я эту штуку просто сразу включаю, потому что и DNS провы давно засрали.
            Ответить
            • а на какие DNSы он ходит?
              Ответить
              • А там выбирается.

                По дефолту Cloudflare. В хроме естественно гугл и ещё что-то. Но можно и свой поставить.
                UPDATE:
                https://pureinfotech.com/enable-dns-over-https-chrome/
                Turn on the Use secure DNS toggle switch.

                Click the drop-down menu and select one of the available provider, including Google Public DNS, CloudFlare, CleanBrowsing, or Quad9.
                Ответить
        • Кто сейчас с компа в соцсеточках сидит, лол? Тем более в Firefox. Только прыщеглазики?
          Ответить
          • Ну я вот сижу. И что теперь делать будем?
            Ответить
        • > Mozilla has a strong Trusted Recursive Resolver (TRR) policy in place that forbids our partners from collecting personal identifying information.

          чо, правда что ли??)))
          Ответить
        • > We began our rollout by default to Russia and Ukraine Firefox desktop users in March 2022.

          бгг
          Ответить
    • Пока меня не было, на стол прилетели фруктовые мушки, и умерли
      Целое клабище тут, целое поле скорби

      Зачем они так сделали? Кто их убил?
      Ответить
      • Сам виноват, плохую жратву на стол пролил.
        Какого цвета дроздофилки были?
        Ответить
      • И-и, похоронить ведь их надо, как честных христиан!
        Ответить
    • 18 век
      Махнуть 3 раза веером от сердца к животу — "вы мне итересны".

      21 век
      Махнуть 3 раза по 100 водки — "готова трахнуться".
      Ответить

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