LINUX.ORG.RU

История изменений

Исправление vertexua, (текущая версия) :

Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)

fn xor_iter(a:&[u8], b:&[u8]) -> Vec<u8> {
    a.iter().zip(b).map(|(av, bv)| av ^ bv).collect()
}

Ссылка

https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=74c5c9432e9adf2982f9dc022f125061

Нажимаем «…» -> 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()
}

Ссылка

https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=74c5c9432e9adf2982f9dc022f125061

Нажимаем «…» -> 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()
}

Ссылка

https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=74c5c9432e9adf2982f9dc022f125061

Нажимаем «…» -> 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, :

Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)

https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=74c5c9432e9adf2982f9dc022f125061

Нажимаем «…» -> 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, :

Го - современный язык, там такой фигней уже не заморачиваются. Вот побайтовый код (в Го, уверен то же самое)

https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=74c5c9432e9adf2982f9dc022f125061

Нажимаем «…» -> 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