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

    0

    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
    void decode_chunk(const char* s, uint8_t* out)
    {
        __m128i a = _mm_loadu_si128((const __m128i*)s);
    
        __m128i u = _mm_and_si128(a, _mm_set1_epi8(0x74));
        u = _mm_add_epi8(u, _mm_set1_epi8(0x04));
        u = _mm_srli_epi32(u, 0x03);
        u = _mm_and_si128(u, _mm_set1_epi8(0x0F));
        u = _mm_shuffle_epi8(_mm_set_epi32(0xB9B9B9B9, 0xBFBFBFBF, 0x04041013, 0x00000000), u);
        a = _mm_add_epi8(a, u);
    
        __m128i m1 = _mm_set1_epi32(0xFF00FF00);
        __m128i m2 = _mm_set1_epi32(0xFFFF0000);
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m1, a), 2), _mm_andnot_si128(m1, a));
        a = _mm_or_si128(_mm_srli_epi32(_mm_and_si128(m2, a), 4), _mm_andnot_si128(m2, a));
        a = _mm_shuffle_epi8(a, _mm_set_epi32(0x80808080, 0x00010204, 0x05060809, 0x0A0C0D0E));
    
        _mm_storeu_si128((__m128i*)out, a);
    }

    Байтоёбский парсинг base64 (16 символов → 12 байт).

    По мотивам http://govnokod.ru/12822#comment173404

    Запостил: bormand, 09 Января 2019

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

    • ideone, к сожалению, не может в SSE3 :(
      Ответить
    • Я двинусь, если продолжу разбирать всякие _mm_shuffle_epi8 вручную. Надо изобрести кокококонпелятор из этих инструкций в человекочитаемый код.
      Ответить
      • В человекочитаемый код на J. Как раз векторная хуита.
        Ответить
        • И главное, что как в случае с кодом с SSE-интринсинками (правильно хоть написал это страшное слово?), так и в случае кода на "J" можно не бояться утечки исходников: всё равно никто ничего не поймёт. Даже сам автор спустя несколько недель.
          Ответить
          • вот кстати да: пиши лучше на асемблере сразу
            Ответить
            • У этих инструкций ещё более ёбнутые мнемоники чем названия соответствующих им интринсиков... Там можно ктулху призвать этими vpunpckiddqd.
              Ответить
              • а давай сделаем coffeasm по аналогии с coffescript?
                пусть будет язык с ВНЯТНЫМИ мнемониками который транслируется в асм.

                напишем LSP для него чтобы комплишен был
                Ответить
                • В принципе, в гцц есть attribute vector_size. Но он как-то совсем непредсказуемо работает. То высрет портянку из анролльной копипасты то одну инструкцию. Хотя код почти одинаковый и если что-нибудь переставить иногда в правильные инструкции превращается...
                  Ответить
                  • "coffeasm
                    Что-то мне подсказывать, что кофе надо было пить ни до, ни после, а вместо.
                    Сечёшь, пидар?
                    Ответить
              • > можно ктулху призвать
                Я только за.
                Ответить
          • > никто ничего не поймёт
            Не надо рассуждать о читаемости кода на языке, которого не знаешь.
            Ответить
        • Я только за, может быть, я тогда бы понял хоть что нибудь...
          Ответить
    • Вчера ты сувал пидарасам рыболовные крючки в жпа, а тебе бы свой вынуть.
      Ебанавт.
      Ответить

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