Эта функция сборки (основанная на моем предыдущем посте здесь, но мне пришлось немного изменить концепцию, чтобы заставить ее работать) обрабатывает 3,3 миллиарда входных символов в секунду (6,6 миллиарда выходных символов) на одном ядре Core 2 Конроу 3Ghz. Пенрин, наверное, быстрее.
%include "x86inc.asm"
SECTION_RODATA
pb_f0: times 16 db 0xf0
pb_0f: times 16 db 0x0f
pb_hex: db 48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70
SECTION .text
; int convert_string_to_hex( char *input, char *output, int len )
cglobal _convert_string_to_hex,3,3
movdqa xmm6, [pb_f0 GLOBAL]
movdqa xmm7, [pb_0f GLOBAL]
.loop:
movdqa xmm5, [pb_hex GLOBAL]
movdqa xmm4, [pb_hex GLOBAL]
movq xmm0, [r0+r2-8]
movq xmm2, [r0+r2-16]
movq xmm1, xmm0
movq xmm3, xmm2
pand xmm0, xmm6 ;high bits
pand xmm2, xmm6
psrlq xmm0, 4
psrlq xmm2, 4
pand xmm1, xmm7 ;low bits
pand xmm3, xmm7
punpcklbw xmm0, xmm1
punpcklbw xmm2, xmm3
pshufb xmm4, xmm0
pshufb xmm5, xmm2
movdqa [r1+r2*2-16], xmm4
movdqa [r1+r2*2-32], xmm5
sub r2, 16
jg .loop
REP_RET
Обратите внимание, что он использует синтаксис ассемблера x264, что делает его более переносимым (по сравнению с 32-битным по сравнению с 64-битным и т. Д.). Преобразовать это в выбранный вами синтаксис тривиально: r0, r1, r2 - это три аргумента для функций в регистрах. Это немного похоже на псевдокод. Или вы можете просто получить файл common / x86 / x86inc.asm из дерева x264 и включить его для собственного запуска.
P.S. Переполнение стека, я не прав, чтобы тратить время на такую банальную вещь? Или это круто?