;Подготовительные и поясняющее действия
vmovdqu ymm0,bytes(1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2); ;Первое слагаемое, по цифре в байте
vmovdqu ymm1,bytes(8,9,2,4,6,8,2,4,7,1,6,9,3,5,1,5,9,1,4,7,6,2,3,7,1,2,9,3,1,8,2,7); ;Второе слагаемое, по цифре в байте
vpaddq ymm0,ymm0,ymm1 ;Сложение без распространения переносов
vpaddq ymm0,ymm0,qwords(0x76F6F6F6F6F6F6F6,0x76F6F6F6F6F6F6F6,0x76F6F6F6F6F6F6F6,0x76F6F6F6F6F6F6F6) ;Распространение переносов внутри каждого qword
vmovdqu ymm7,qwords(0x7FFFFFFFFFFFFFFF,0x7FFFFFFFFFFFFFFF,0x7FFFFFFFFFFFFFFF,0x0000000000000000) ;Для сравнения на "все девятки" в qword и маска выделения переносов, ноль здесь в младшем qword
;Учёт внутренних переносов между qwords Порты L/T
vpcmpeqq ymm1,ymm0,ymm7 ;15 1/0.5 проверим на распространение переноса (все 9)
vptest ymm1,ymm1 ;0+5 2/1 нужно ли распространение переноса хоть где-то
jnz .carry ;06 1/0.5 если нужно распространение, то уйдём и будем считать медленно и аккуратно
vpsrlq ymm1,ymm0,63 ;0 1/1 все 4 переноса в младшем бите каждого qword (в нормальном порядке 3210)
vpermq ymm1,ymm1,10010011b ;5 3/1 переставим их в правильные qwords (т.е. сдвинем влево по кругу на 64 бита, в порядок 2103)
vpand ymm2,ymm7,ymm1 ;015 1/0.33 обнулим перенос в младшем qword (т.е. из старшего qword)
vpaddq ymm0,ymm0,ymm2 ;15 1/0.5 учтём все внутренние переносы
vpandn ymm1,ymm7,ymm1 ;015 1/0.33 выделим старший перенос в младшем бите регистра для передачи дальше
; 015 15 0 1 5 6 Порты
; 2 2 2 0 2 1 Такты