Няшная / Говнокод #28325 Ссылка на оригинал

0

  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 j123123, (Updated )

Комментарии (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), и ксор тоже никакого нету
                    Ответить
                • Однако же сами переименования регистров (парковачные станции Томасуло и ко) появились в P6?
                  Ответить
                • PS: забавно, как в очередной раз принятая идиома диктует условия

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

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

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

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

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

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

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

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

                          https://yewtu.be/ag-SgljVLw8?t=1500
                          Ответить
                            • Странно. Неужели у кого-то от этого кина до сих пор печёт? Или это 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) при доступе к елементу по индексу (а пользователь этого ждет)


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

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

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

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


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

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

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

          Я эту штуку просто сразу включаю, потому что и 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 водки — "готова трахнуться".
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8