История изменений
Исправление
vertexua,
(текущая версия)
:
Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)
fn xor_iter(a:&[u8], b:&[u8]) -> Vec<u8> {
a.iter().zip(b).map(|(av, bv)| av ^ bv).collect()
}
Ссылка
Нажимаем «…» -> Show Assembly
.LBB9_11:
movups (%r13,%rdx), %xmm0
movups 16(%r13,%rdx), %xmm1
movups (%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 16(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, (%rax,%rdx)
movups %xmm0, 16(%rax,%rdx)
movups 32(%r13,%rdx), %xmm0
movups 48(%r13,%rdx), %xmm1
movups 32(%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 48(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, 32(%rax,%rdx)
movups %xmm0, 48(%rax,%rdx)
addq $64, %rdx
addq $2, %rdi
jne .LBB9_11
testq %rsi, %rsi
je .LBB9_14
SSE инструкции и никаких танцев с бубном.
Вишенка на торте, если переделать с u8 на u64 - тот же ассемблер.
Исправление
vertexua,
:
Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)
fn xor_iter(a:&[u8], b:&[u8]) -> Vec<u8> {
a.iter().zip(b).map(|(av, bv)| av ^ bv).collect()
}
Ссылка
Нажимаем «…» -> Show Assembly
.LBB9_11:
movups (%r13,%rdx), %xmm0
movups 16(%r13,%rdx), %xmm1
movups (%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 16(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, (%rax,%rdx)
movups %xmm0, 16(%rax,%rdx)
movups 32(%r13,%rdx), %xmm0
movups 48(%r13,%rdx), %xmm1
movups 32(%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 48(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, 32(%rax,%rdx)
movups %xmm0, 48(%rax,%rdx)
addq $64, %rdx
addq $2, %rdi
jne .LBB9_11
testq %rsi, %rsi
je .LBB9_14
SSE инструкции и никаких танцев с бубном
Исправление
vertexua,
:
Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)
fn xor_iter(a:&[u8], b:&[u8]) -> Vec<u8> {
a.iter().zip(b).map(|(av, bv)| av ^ bv).collect()
}
Ссылка
Нажимаем «…» -> Show Assembly
.LBB9_11:
movups (%r13,%rdx), %xmm0
movups 16(%r13,%rdx), %xmm1
movups (%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 16(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, (%rax,%rdx)
movups %xmm0, 16(%rax,%rdx)
movups 32(%r13,%rdx), %xmm0
movups 48(%r13,%rdx), %xmm1
movups 32(%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 48(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, 32(%rax,%rdx)
movups %xmm0, 48(%rax,%rdx)
addq $64, %rdx
addq $2, %rdi
jne .LBB9_11
testq %rsi, %rsi
je .LBB9_14
И никаких танцев с бубном
Исправление
vertexua,
:
Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)
Нажимаем «…» -> Show Assembly
.LBB9_11:
movups (%r13,%rdx), %xmm0
movups 16(%r13,%rdx), %xmm1
movups (%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 16(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, (%rax,%rdx)
movups %xmm0, 16(%rax,%rdx)
movups 32(%r13,%rdx), %xmm0
movups 48(%r13,%rdx), %xmm1
movups 32(%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 48(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, 32(%rax,%rdx)
movups %xmm0, 48(%rax,%rdx)
addq $64, %rdx
addq $2, %rdi
jne .LBB9_11
testq %rsi, %rsi
je .LBB9_14
И никаких танцев с бубном
Исходная версия
vertexua,
:
Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)
Нажимаем «…» -> Show Assembly
.LBB9_11:
movups (%r13,%rdx), %xmm0
movups 16(%r13,%rdx), %xmm1
movups (%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 16(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, (%rax,%rdx)
movups %xmm0, 16(%rax,%rdx)
movups 32(%r13,%rdx), %xmm0
movups 48(%r13,%rdx), %xmm1
movups 32(%r12,%rdx), %xmm2
xorps %xmm0, %xmm2
movups 48(%r12,%rdx), %xmm0
xorps %xmm1, %xmm0
movups %xmm2, 32(%rax,%rdx)
movups %xmm0, 48(%rax,%rdx)
addq $64, %rdx
addq $2, %rdi
jne .LBB9_11
testq %rsi, %rsi
je .LBB9_14