From 03fd9e070af06d2789cd754391c55d449414fe59 Mon Sep 17 00:00:00 2001 From: Weixie Cui Date: Wed, 4 Feb 2026 12:02:19 +0800 Subject: [PATCH] crypto/keccak: asm version of keccakF1600 on arm64 --- crypto/keccak/keccakf.go | 2 +- crypto/keccak/keccakf_arm64.go | 10 + crypto/keccak/keccakf_arm64.s | 5177 ++++++++++++++++++++++++++++++++ 3 files changed, 5188 insertions(+), 1 deletion(-) create mode 100644 crypto/keccak/keccakf_arm64.go create mode 100644 crypto/keccak/keccakf_arm64.s diff --git a/crypto/keccak/keccakf.go b/crypto/keccak/keccakf.go index 82694fa4a3..b66d7cfb9b 100644 --- a/crypto/keccak/keccakf.go +++ b/crypto/keccak/keccakf.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !amd64 || purego || !gc +//go:build (!amd64 && !arm64) || purego || !gc package keccak diff --git a/crypto/keccak/keccakf_arm64.go b/crypto/keccak/keccakf_arm64.go new file mode 100644 index 0000000000..b9a5c3a1c2 --- /dev/null +++ b/crypto/keccak/keccakf_arm64.go @@ -0,0 +1,10 @@ +// Copyright 2026 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego && arm64 + +package keccak + +//go:noescape +func keccakF1600(a *[25]uint64) diff --git a/crypto/keccak/keccakf_arm64.s b/crypto/keccak/keccakf_arm64.s new file mode 100644 index 0000000000..0cf9bc72ab --- /dev/null +++ b/crypto/keccak/keccakf_arm64.s @@ -0,0 +1,5177 @@ +// Copyright 2026 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego && arm64 + +#include "textflag.h" + +// Code generated by go run gen_arm64_asm.go. DO NOT EDIT. + +// Fully unrolled keccakF1600 for ARM64 +// func keccakF1600(a *[25]uint64) +TEXT ·keccakF1600(SB), NOSPLIT, $0-8 + MOVD a+0(FP), R0 + + + // ========== ROUND 0 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000000000001, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 1 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000000008082, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 2 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x800000000000808a, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 3 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000080008000, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + // ========== ROUND 4 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x000000000000808b, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 5 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000080000001, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 6 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000080008081, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 7 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000008009, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + // ========== ROUND 8 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x000000000000008a, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 9 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000000000088, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 10 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000080008009, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 11 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x000000008000000a, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + // ========== ROUND 12 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x000000008000808b, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 13 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x800000000000008b, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 14 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000008089, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 15 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000008003, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + // ========== ROUND 16 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000008002, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 17 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000000080, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 18 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x000000000000800a, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 19 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x800000008000000a, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + // ========== ROUND 20 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 48(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 96(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 144(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 192(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000080008081, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 48(R0) + MOVD R20, 96(R0) + MOVD R21, 144(R0) + MOVD R22, 192(R0) + // Group 1 + MOVD 80(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 128(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 176(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 24(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 128(R0) + MOVD R20, 176(R0) + MOVD R21, 24(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 160(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 8(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 56(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 152(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 8(R0) + MOVD R20, 56(R0) + MOVD R21, 104(R0) + MOVD R22, 152(R0) + // Group 3 + MOVD 40(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 88(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 184(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 32(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 88(R0) + MOVD R20, 136(R0) + MOVD R21, 184(R0) + MOVD R22, 32(R0) + // Group 4 + MOVD 120(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 16(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 64(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 112(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 168(R0) + MOVD R20, 16(R0) + MOVD R21, 64(R0) + MOVD R22, 112(R0) + + // ========== ROUND 21 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 128(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 56(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 184(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 112(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000000008080, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 128(R0) + MOVD R20, 56(R0) + MOVD R21, 184(R0) + MOVD R22, 112(R0) + // Group 1 + MOVD 160(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 88(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 16(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 144(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 88(R0) + MOVD R20, 16(R0) + MOVD R21, 144(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 120(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 48(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 176(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 32(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 48(R0) + MOVD R20, 176(R0) + MOVD R21, 104(R0) + MOVD R22, 32(R0) + // Group 3 + MOVD 80(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 8(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 64(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 192(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 8(R0) + MOVD R20, 136(R0) + MOVD R21, 64(R0) + MOVD R22, 192(R0) + // Group 4 + MOVD 40(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 96(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 24(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 152(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 168(R0) + MOVD R20, 96(R0) + MOVD R21, 24(R0) + MOVD R22, 152(R0) + + // ========== ROUND 22 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 88(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 176(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 64(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 152(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x0000000080000001, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 88(R0) + MOVD R20, 176(R0) + MOVD R21, 64(R0) + MOVD R22, 152(R0) + // Group 1 + MOVD 120(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 8(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 96(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 184(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 8(R0) + MOVD R20, 96(R0) + MOVD R21, 184(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 40(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 128(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 16(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 192(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 128(R0) + MOVD R20, 16(R0) + MOVD R21, 104(R0) + MOVD R22, 192(R0) + // Group 3 + MOVD 160(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 48(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 24(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 112(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 48(R0) + MOVD R20, 136(R0) + MOVD R21, 24(R0) + MOVD R22, 112(R0) + // Group 4 + MOVD 80(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 56(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 144(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 32(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 168(R0) + MOVD R20, 56(R0) + MOVD R21, 144(R0) + MOVD R22, 32(R0) + + // ========== ROUND 23 ========== + // Theta + MOVD 0(R0), R1 + MOVD 40(R0), R16 + EOR R16, R1, R1 + MOVD 80(R0), R16 + EOR R16, R1, R1 + MOVD 120(R0), R16 + EOR R16, R1, R1 + MOVD 160(R0), R16 + EOR R16, R1, R1 + MOVD 8(R0), R2 + MOVD 48(R0), R16 + EOR R16, R2, R2 + MOVD 88(R0), R16 + EOR R16, R2, R2 + MOVD 128(R0), R16 + EOR R16, R2, R2 + MOVD 168(R0), R16 + EOR R16, R2, R2 + MOVD 16(R0), R3 + MOVD 56(R0), R16 + EOR R16, R3, R3 + MOVD 96(R0), R16 + EOR R16, R3, R3 + MOVD 136(R0), R16 + EOR R16, R3, R3 + MOVD 176(R0), R16 + EOR R16, R3, R3 + MOVD 24(R0), R4 + MOVD 64(R0), R16 + EOR R16, R4, R4 + MOVD 104(R0), R16 + EOR R16, R4, R4 + MOVD 144(R0), R16 + EOR R16, R4, R4 + MOVD 184(R0), R16 + EOR R16, R4, R4 + MOVD 32(R0), R5 + MOVD 72(R0), R16 + EOR R16, R5, R5 + MOVD 112(R0), R16 + EOR R16, R5, R5 + MOVD 152(R0), R16 + EOR R16, R5, R5 + MOVD 192(R0), R16 + EOR R16, R5, R5 + // D values + ROR $63, R2, R6 + EOR R5, R6, R6 + ROR $63, R3, R7 + EOR R1, R7, R7 + ROR $63, R4, R8 + EOR R2, R8, R8 + ROR $63, R5, R9 + EOR R3, R9, R9 + ROR $63, R1, R10 + EOR R4, R10, R10 + // Group 0 + MOVD 0(R0), R11 + EOR R6, R11, R11 + MOVD 8(R0), R12 + EOR R7, R12, R12 + ROR $20, R12, R12 + MOVD 16(R0), R13 + EOR R8, R13, R13 + ROR $21, R13, R13 + MOVD 24(R0), R14 + EOR R9, R14, R14 + ROR $43, R14, R14 + MOVD 32(R0), R15 + EOR R10, R15, R15 + ROR $50, R15, R15 + BIC R12, R13, R17 + EOR R11, R17, R17 + MOVD $0x8000000080008008, R2 + EOR R2, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 0(R0) + MOVD R19, 8(R0) + MOVD R20, 16(R0) + MOVD R21, 24(R0) + MOVD R22, 32(R0) + // Group 1 + MOVD 40(R0), R13 + EOR R6, R13, R13 + ROR $61, R13, R13 + MOVD 48(R0), R14 + EOR R7, R14, R14 + ROR $19, R14, R14 + MOVD 56(R0), R15 + EOR R8, R15, R15 + ROR $3, R15, R15 + MOVD 64(R0), R11 + EOR R9, R11, R11 + ROR $36, R11, R11 + MOVD 72(R0), R12 + EOR R10, R12, R12 + ROR $44, R12, R12 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 40(R0) + MOVD R19, 48(R0) + MOVD R20, 56(R0) + MOVD R21, 64(R0) + MOVD R22, 72(R0) + // Group 2 + MOVD 80(R0), R15 + EOR R6, R15, R15 + ROR $46, R15, R15 + MOVD 88(R0), R11 + EOR R7, R11, R11 + ROR $63, R11, R11 + MOVD 96(R0), R12 + EOR R8, R12, R12 + ROR $58, R12, R12 + MOVD 104(R0), R13 + EOR R9, R13, R13 + ROR $39, R13, R13 + MOVD 112(R0), R14 + EOR R10, R14, R14 + ROR $56, R14, R14 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 80(R0) + MOVD R19, 88(R0) + MOVD R20, 96(R0) + MOVD R21, 104(R0) + MOVD R22, 112(R0) + // Group 3 + MOVD 120(R0), R12 + EOR R6, R12, R12 + ROR $28, R12, R12 + MOVD 128(R0), R13 + EOR R7, R13, R13 + ROR $54, R13, R13 + MOVD 136(R0), R14 + EOR R8, R14, R14 + ROR $49, R14, R14 + MOVD 144(R0), R15 + EOR R9, R15, R15 + ROR $8, R15, R15 + MOVD 152(R0), R11 + EOR R10, R11, R11 + ROR $37, R11, R11 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 120(R0) + MOVD R19, 128(R0) + MOVD R20, 136(R0) + MOVD R21, 144(R0) + MOVD R22, 152(R0) + // Group 4 + MOVD 160(R0), R14 + EOR R6, R14, R14 + ROR $23, R14, R14 + MOVD 168(R0), R15 + EOR R7, R15, R15 + ROR $62, R15, R15 + MOVD 176(R0), R11 + EOR R8, R11, R11 + ROR $2, R11, R11 + MOVD 184(R0), R12 + EOR R9, R12, R12 + ROR $9, R12, R12 + MOVD 192(R0), R13 + EOR R10, R13, R13 + ROR $25, R13, R13 + BIC R12, R13, R17 + EOR R11, R17, R17 + BIC R13, R14, R19 + EOR R12, R19, R19 + BIC R14, R15, R20 + EOR R13, R20, R20 + BIC R15, R11, R21 + EOR R14, R21, R21 + BIC R11, R12, R22 + EOR R15, R22, R22 + MOVD R17, 160(R0) + MOVD R19, 168(R0) + MOVD R20, 176(R0) + MOVD R21, 184(R0) + MOVD R22, 192(R0) + + RET