defined(__ARM_ARCH_5TEJ__) || defined(__ARM_ARCH_6__) || \
defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_6T2__) || \
defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \
defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
.macro scrypt_shuffle
add lr, r0,
ldmia r0, {r2-r7}
ldmia lr, {r2, r8-r12, lr}
str r3, [r0,
str r5, [r0,
str r6, [r0,
str r7, [r0,
ldr r5, [r0,
str r2, [r0,
str r8, [r0,
strd r4, [r0,
str r9, [r0,
str r10, [r0,
str r11, [r0,
str lr, [r0,
add r2, r0,
add lr, r0,
ldmia r2, {r2-r7}
ldmia lr, {r2, r8-r12, lr}
str r3, [r0,
str r5, [r0,
str r6, [r0,
str r7, [r0,
ldr r5, [r0,
str r2, [r0,
str r8, [r0,
strd r4, [r0,
str r9, [r0,
str r10, [r0,
str r11, [r0,
str lr, [r0,
.endm
.macro salsa8_core_doubleround_body
add r6, r2, r6
add r7, r3, r7
eor r10, r10, r6, ror
add r6, r0, r4
eor r11, r11, r7, ror
add r7, r1, r5
strd r10, [sp,
eor r12, r12, r6, ror
eor lr, lr, r7, ror
ldrd r6, [sp,
add r2, r10, r2
add r3, r11, r3
eor r6, r6, r2, ror
add r2, r12, r0
eor r7, r7, r3, ror
add r3, lr, r1
strd r6, [sp,
eor r8, r8, r2, ror
eor r9, r9, r3, ror
ldrd r2, [sp,
add r10, r6, r10
add r11, r7, r11
eor r2, r2, r10, ror
add r10, r8, r12
eor r3, r3, r11, ror
add r11, r9, lr
eor r4, r4, r10, ror
eor r5, r5, r11, ror
ldrd r10, [sp,
add r6, r2, r6
add r7, r3, r7
eor r10, r10, r6, ror
add r6, r4, r8
eor r11, r11, r7, ror
add r7, r5, r9
eor r0, r0, r6, ror
eor r1, r1, r7, ror
ldrd r6, [sp,
strd r2, [sp,
strd r10, [sp,
add r6, r11, r6
add r7, r0, r7
eor r4, r4, r6, ror
add r6, r1, r12
eor r5, r5, r7, ror
add r7, r10, lr
eor r2, r2, r6, ror
eor r3, r3, r7, ror
strd r2, [sp,
add r10, r3, r10
ldrd r6, [sp,
add r11, r4, r11
eor r8, r8, r10, ror
add r10, r5, r0
eor r9, r9, r11, ror
add r11, r2, r1
eor r6, r6, r10, ror
eor r7, r7, r11, ror
strd r6, [sp,
add r2, r7, r2
ldrd r10, [sp,
add r3, r8, r3
eor r12, r12, r2, ror
add r2, r9, r4
eor lr, lr, r3, ror
add r3, r6, r5
eor r10, r10, r2, ror
eor r11, r11, r3, ror
ldrd r2, [sp,
add r6, r11, r6
add r7, r12, r7
eor r0, r0, r6, ror
add r6, lr, r8
eor r1, r1, r7, ror
add r7, r10, r9
eor r2, r2, r6, ror
eor r3, r3, r7, ror
.endm
.macro salsa8_core
ldmia sp, {r0-r12, lr}
ldrd r10, [sp,
salsa8_core_doubleround_body
ldrd r6, [sp,
strd r2, [sp,
strd r10, [sp,
salsa8_core_doubleround_body
ldrd r6, [sp,
strd r2, [sp,
strd r10, [sp,
salsa8_core_doubleround_body
ldrd r6, [sp,
strd r2, [sp,
strd r10, [sp,
salsa8_core_doubleround_body
stmia sp, {r0-r5}
strd r8, [sp,
str r12, [sp,
str lr, [sp,
strd r10, [sp,
.endm
.macro scrypt_shuffle
.endm
.macro salsa8_core_doubleround_body
ldr r8, [sp,
add r11, r11, r10
ldr lr, [sp,
add r12, r12, r3
eor r2, r2, r11, ror
add r11, r4, r0
eor r7, r7, r12, ror
add r12, r9, r5
str r9, [sp,
eor r8, r8, r11, ror
str r10, [sp,
eor lr, lr, r12, ror
ldr r11, [sp,
add r9, lr, r9
ldr r12, [sp,
add r10, r2, r10
eor r1, r1, r9, ror
add r9, r7, r3
eor r6, r6, r10, ror
add r10, r8, r4
str r8, [sp,
eor r11, r11, r9, ror
str lr, [sp,
eor r12, r12, r10, ror
ldr r9, [sp,
add r8, r12, r8
ldr r10, [sp,
add lr, r1, lr
eor r0, r0, r8, ror
add r8, r6, r2
eor r5, r5, lr, ror
add lr, r11, r7
eor r9, r9, r8, ror
ldr r8, [sp,
eor r10, r10, lr, ror
ldr lr, [sp,
add r8, r9, r8
str r9, [sp,
add lr, r10, lr
str r10, [sp,
eor r11, r11, r8, ror
add r8, r0, r3
eor r12, r12, lr, ror
add lr, r5, r4
eor r1, r1, r8, ror
ldr r8, [sp,
eor r6, r6, lr, ror
add r9, r11, r9
ldr lr, [sp,
add r10, r12, r10
eor r8, r8, r9, ror
add r9, r1, r0
eor lr, lr, r10, ror
add r10, r6, r5
str r11, [sp,
eor r2, r2, r9, ror
str r12, [sp,
eor r7, r7, r10, ror
ldr r9, [sp,
add r11, r8, r11
ldr r10, [sp,
add r12, lr, r12
eor r9, r9, r11, ror
add r11, r2, r1
eor r10, r10, r12, ror
add r12, r7, r6
str r8, [sp,
eor r3, r3, r11, ror
str lr, [sp,
eor r4, r4, r12, ror
.endm
.macro salsa8_core
ldmia sp, {r0-r7}
ldr r12, [sp,
ldr r8, [sp,
ldr lr, [sp,
ldr r9, [sp,
add r8, r8, r12
ldr r11, [sp,
add lr, lr, r0
eor r3, r3, r8, ror
add r8, r5, r1
ldr r10, [sp,
eor r4, r4, lr, ror
add lr, r11, r6
eor r9, r9, r8, ror
eor r10, r10, lr, ror
salsa8_core_doubleround_body
ldr r11, [sp,
add r8, r9, r8
ldr r12, [sp,
add lr, r10, lr
eor r11, r11, r8, ror
add r8, r3, r2
eor r12, r12, lr, ror
add lr, r4, r7
eor r0, r0, r8, ror
ldr r8, [sp,
eor r5, r5, lr, ror
ldr lr, [sp,
add r8, r8, r12
str r11, [sp,
add lr, lr, r0
str r12, [sp,
eor r3, r3, r8, ror
add r8, r5, r1
eor r4, r4, lr, ror
add lr, r11, r6
str r9, [sp,
eor r9, r9, r8, ror
str r10, [sp,
eor r10, r10, lr, ror
salsa8_core_doubleround_body
ldr r11, [sp,
add r8, r9, r8
ldr r12, [sp,
add lr, r10, lr
eor r11, r11, r8, ror
add r8, r3, r2
eor r12, r12, lr, ror
add lr, r4, r7
eor r0, r0, r8, ror
ldr r8, [sp,
eor r5, r5, lr, ror
ldr lr, [sp,
add r8, r8, r12
str r11, [sp,
add lr, lr, r0
str r12, [sp,
eor r3, r3, r8, ror
add r8, r5, r1
eor r4, r4, lr, ror
add lr, r11, r6
str r9, [sp,
eor r9, r9, r8, ror
str r10, [sp,
eor r10, r10, lr, ror
salsa8_core_doubleround_body
ldr r11, [sp,
add r8, r9, r8
ldr r12, [sp,
add lr, r10, lr
eor r11, r11, r8, ror
add r8, r3, r2
eor r12, r12, lr, ror
add lr, r4, r7
eor r0, r0, r8, ror
ldr r8, [sp,
eor r5, r5, lr, ror
ldr lr, [sp,
add r8, r8, r12
str r11, [sp,
add lr, lr, r0
str r12, [sp,
eor r3, r3, r8, ror
add r8, r5, r1
eor r4, r4, lr, ror
add lr, r11, r6
str r9, [sp,
eor r9, r9, r8, ror
str r10, [sp,
eor r10, r10, lr, ror
salsa8_core_doubleround_body
ldr r11, [sp,
add r8, r9, r8
ldr r12, [sp,
add lr, r10, lr
str r9, [sp,
eor r11, r11, r8, ror
eor r12, r12, lr, ror
add r8, r3, r2
str r10, [sp,
add lr, r4, r7
str r11, [sp,
eor r0, r0, r8, ror
str r12, [sp,
eor r5, r5, lr, ror
stmia sp, {r0-r7}
.endm
.macro scrypt_core_macro1a_x4
ldmia r0, {r4-r7}
ldmia lr!, {r8-r11}
stmia r1!, {r4-r7}
stmia r3!, {r8-r11}
eor r4, r4, r8
eor r5, r5, r9
eor r6, r6, r10
eor r7, r7, r11
stmia r0!, {r4-r7}
stmia r12!, {r4-r7}
.endm
.macro scrypt_core_macro1b_x4
ldmia r3!, {r8-r11}
ldmia r2, {r4-r7}
eor r8, r8, r4
eor r9, r9, r5
eor r10, r10, r6
eor r11, r11, r7
ldmia r0, {r4-r7}
stmia r2!, {r8-r11}
eor r4, r4, r8
eor r5, r5, r9
eor r6, r6, r10
eor r7, r7, r11
ldmia r1!, {r8-r11}
eor r4, r4, r8
eor r5, r5, r9
eor r6, r6, r10
eor r7, r7, r11
stmia r0!, {r4-r7}
stmia r12!, {r4-r7}
.endm
.macro scrypt_core_macro2_x4
ldmia r12, {r4-r7}
ldmia r0, {r8-r11}
add r4, r4, r8
add r5, r5, r9
add r6, r6, r10
add r7, r7, r11
stmia r0!, {r4-r7}
ldmia r2, {r8-r11}
eor r4, r4, r8
eor r5, r5, r9
eor r6, r6, r10
eor r7, r7, r11
stmia r2!, {r4-r7}
stmia r12!, {r4-r7}
.endm
.macro scrypt_core_macro3_x4
ldmia r1!, {r4-r7}
ldmia r0, {r8-r11}
add r4, r4, r8
add r5, r5, r9
add r6, r6, r10
add r7, r7, r11
stmia r0!, {r4-r7}
.endm
.macro scrypt_core_macro3_x6
ldmia r1!, {r2-r7}
ldmia r0, {r8-r12, lr}
add r2, r2, r8
add r3, r3, r9
add r4, r4, r10
add r5, r5, r11
add r6, r6, r12
add r7, r7, lr
stmia r0!, {r2-r7}
.endm
.text
.code 32
.align 2
.globl scrypt_core
.globl _scrypt_core
.type scrypt_core, %function
scrypt_core:
_scrypt_core:
stmfd sp!, {r4-r11, lr}
mov r12, sp
sub sp, sp,
bic sp, sp,
str r12, [sp,
str r2, [sp,
scrypt_shuffle
ldr r2, [sp,
str r0, [sp,
add r12, r1, r2, lsl
str r12, [sp,
scrypt_core_loop1:
add lr, r0,
add r3, r1,
mov r12, sp
scrypt_core_macro1a_x4
scrypt_core_macro1a_x4
scrypt_core_macro1a_x4
scrypt_core_macro1a_x4
str r1, [sp,
salsa8_core
ldr r0, [sp,
mov r12, sp
add r2, r0,
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
salsa8_core
ldr r0, [sp,
mov r1, sp
add r0, r0,
scrypt_core_macro3_x6
scrypt_core_macro3_x6
ldr r3, [sp,
ldr r12, [sp,
scrypt_core_macro3_x4
add r1, r3,
sub r0, r0,
cmp r1, r12
bne scrypt_core_loop1
ldr r12, [sp,
ldr r4, [r0,
sub r2, r12,
str r2, [sp,
sub r1, r1, r12, lsl
str r1, [sp,
and r4, r4, r2
add r1, r1, r4, lsl
scrypt_core_loop2:
add r2, r0,
add r3, r1,
str r12, [sp,
mov r12, sp
pld [r1,
pld [r1,
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
salsa8_core
ldr r0, [sp,
mov r12, sp
add r2, r0,
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
salsa8_core
ldr r0, [sp,
mov r1, sp
ldr r3, [sp,
add r0, r0,
ldr r2, [sp,
scrypt_core_macro3_x4
and r4, r4, r2
add r3, r3, r4, lsl
str r3, [sp,
pld [r3,
pld [r3]
scrypt_core_macro3_x6
scrypt_core_macro3_x6
ldr r12, [sp,
sub r0, r0,
ldr r1, [sp,
subs r12, r12,
bne scrypt_core_loop2
scrypt_shuffle
ldr sp, [sp,
ldmfd sp!, {r4-r11, lr}
bx lr
ldmfd sp!, {r4-r11, pc}
.macro salsa8_core_3way_doubleround
ldrd r6, [sp,
vadd.u32 q4, q0, q1
add r6, r2, r6
vadd.u32 q6, q8, q9
add r7, r3, r7
vshl.u32 q5, q4,
eor r10, r10, r6, ror
vshl.u32 q7, q6,
add r6, r0, r4
vshr.u32 q4, q4,
eor r11, r11, r7, ror
vshr.u32 q6, q6,
add r7, r1, r5
veor.u32 q3, q3, q5
strd r10, [sp,
veor.u32 q11, q11, q7
eor r12, r12, r6, ror
veor.u32 q3, q3, q4
eor lr, lr, r7, ror
veor.u32 q11, q11, q6
ldrd r6, [sp,
vadd.u32 q4, q3, q0
add r2, r10, r2
vadd.u32 q6, q11, q8
add r3, r11, r3
vshl.u32 q5, q4,
eor r6, r6, r2, ror
vshl.u32 q7, q6,
add r2, r12, r0
vshr.u32 q4, q4,
eor r7, r7, r3, ror
vshr.u32 q6, q6,
add r3, lr, r1
veor.u32 q2, q2, q5
strd r6, [sp,
veor.u32 q10, q10, q7
eor r8, r8, r2, ror
veor.u32 q2, q2, q4
eor r9, r9, r3, ror
veor.u32 q10, q10, q6
ldrd r2, [sp,
vadd.u32 q4, q2, q3
add r10, r6, r10
vadd.u32 q6, q10, q11
add r11, r7, r11
vext.u32 q3, q3, q3,
eor r2, r2, r10, ror
vshl.u32 q5, q4,
add r10, r8, r12
vext.u32 q11, q11, q11,
eor r3, r3, r11, ror
vshl.u32 q7, q6,
add r11, r9, lr
vshr.u32 q4, q4,
eor r4, r4, r10, ror
vshr.u32 q6, q6,
eor r5, r5, r11, ror
veor.u32 q1, q1, q5
veor.u32 q9, q9, q7
veor.u32 q1, q1, q4
veor.u32 q9, q9, q6
ldrd r10, [sp,
vadd.u32 q4, q1, q2
add r6, r2, r6
vadd.u32 q6, q9, q10
add r7, r3, r7
vswp.u32 d4, d5
eor r10, r10, r6, ror
vshl.u32 q5, q4,
add r6, r4, r8
vswp.u32 d20, d21
eor r11, r11, r7, ror
vshl.u32 q7, q6,
add r7, r5, r9
vshr.u32 q4, q4,
eor r0, r0, r6, ror
vshr.u32 q6, q6,
eor r1, r1, r7, ror
veor.u32 q0, q0, q5
ldrd r6, [sp,
veor.u32 q8, q8, q7
veor.u32 q0, q0, q4
veor.u32 q8, q8, q6
strd r2, [sp,
vadd.u32 q4, q0, q3
strd r10, [sp,
vadd.u32 q6, q8, q11
add r6, r11, r6
vext.u32 q1, q1, q1,
add r7, r0, r7
vshl.u32 q5, q4,
eor r4, r4, r6, ror
vext.u32 q9, q9, q9,
add r6, r1, r12
vshl.u32 q7, q6,
eor r5, r5, r7, ror
vshr.u32 q4, q4,
add r7, r10, lr
vshr.u32 q6, q6,
eor r2, r2, r6, ror
veor.u32 q1, q1, q5
eor r3, r3, r7, ror
veor.u32 q9, q9, q7
strd r2, [sp,
veor.u32 q1, q1, q4
veor.u32 q9, q9, q6
add r10, r3, r10
vadd.u32 q4, q1, q0
ldrd r6, [sp,
vadd.u32 q6, q9, q8
add r11, r4, r11
vshl.u32 q5, q4,
eor r8, r8, r10, ror
vshl.u32 q7, q6,
add r10, r5, r0
vshr.u32 q4, q4,
eor r9, r9, r11, ror
vshr.u32 q6, q6,
add r11, r2, r1
veor.u32 q2, q2, q5
eor r6, r6, r10, ror
veor.u32 q10, q10, q7
eor r7, r7, r11, ror
veor.u32 q2, q2, q4
strd r6, [sp,
veor.u32 q10, q10, q6
add r2, r7, r2
vadd.u32 q4, q2, q1
ldrd r10, [sp,
vadd.u32 q6, q10, q9
add r3, r8, r3
vext.u32 q1, q1, q1,
eor r12, r12, r2, ror
vshl.u32 q5, q4,
add r2, r9, r4
vext.u32 q9, q9, q9,
eor lr, lr, r3, ror
vshl.u32 q7, q6,
add r3, r6, r5
vshr.u32 q4, q4,
eor r10, r10, r2, ror
vshr.u32 q6, q6,
eor r11, r11, r3, ror
veor.u32 q3, q3, q5
veor.u32 q11, q11, q7
veor.u32 q3, q3, q4
veor.u32 q11, q11, q6
ldrd r2, [sp,
vadd.u32 q4, q3, q2
add r6, r11, r6
vadd.u32 q6, q11, q10
add r7, r12, r7
vswp.u32 d4, d5
eor r0, r0, r6, ror
vshl.u32 q5, q4,
add r6, lr, r8
vswp.u32 d20, d21
eor r1, r1, r7, ror
vshl.u32 q7, q6,
add r7, r10, r9
vext.u32 q3, q3, q3,
eor r2, r2, r6, ror
vshr.u32 q4, q4,
eor r3, r3, r7, ror
vshr.u32 q6, q6,
strd r2, [sp,
vext.u32 q11, q11, q11,
strd r10, [sp,
veor.u32 q0, q0, q5
veor.u32 q8, q8, q7
veor.u32 q0, q0, q4
veor.u32 q8, q8, q6
.endm
.macro salsa8_core_3way
ldmia sp, {r0-r12, lr}
ldrd r10, [sp,
salsa8_core_3way_doubleround
salsa8_core_3way_doubleround
salsa8_core_3way_doubleround
salsa8_core_3way_doubleround
stmia sp, {r0-r5}
strd r8, [sp,
str r12, [sp,
str lr, [sp,
.endm
.text
.code 32
.align 2
.globl scrypt_core_3way
.globl _scrypt_core_3way
.type scrypt_core_3way, %function
scrypt_core_3way:
_scrypt_core_3way:
stmfd sp!, {r4-r11, lr}
vpush {q4-q7}
mov r12, sp
sub sp, sp,
bic sp, sp,
str r2, [sp,
str r12, [sp,
mov r3, r0
vldmia r3!, {q8-q15}
vmov.u64 q0,
vmov.u32 q1, q8
vmov.u32 q2, q12
vbif.u32 q8, q9, q0
vbif.u32 q12, q13, q0
vbif.u32 q9, q10, q0
vbif.u32 q13, q14, q0
vbif.u32 q10, q11, q0
vbif.u32 q14, q15, q0
vbif.u32 q11, q1, q0
vbif.u32 q15, q2, q0
vldmia r3!, {q0-q7}
vswp.u32 d17, d21
vswp.u32 d25, d29
vswp.u32 d18, d22
vswp.u32 d26, d30
vstmia r0, {q8-q15}
vmov.u64 q8,
vmov.u32 q9, q0
vmov.u32 q10, q4
vbif.u32 q0, q1, q8
vbif.u32 q4, q5, q8
vbif.u32 q1, q2, q8
vbif.u32 q5, q6, q8
vbif.u32 q2, q3, q8
vbif.u32 q6, q7, q8
vbif.u32 q3, q9, q8
vbif.u32 q7, q10, q8
vldmia r3, {q8-q15}
vswp.u32 d1, d5
vswp.u32 d9, d13
vswp.u32 d2, d6
vswp.u32 d10, d14
add r12, sp,
vstmia r12!, {q0-q7}
vmov.u64 q0,
vmov.u32 q1, q8
vmov.u32 q2, q12
vbif.u32 q8, q9, q0
vbif.u32 q12, q13, q0
vbif.u32 q9, q10, q0
vbif.u32 q13, q14, q0
vbif.u32 q10, q11, q0
vbif.u32 q14, q15, q0
vbif.u32 q11, q1, q0
vbif.u32 q15, q2, q0
vswp.u32 d17, d21
vswp.u32 d25, d29
vswp.u32 d18, d22
vswp.u32 d26, d30
vstmia r12, {q8-q15}
add lr, sp,
vldmia lr, {q0-q7}
add r2, r1, r2, lsl
str r0, [sp,
str r2, [sp,
scrypt_core_3way_loop1:
add lr, r0,
add r3, r1,
str r1, [sp,
mov r12, sp
scrypt_core_macro1a_x4
scrypt_core_macro1a_x4
scrypt_core_macro1a_x4
ldr r2, [sp,
scrypt_core_macro1a_x4
sub r1, r1,
add r1, r1, r2, lsl
vstmia r1, {q0-q7}
add r3, r1, r2, lsl
vstmia r3, {q8-q15}
add lr, sp,
veor.u32 q0, q0, q4
veor.u32 q1, q1, q5
veor.u32 q2, q2, q6
veor.u32 q3, q3, q7
vstmia lr, {q0-q3}
veor.u32 q8, q8, q12
veor.u32 q9, q9, q13
veor.u32 q10, q10, q14
veor.u32 q11, q11, q15
add r12, sp,
vstmia r12, {q8-q11}
salsa8_core_3way
ldr r0, [sp,
mov r12, sp
add r2, r0,
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
add lr, sp,
vldmia lr, {q4-q7}
vadd.u32 q4, q4, q0
vadd.u32 q5, q5, q1
vadd.u32 q6, q6, q2
vadd.u32 q7, q7, q3
add r12, sp,
vldmia r12, {q0-q3}
vstmia lr, {q4-q7}
vadd.u32 q8, q8, q0
vadd.u32 q9, q9, q1
vadd.u32 q10, q10, q2
vadd.u32 q11, q11, q3
add r4, sp,
vldmia r4, {q0-q3}
vstmia r12, {q8-q11}
veor.u32 q0, q0, q4
veor.u32 q1, q1, q5
veor.u32 q2, q2, q6
veor.u32 q3, q3, q7
vstmia r4, {q0-q3}
veor.u32 q8, q8, q12
veor.u32 q9, q9, q13
veor.u32 q10, q10, q14
veor.u32 q11, q11, q15
vmov q12, q8
vmov q13, q9
vmov q14, q10
vmov q15, q11
salsa8_core_3way
ldr r0, [sp,
mov r1, sp
add r0, r0,
scrypt_core_macro3_x6
scrypt_core_macro3_x6
scrypt_core_macro3_x4
sub r0, r0,
ldr r1, [sp,
ldr r2, [sp,
add lr, sp,
add r4, sp,
vldmia r4, {q4-q7}
vadd.u32 q4, q4, q0
vadd.u32 q5, q5, q1
vadd.u32 q6, q6, q2
vadd.u32 q7, q7, q3
vstmia r4, {q4-q7}
vldmia lr, {q0-q3}
vadd.u32 q12, q12, q8
vadd.u32 q13, q13, q9
vadd.u32 q14, q14, q10
vadd.u32 q15, q15, q11
add r12, sp,
vldmia r12, {q8-q11}
add r1, r1,
cmp r1, r2
bne scrypt_core_3way_loop1
ldr r2, [sp,
add r5, sp,
vstmia r5, {q12-q15}
sub r1, r1, r2, lsl
str r1, [sp,
scrypt_core_3way_loop2:
str r2, [sp,
ldr r0, [sp,
ldr r1, [sp,
ldr r2, [sp,
ldr r4, [r0,
sub r2, r2,
and r4, r4, r2
add r1, r1, r4, lsl
add r2, r0,
add r3, r1,
mov r12, sp
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
scrypt_core_macro1b_x4
ldr r1, [sp,
ldr r2, [sp,
add r1, r1, r2, lsl
add r3, r1, r2, lsl
sub r2, r2,
vmov r6, r7, d8
and r6, r6, r2
add r6, r1, r6, lsl
vmov r7, r8, d24
add lr, sp,
vldmia lr, {q0-q3}
pld [r6]
pld [r6,
pld [r6,
pld [r6,
vldmia r6, {q8-q15}
and r7, r7, r2
add r7, r3, r7, lsl
veor.u32 q8, q8, q0
veor.u32 q9, q9, q1
veor.u32 q10, q10, q2
veor.u32 q11, q11, q3
pld [r7]
pld [r7,
pld [r7,
pld [r7,
veor.u32 q12, q12, q4
veor.u32 q13, q13, q5
veor.u32 q14, q14, q6
veor.u32 q15, q15, q7
vldmia r7, {q0-q7}
vstmia lr, {q8-q15}
add r12, sp,
vldmia r12, {q8-q15}
veor.u32 q8, q8, q0
veor.u32 q9, q9, q1
veor.u32 q10, q10, q2
veor.u32 q11, q11, q3
veor.u32 q12, q12, q4
veor.u32 q13, q13, q5
veor.u32 q14, q14, q6
veor.u32 q15, q15, q7
vldmia lr, {q0-q7}
veor.u32 q0, q0, q4
veor.u32 q1, q1, q5
veor.u32 q2, q2, q6
veor.u32 q3, q3, q7
vstmia lr, {q0-q3}
veor.u32 q8, q8, q12
veor.u32 q9, q9, q13
veor.u32 q10, q10, q14
veor.u32 q11, q11, q15
vstmia r12, {q8-q15}
salsa8_core_3way
ldr r0, [sp,
mov r12, sp
add r2, r0,
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
scrypt_core_macro2_x4
add lr, sp,
vldmia lr, {q4-q7}
vadd.u32 q4, q4, q0
vadd.u32 q5, q5, q1
vadd.u32 q6, q6, q2
vadd.u32 q7, q7, q3
add r12, sp,
vldmia r12, {q12-q15}
vstmia lr, {q4-q7}
vadd.u32 q12, q12, q8
vadd.u32 q13, q13, q9
vadd.u32 q14, q14, q10
vadd.u32 q15, q15, q11
add r4, sp,
vldmia r4, {q0-q3}
vstmia r12, {q12-q15}
veor.u32 q0, q0, q4
veor.u32 q1, q1, q5
veor.u32 q2, q2, q6
veor.u32 q3, q3, q7
add r5, sp,
vldmia r5, {q8-q11}
vstmia r4, {q0-q3}
veor.u32 q8, q8, q12
veor.u32 q9, q9, q13
veor.u32 q10, q10, q14
veor.u32 q11, q11, q15
vmov q12, q8
vmov q13, q9
vmov q14, q10
vmov q15, q11
salsa8_core_3way
ldr r0, [sp,
ldr r3, [sp,
ldr r2, [sp,
mov r1, sp
add r0, r0,
sub r2, r2,
scrypt_core_macro3_x4
and r4, r4, r2
add r3, r3, r4, lsl
pld [r3,
pld [r3]
pld [r3,
pld [r3,
scrypt_core_macro3_x6
scrypt_core_macro3_x6
add lr, sp,
add r4, sp,
vldmia r4, {q4-q7}
vadd.u32 q4, q4, q0
vadd.u32 q5, q5, q1
vadd.u32 q6, q6, q2
vadd.u32 q7, q7, q3
vstmia r4, {q4-q7}
vadd.u32 q12, q12, q8
vadd.u32 q13, q13, q9
vadd.u32 q14, q14, q10
vadd.u32 q15, q15, q11
add r5, sp,
vstmia r5, {q12-q15}
ldr r2, [sp,
subs r2, r2,
bne scrypt_core_3way_loop2
ldr r0, [sp,
vldmia r0, {q8-q15}
vmov.u64 q0,
vmov.u32 q1, q8
vmov.u32 q2, q12
vbif.u32 q8, q9, q0
vbif.u32 q12, q13, q0
vbif.u32 q9, q10, q0
vbif.u32 q13, q14, q0
vbif.u32 q10, q11, q0
vbif.u32 q14, q15, q0
vbif.u32 q11, q1, q0
vbif.u32 q15, q2, q0
add r12, sp,
vldmia r12!, {q0-q7}
vswp.u32 d17, d21
vswp.u32 d25, d29
vswp.u32 d18, d22
vswp.u32 d26, d30
vstmia r0!, {q8-q15}
vmov.u64 q8,
vmov.u32 q9, q0
vmov.u32 q10, q4
vbif.u32 q0, q1, q8
vbif.u32 q4, q5, q8
vbif.u32 q1, q2, q8
vbif.u32 q5, q6, q8
vbif.u32 q2, q3, q8
vbif.u32 q6, q7, q8
vbif.u32 q3, q9, q8
vbif.u32 q7, q10, q8
vldmia r12, {q8-q15}
vswp.u32 d1, d5
vswp.u32 d9, d13
vswp.u32 d2, d6
vswp.u32 d10, d14
vstmia r0!, {q0-q7}
vmov.u64 q0,
vmov.u32 q1, q8
vmov.u32 q2, q12
vbif.u32 q8, q9, q0
vbif.u32 q12, q13, q0
vbif.u32 q9, q10, q0
vbif.u32 q13, q14, q0
vbif.u32 q10, q11, q0
vbif.u32 q14, q15, q0
vbif.u32 q11, q1, q0
vbif.u32 q15, q2, q0
vswp.u32 d17, d21
vswp.u32 d25, d29
vswp.u32 d18, d22
vswp.u32 d26, d30
vstmia r0, {q8-q15}
ldr sp, [sp,
vpop {q4-q7}
ldmfd sp!, {r4-r11, pc}