Ну, так как кажется, что нет хорошего способа предсказать ошибку страницы, я пошел другим путем. Это прямое решение:
.DATA
ALIGN 16
shuf_inside byte 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0
byte 2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1
byte 3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2
byte 4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3
byte 5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4
byte 6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5
byte 7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6
byte 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7
byte 9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8
byte 10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9
byte 11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10
byte 12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11
byte 13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12
byte 14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13
byte 15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
.CODE
[...]
lea rax, [ shuf_inside ]
shl r11, 4
pshufb xmm2, [ rax + r11 - 16 ]
shr r11, 4
pextrw rax, xmm0, 6 ;reducedStrideWithPadding - i.e. size of item
sub rax, r11 ;bytes_to_write
;
test rax, 8
jz lessThan8
movq qword ptr [r10], xmm2
psrldq xmm2, 8
add r10, 8
lessThan8:
test rax, 4
jz lessThan4
movd dword ptr [r10], xmm2
psrldq xmm2, 4
add r10, 4
lessThan4:
test rax, 2
jz lessThan2
pextrw word ptr [r10], xmm2, 0
psrldq xmm2, 2
add r10, 2
lessThan2:
test rax, 1
jz lessThan1
pextrb byte ptr [r10], xmm2, 0
lessThan1: