1. C++ / Говнокод #19340

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    #define EncryptAES256(sched) \
    		"pxor (%["#sched"]), %%xmm0 \n" \
    		"aesenc	16(%["#sched"]), %%xmm0 \n" \
    		"aesenc	32(%["#sched"]), %%xmm0 \n" \
    		"aesenc	48(%["#sched"]), %%xmm0 \n" \
    		"aesenc	64(%["#sched"]), %%xmm0 \n" \
    		"aesenc	80(%["#sched"]), %%xmm0 \n" \
    		"aesenc	96(%["#sched"]), %%xmm0 \n" \
    		"aesenc	112(%["#sched"]), %%xmm0 \n" \
    		"aesenc	128(%["#sched"]), %%xmm0 \n" \
    		"aesenc	144(%["#sched"]), %%xmm0 \n" \
    		"aesenc	160(%["#sched"]), %%xmm0 \n" \
    		"aesenc	176(%["#sched"]), %%xmm0 \n" \
    		"aesenc	192(%["#sched"]), %%xmm0 \n" \
    		"aesenc	208(%["#sched"]), %%xmm0 \n" \
    		"aesenclast	224(%["#sched"]), %%xmm0 \n"
    		
    	void ECBEncryptionAESNI::Encrypt (const ChipherBlock * in, ChipherBlock * out)
    	{
    		__asm__
    		(
    			"movups	(%[in]), %%xmm0 \n"
    			EncryptAES256(sched)
    			"movups	%%xmm0, (%[out]) \n"	
    			: : [sched]"r"(GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0", "memory"
    		);
    	}

    https://github.com/PurpleI2P/i2pd/blob/openssl/Crypto.cpp принципиально новый подход - определять дефайном какое-то макроговно, чтобы потом его использовать внутри асмовставок

    Запостил: j123123, 22 Января 2016

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

    • Дык оно там 100500 раз используется потом. Не копипастить же всё это говно. А делать голые функции и инлайнить их гцц не умеет. (Или умеет?)

      P.S. Но, с другой стороны, этот кусок кода достаточно большой, чтобы нивелировать оверхед от вызова функции...
      Ответить
      • Я считаю что это лучше выносить в ассемблер (NASM например), использовать там для макросов макросредства самого ассемблера и потом линковаться, чем разводить такую срань
        Ответить
        • Мейби. Правда ECBEncryptionAESNI::Encrypt ты хуй экспортнёшь из ассемблера, придётся всё-таки сишную функцию сделать ;)
          Ответить
          • Надо просто сделать необходимый манглинг, чтоб компилятор это распознал как ECBEncryptionAESNI::Encrypt. И вообще это плюсопроблемы
            Ответить
            • > И вообще это плюсопроблемы
              Ну да. У плюсов нету ABI :(

              > просто
              Просто.
              Ответить
              • Ну да, наверняка для этого есть уже чьи-то готовые костыли, надо только найти их
                и вообще, можно попробовать через асмовставки определять макросы (там жеж GNU Assembler) и использовать их в других асмовставках
                Ответить
      • К тому же препроцессор ассемблера обычно более функциональный, чем сишный
        Ответить
    • Ещё, по идее, можно было всё это интринсиками записать.
      Ответить
    • гавно для ДЦП все эти дифайны
      Ответить

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