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

    +125

    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
    static U64 mulU64byU64(U64 a, U64 b, U64 * high)
    {
        U64 b_high = 0;
        U64 r_high = 0, r_low = 0;
        U64 bit;
    	
        for (bit = 1; bit; bit <<= 1) {
            if (a & bit) {
                if (r_low + b < r_low)
                    r_high++;
                r_low += b;
                r_high += b_high;
            }
            b_high <<= 1;
            b_high |= (b & (1ULL << 63)) >> 63;
            b <<= 1;
        }
    	
        if (high)
            *high = r_high;
        return r_low;
    }

    Угадай зачем %D

    Запостил: Stealth, 09 Августа 2013

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

    • показать все, что скрытоПисал питух, который не осилил матчасть - тут почти все такие, а в реальном мире кол-во анскильных животных переваливает за 99%, которые не способные осилить мануал.

      Как же меня одалевают питушарские 32битные постфиксы и эти ущербанские U64, ибо тупые маздайские питухи, которые даже stdint не осилили. Хотя указатель написал не как животное.

      Хотя да, на 32битном говное нет 64битного умножения.

      Ну и да, вариантик от Царя - накалякал тут:
      typedef struct {
        uint64_t a, b;
      } uint128_t;
      
      uint128_t _mul64(uint64_t a, uint64_t b) {
        uint128_t ret = (uint128_t){ 0, 0 };
        uint64_t bit = 1, b_h = 0; 
        do {
          if(a & bit)
            ret.a += (((ret.b + b) < ret.b) + b_h), ret.b += b;    
        } while(((b_h <<= 1), b_h += (!!(b & (1ul << 63)))), (b <<= 1), (bit <<= 1));
        return ret;
      }


      Код не проверял, даже думать было лень, а особенно понимать как оно работает. Я потерял навыки за 2недели ничегонеделанья.
      Ответить
      • Здравствуйте, Царь.
        Ответить
        • За что минуснул, питушок? Мой код мало того, что в хламину короче - дак он ещё на халяву на 10% быстрее.
          Ответить
      • что такое, царь такой же унылый заедушный питушок, как и все - ходит в отпуск на 14 дней?
        Ответить
        • Ну вообще-то нет - я собирал себе новую машину, потом собирал генту. Бенчил железки и прочее. Ждал жм, вычищал куриный помёт из железа. Попутно со сборкой смотрел пропущенные онямэ за лето, читал, продумывал кое что интересно.

          Ну и я уже писал, а так да - ходил в отпуск, только если бы ты следил за моими постами и онлайном - ты бы понял, что у меня отпуск 24/7.
          Ответить
          • Всем очень интересно, чем ты занимался, спасибо за рассказ. Про онямэ тоже интересно, и про то как ты продумывал кое что интересно. Джва года ждал такого рассказа.
            > если бы ты следил за моими постами и онлайном
            Да тут все только за тобой и следят, делать-то больше нечего...
            Ответить
          • > смотрел пропущенные онямэ за лето
            Я просто оставлю это здесь: http://govnokod.ru/13420#comment188514
            Ответить
            • Ну вообще-то я траллил и это была ирония и сарказм, так-то, ибо был бы ты поболее скиллен - ты бы понял, что "анямэ" анямэхейтер не напишет. Да и вообще только питух не любит анямэ.

              Вы без меня вообще от рук отбились, ну ничего - осенью кончатся каникулы - я вам, питушкам, устрою. Говнокод утонет в говне, когда я возьмусь за свой хасвелл700.
              Ответить
          • >я собирал себе новую машину, потом собирал генту. Бенчил железки и прочее.
            На это ушло 2 недели??? Ололо.
            Ответить
            • Да. Знаешь сколько я искал нормальную память? А сколько я всё чистил, апгрейдил и прочее.

              Ну и да, я тут решил ссд питушков в говно слить. Неделя эксперементов. В конечном итоге я за 500рублей запилил себе 30гигов на чтение/запись, и 20мильёнов иопсов на корень.

              Кеды стартуют за долю секунду без прогрева, хотя они и на харде так же стартовали. Ну и так-то я убивал этот самый корень раз 20-30.

              Но теперь тащит - вайн собирается быстрее, чем у маздайщика маздайка стартует.
              Ответить
            • >> я собирал себе новую машину, потом собирал генту. Бенчил железки и прочее.
              ПРИШЛО ВРЕМЯ ПЕРЕКОНПЕЛИРОВАТЬ ВЕДРО
              ВЕДРО САМО НЕ ПЕРЕКОНПЕЛИРУЕТСЯ
              ПЕРЕКОНПЕЛИРУЙ ЕГО, ПЕРЕКОНПЕЛИРУЙ ЕГО ЕЩЕ РАЗ
              ЗАЧЕМ МНЕ НУЖЕН ШINDOWS, Я СЛИШКОМ ГОРД ЧТОБЫ СТАВИТЬ ЕГО
              ЛУЧШЕ ЕЩЕ РАЗ ПЕРЕКОНПЕЛИРОВАТЬ ВЕДРО
              Я ПЕРЕКОНПЕЛИРУЮ ВЕДРО ПО 7 РАЗ В НЕДЕЛЮ
              КАЖДАЯ КОНПЕЛЯЦИЯ ЗАНИМАЕТ ДВАДЦАДЬ ЧАСОВ
              Я ЖИВУ АКТИВНОЙ И ПОЛНОЦЕННОЙ ЖИЗНЬЮ
              Я УСПЕШЕН И ПОЭТОМУ ЦЕЛЫЙ ДЕНЬ ЕБУСЬ С КОНСОЛЬЮ
              А ПОСЛЕ ЭТОГО ПЕРЕКОНПЕЛИРУЮ ВЕДРО
              ТУПЫЕ СПЕРМОБЛЯДИ ОДЕРЖИМЫ АНАЛЬНОЙ ПРОПРИЕТАРЩИНОЙ
              А Я СВОБОДНЫЙ ОТ БЫДЛОПРОБЛЕМ ЧЕЛОВЕК
              СКОЧАТЬ БЕСПЛАТНО С РЕПОЗИТОРИЯ ЕБИЛДЫ
              ИМЕРДЖ ГЕНТУ-СУРСЕС МЭЙК && МЭЙК МОДУЛС_ИНСТОЛЛ
              ЛУЧШЕ Я ПЕРЕКОНПЕЛИРУЮ ВЕДРО ЕЩЕ РАЗ
              И БУДУ БЕНЧИТЬ ЖЕЛЕЗКИ, СТАБИЛЬНОСТЬ НУЖНА
              Я НЕ КОНПЕЛИРОВАЛ ВЕДРО НЕДЕЛЮ
              ПОЙДУ ПЕРЕКОНПЕЛИРУЮ
              В ПИТУХ ОС ВСЕ ПРОСТО И ПОНЯТНО
              АААА ОШИБКА 12309. ЭТО ЖЕ ОЧЕВИДНО КАК ЕЕ РЕШИТЬ
              ПРИШЛО ВРЕМЯ ПЕРЕКОНПЕЛИРОВАТЬ ВЕДРО
              ККОКОКОКОКОКОКО
              Ответить
              • Пришла и сраку разработала нам
                Чумачечая консоль - сракло попердоль.
                От конфигов схожу я с ума,
                Чумачечая консоль, чумачечая.

                Я ебусь в срачельничек словно чумачечий,
                И смазочкой анальною намажу я срачечий.
                А в линзах отражаются конфиги-конфетки,
                От жженья не могу я усидеть на табуретке.

                Пришла и сраку разработала нам
                Чумачечая консоль - сракло попердоль.
                От конфигов схожу я с ума,
                Чумачечая консоль, чумачечая.

                Чумачечая консоль пришла,
                Срачло нам раз-ра-бо-та-ла.
                Чумачечая консоль пришла,
                Ла-ла-ла-ла-ла-ла-ла-ла-ла.

                Когда срачло я смазал и консольку затолкал,
                Она вошла как паровоз на Киевский вокзал.
                И очень хорошо, что ящик смазки я нашел,
                ПЕРДОЛИКС так хорош, как я не знаю ещё шо.

                Пришла и сраку разработала нам
                Чумачечая консоль - сракло попердоль.
                От конфигов схожу я с ума,
                Чумачечая консоль, чумачечая.

                Чумачечая консоль пришла,
                Срачло нам раз-ра-бо-та-ла.
                Чумачечая консоль пришла,
                Ла-ла-ла-ла-ла-ла-ла-ла-ла.

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

                Пришла и сраку разработала нам
                Чумачечая консоль - очко попердоль.
                От конфигов схожу я с ума,
                Чумачечая консоль, чумачечая.

                Чумачечая консоль пришла,
                Срачло нам раз-ра-бо-та-ла.
                Чумачечая консоль пришла,
                Ла-ла-ла-ла-ла-ла-ла-ла-ла.
                Ответить
              • Голубой петух в консоль пердолится
                И говно он набирает в рот
                Какбе-сервер скоро остановится
                Переконпиляция грядёт!

                Консолька черная —
                Срака просторная!
                В виндовсе нет такой,
                ОЛОЛО ОТСОС!
                Игор на линуксе,
                CAD'ов и визио,
                Нет, да и не нужны —
                Этот снят вопрос!

                Три канала я зачем-то подключил,
                Надо в приложения отдать.
                Маны прочитал, консолечку включил —
                Попердолюсь я сейчас на пять!

                Консолька черная —
                Срака просторная!
                В виндовсе нет такой,
                ОЛОЛО ОТСОС!
                Игор на линуксе,
                CAD'ов и визио,
                Нет, да и не нужны —
                Этот снят вопрос!

                Линуксу служу и не работаю,
                Не такой как все, не спермоблядь!
                Вся проприетарщина — блевотная,
                Буду эту мантру повторять.

                Консолька черная —
                Срака просторная!
                В виндовсе нет такой,
                ОЛОЛО ОТСОС!
                Игор на линуксе,
                CAD'ов и визио,
                Нет, да и не нужны —
                Этот снят вопрос!
                Ответить
                • Месье гомофоб?
                  Ответить
                  • Ты так говоришь, как будто это что-то плохое.
                    Ответить
                    • Как ни странно, да.
                      Ответить
                      • Это ты с сиськами на аватаре? Ну все, щас пиздолизство начнется. Нет, ты толстый жырный тралл! Пездуй отсюда! :D
                        Ответить
                        • > тралл

                          Воины Орды, нас засекли! В атаку! Лок'тар огар!
                          Ответить
                          • Сиски где? Фотка с датой и сиськами.

                            ( . )( . )
                            Ответить
                            • Сколько тебе лет, мальчик? Иди уроки учи.
                              Ответить
                              • Дык, всем известно, что в интернете девушек нет, а обитают только тролли, разводящие на невидимый запах пиздятинки спермотокзикозников.
                                Ответить
                                • И на что тебя, мой юный друг, он^W она^W оно разводит? На плюсик к комменту? Не нужно жить по лурковским порядкам.
                                  Ответить
                              • http://lurkmore.to/There_are_no_girls_on_the_Internet
                                Ответить
                          • Эх... ебаные супермутанты наступают, расчехляй гатлинг-лазер...
                            Ответить
                      • someone 2 часа назад #
                        Месье гомофоб?
                        anonimb84a2f6fd141 2 часа назад # 0
                        Ты так говоришь, как будто это что-то плохое.
                        someone 2 часа назад # 0
                        Как ни странно, да.
                        Люсидфокс, перелогинься.
                        Ответить
                      • А что плохого быть гомофобом? Ну, если, конечно, обьект сам скрытый гей, то гомофобия мешает ему получать анальное удовольствие, а так то пох.
                        Ответить
          • Почему разлогинился? Как теперь твои высеры искать?
            Ответить
      • > Хотя да, на 32битном говное нет 64битного умножения.
        Да даже там, имхо, четыре 32-битных умножения (аля умножение в столбик) и два сложения будут работать быстрее, чем пачка сдвигов. А на 64 битке умножение 64 битных чисел через сдвиги вообще не имеет никакого смысла.

        Поэтому, рискну предположить, что этот код юзается на каком-нибудь микроконтроллере, у которого нет аппаратного блока умножения.
        Ответить
        • Мой код выдаёт: 5.33такта на бит
          Говно ТС"а выдаёт: 9тактов на бит

          В 1.7раза быстрее, ибо я зафейлил - я думал, что
          ret = (uint128_t){(_mul64(a, b).a + ret.a), (_mul64(a, b).b + ret.b)};
          гцц заоптимизирует, а он питух не заоптимизировал - вышел фейл, ибо я код не поглядел.

          Ну да, подумаешь - 9тактов на бит на хассвеле - это всего-то 21.5тактов на бит на 32битах, а это всего-лишь 2к тактов на умножение на какой-то тухлой армке, и то в лучше случае. Сколько там у нас частота у МК без умножения? десятки мегагерц, сотни мегагерц(я даже таких не знаю) - в районе 10копс.

          Умножение, которые выдаёт килоопс от силы - ненужно, и автор питух.

          Да, конечно - попацански.
          Ответить
        • Я всё удивляюсь, банальное переписывание за 10секунд кода из говяного вида в нормальный даёт 2-хкратный прирост производительности. А уж если реально взятся за оптимизицаю - питушки забагетят, но животные реально верят в то, что конпелятор способен их говно собирать и оптимизировать.

          Это так смишно, и заметь - меня минуснули. А ещё меня веселит, когда питушки проверяют указатели. А так же питушки нихрена не могут писать без ветвлений, хотя без них код проще и понятней. И ведь они реально будут доказывать, что "безветвлений не жить", а ведь такие же животные и пишут числодробилки - блювать хочутся.
          Ответить
      • > uint128_t ret = (uint128_t){ 0, 0 };
        Царь, зачем каст?
        Ответить
      • b_h += (!!(b & (1ul << 63))))

        это вместо b_h += 0; ?
        Прикольно, запомню!
        Ответить
        • Нет. Это вместо b_h += b < 0, или, если переписать в совсем понятном виде:
          if (b < 0)
              ++b_h;
          P.S. Или ты про 1ul и UB со сдвигом его на >=32 бита? Емнип в х86_64 линухах (а царь - ценитель х86_64 линухов) long имеет размер 64 бита, поэтому там 1ul вполне катит вместо 1ull, и все норм. А на 32-битных х86, это UB (или ID, не помню точно), а не 0.
          Ответить
          • > P.S. Или ты про 1ul и UB со сдвигом его на >=32 бита?
            Ну да, тонкий намек на очепятку. Хотя смысла ваять супер-пупер-кроссплатформенный код, считая при этом каждый такт я, честно говоря, не вижу (разве "шоб було").
            То же
            high_a = a << 32;
            low_a = a & 0xFFFFFFFF;
            high_b = b <<32;
            low_b = b & 0xFFFFFFFF;
            
            ((high_a*high_b) << 64) + ((high_a * low_b) << 32) + ((low_a * high_b)<<32) + low_a * low_b
            или соотв. код для 16/8 бит будут намного быстрее. А уж
            mul reg64, reg64

            или
            load reg32_lowb
            mul reg32_lowa, 
            mov other_reg, low_result1
            mov other_reg2, high_result1
            load reg32_higha
            mul reg32_lowb; 
            add low_result2,high_result1
            итд

            вообще летать будут.
            Ответить
            • unsigned long num = 1UL<<63;
               printf("num:%d, sizeof(l):%d", num, sizeof(long));
              >gcc test.c -mx32 -std=c99 
              >./a.out
              >num:0, sizeof(l):4

              Ну а потом все это оптимизируется - b_h=0; b_h << =1 -> 0; b_h += (!!(b & 0)) -> b_h += (!!(0)) -> 0.
              Ответить
              • 1ul << 63 на 32битных платформах это UB.

                На интелях и армах, емнип, barrel shifter тупо не юзает лишние биты, и сдвиг на 63 бита эквивалентен сдвигу на 63 & 0x1F = 31 бит. И если будет сдвигать проц - получится 0x80000000. Но если оно вычисляется как константа на этапе компиляции - то будет 0, т.к. у компилятора (по крайней мере gcc) понятия о сдвигах за разрядную сетку совсем другие. Поэтому лучше такую херню со сдвигом на >= числа бит никогда не юзать т.к. результат плохо прогнозируется, и зависит от настроения оптимайзера.

                http://ideone.com/STa6dq
                Ответить
            • Ну там такой код ваяли видимо т.к. производительность не нужна (загрузчик работает редко и недолго). А если производительность не нужна, то писать некроссплатформенный код невыгодно - зря кучу времени только угробишь на бесполезную оптимизацию. Поэтому и юзают такое попахивающее, но работающее везде решение с побитовым умножением.
              Ответить
      • > while(((b_h <<= 1), b_h += (!!(b & (1ul << 63)))), (b <<= 1), (bit <<= 1));

        А чё, в несколько строчек это записать нельзя?
        Ответить
    • Это так-то кусок микроядра Mach и XNU … Это загрузчик, который до сих пор охуительно работает. Есть ли смысл, если все архитектуры одинаковые ;)
      Ответить

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