This consists of ~2000 lines of amd64 assembly and a, much slower, generic Go version in curve25519.go. The assembly has been ported from djb's public domain sources and the only semantic alterations are to deal with Go's split stacks. R=rsc CC=golang-dev https://golang.org/cl/5786045
93 lines
1.5 KiB
ArmAsm
93 lines
1.5 KiB
ArmAsm
// Copyright 2012 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.
|
|
|
|
// This code was translated into a form compatible with 6a from the public
|
|
// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html
|
|
|
|
// func freeze(inout *[5]uint64)
|
|
TEXT ·freeze(SB),7,$96-8
|
|
MOVQ inout+0(FP), DI
|
|
|
|
MOVQ SP,R11
|
|
MOVQ $31,CX
|
|
NOTQ CX
|
|
ANDQ CX,SP
|
|
ADDQ $32,SP
|
|
|
|
MOVQ R11,0(SP)
|
|
MOVQ R12,8(SP)
|
|
MOVQ R13,16(SP)
|
|
MOVQ R14,24(SP)
|
|
MOVQ R15,32(SP)
|
|
MOVQ BX,40(SP)
|
|
MOVQ BP,48(SP)
|
|
MOVQ 0(DI),SI
|
|
MOVQ 8(DI),DX
|
|
MOVQ 16(DI),CX
|
|
MOVQ 24(DI),R8
|
|
MOVQ 32(DI),R9
|
|
MOVQ ·REDMASK51(SB),AX
|
|
MOVQ AX,R10
|
|
SUBQ $18,R10
|
|
MOVQ $3,R11
|
|
REDUCELOOP:
|
|
MOVQ SI,R12
|
|
SHRQ $51,R12
|
|
ANDQ AX,SI
|
|
ADDQ R12,DX
|
|
MOVQ DX,R12
|
|
SHRQ $51,R12
|
|
ANDQ AX,DX
|
|
ADDQ R12,CX
|
|
MOVQ CX,R12
|
|
SHRQ $51,R12
|
|
ANDQ AX,CX
|
|
ADDQ R12,R8
|
|
MOVQ R8,R12
|
|
SHRQ $51,R12
|
|
ANDQ AX,R8
|
|
ADDQ R12,R9
|
|
MOVQ R9,R12
|
|
SHRQ $51,R12
|
|
ANDQ AX,R9
|
|
IMUL3Q $19,R12,R12
|
|
ADDQ R12,SI
|
|
SUBQ $1,R11
|
|
JA REDUCELOOP
|
|
MOVQ $1,R12
|
|
CMPQ R10,SI
|
|
CMOVQLT R11,R12
|
|
CMPQ AX,DX
|
|
CMOVQNE R11,R12
|
|
CMPQ AX,CX
|
|
CMOVQNE R11,R12
|
|
CMPQ AX,R8
|
|
CMOVQNE R11,R12
|
|
CMPQ AX,R9
|
|
CMOVQNE R11,R12
|
|
NEGQ R12
|
|
ANDQ R12,AX
|
|
ANDQ R12,R10
|
|
SUBQ R10,SI
|
|
SUBQ AX,DX
|
|
SUBQ AX,CX
|
|
SUBQ AX,R8
|
|
SUBQ AX,R9
|
|
MOVQ SI,0(DI)
|
|
MOVQ DX,8(DI)
|
|
MOVQ CX,16(DI)
|
|
MOVQ R8,24(DI)
|
|
MOVQ R9,32(DI)
|
|
MOVQ 0(SP),R11
|
|
MOVQ 8(SP),R12
|
|
MOVQ 16(SP),R13
|
|
MOVQ 24(SP),R14
|
|
MOVQ 32(SP),R15
|
|
MOVQ 40(SP),BX
|
|
MOVQ 48(SP),BP
|
|
MOVQ R11,SP
|
|
MOVQ DI,AX
|
|
MOVQ SI,DX
|
|
RET
|