Latest update
This commit is contained in:
@@ -48,7 +48,6 @@ if ($flavour && $flavour ne "void") {
|
||||
$code.=<<___;
|
||||
#include "arm_arch.h"
|
||||
|
||||
.text
|
||||
#if defined(__thumb2__)
|
||||
.syntax unified
|
||||
.thumb
|
||||
@@ -56,6 +55,8 @@ $code.=<<___;
|
||||
.code 32
|
||||
#endif
|
||||
|
||||
.text
|
||||
|
||||
.globl poly1305_emit
|
||||
.globl poly1305_blocks
|
||||
.globl poly1305_init
|
||||
@@ -100,8 +101,10 @@ poly1305_init:
|
||||
and r4,r4,r10
|
||||
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
# if !defined(_WIN32)
|
||||
ldr r12,[r11,r12] @ OPENSSL_armcap_P
|
||||
# ifdef __APPLE__
|
||||
# endif
|
||||
# if defined(__APPLE__) || defined(_WIN32)
|
||||
ldr r12,[r12]
|
||||
# endif
|
||||
#endif
|
||||
@@ -116,31 +119,21 @@ poly1305_init:
|
||||
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
tst r12,#ARMV7_NEON @ check for NEON
|
||||
# ifdef __APPLE__
|
||||
adr r9,poly1305_blocks_neon
|
||||
adr r11,poly1305_blocks
|
||||
# ifdef __thumb2__
|
||||
it ne
|
||||
# endif
|
||||
movne r11,r9
|
||||
adr r12,poly1305_emit
|
||||
adr r10,poly1305_emit_neon
|
||||
# ifdef __thumb2__
|
||||
it ne
|
||||
# endif
|
||||
movne r12,r10
|
||||
# else
|
||||
# ifdef __thumb2__
|
||||
itete eq
|
||||
# endif
|
||||
addeq r12,r11,#(poly1305_emit-.Lpoly1305_init)
|
||||
addne r12,r11,#(poly1305_emit_neon-.Lpoly1305_init)
|
||||
addeq r11,r11,#(poly1305_blocks-.Lpoly1305_init)
|
||||
addne r11,r11,#(poly1305_blocks_neon-.Lpoly1305_init)
|
||||
# endif
|
||||
# ifdef __thumb2__
|
||||
orr r12,r12,#1 @ thumb-ify address
|
||||
orr r11,r11,#1
|
||||
adr r9,.Lpoly1305_blocks_neon
|
||||
adr r11,.Lpoly1305_blocks
|
||||
adr r12,.Lpoly1305_emit
|
||||
adr r10,.Lpoly1305_emit_neon
|
||||
itt ne
|
||||
movne r11,r9
|
||||
movne r12,r10
|
||||
orr r11,r11,#1 @ thumb-ify address
|
||||
orr r12,r12,#1
|
||||
# else
|
||||
addeq r12,r11,#(.Lpoly1305_emit-.Lpoly1305_init)
|
||||
addne r12,r11,#(.Lpoly1305_emit_neon-.Lpoly1305_init)
|
||||
addeq r11,r11,#(.Lpoly1305_blocks-.Lpoly1305_init)
|
||||
addne r11,r11,#(.Lpoly1305_blocks_neon-.Lpoly1305_init)
|
||||
# endif
|
||||
#endif
|
||||
ldrb r9,[$inp,#11]
|
||||
@@ -352,6 +345,7 @@ $code.=<<___;
|
||||
.type poly1305_emit,%function
|
||||
.align 5
|
||||
poly1305_emit:
|
||||
.Lpoly1305_emit:
|
||||
stmdb sp!,{r4-r11}
|
||||
.Lpoly1305_emit_enter:
|
||||
|
||||
@@ -671,6 +665,7 @@ poly1305_init_neon:
|
||||
.type poly1305_blocks_neon,%function
|
||||
.align 5
|
||||
poly1305_blocks_neon:
|
||||
.Lpoly1305_blocks_neon:
|
||||
ldr ip,[$ctx,#36] @ is_base2_26
|
||||
ands $len,$len,#-16
|
||||
beq .Lno_data_neon
|
||||
@@ -1157,6 +1152,7 @@ poly1305_blocks_neon:
|
||||
.type poly1305_emit_neon,%function
|
||||
.align 5
|
||||
poly1305_emit_neon:
|
||||
.Lpoly1305_emit_neon:
|
||||
ldr ip,[$ctx,#36] @ is_base2_26
|
||||
|
||||
stmdb sp!,{r4-r11}
|
||||
@@ -1229,7 +1225,11 @@ poly1305_emit_neon:
|
||||
.Lzeros:
|
||||
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
.LOPENSSL_armcap:
|
||||
# ifdef _WIN32
|
||||
.word OPENSSL_armcap_P
|
||||
# else
|
||||
.word OPENSSL_armcap_P-.Lpoly1305_init
|
||||
# endif
|
||||
#endif
|
||||
___
|
||||
} }
|
||||
|
||||
@@ -71,17 +71,12 @@ poly1305_init:
|
||||
csel x0,xzr,x0,eq
|
||||
b.eq .Lno_key
|
||||
|
||||
#ifdef __ILP32__
|
||||
ldrsw $t1,.LOPENSSL_armcap_P
|
||||
#else
|
||||
ldr $t1,.LOPENSSL_armcap_P
|
||||
#endif
|
||||
adr $t0,.LOPENSSL_armcap_P
|
||||
adrp x17,OPENSSL_armcap_P
|
||||
ldr w17,[x17,#:lo12:OPENSSL_armcap_P]
|
||||
|
||||
ldp $r0,$r1,[$inp] // load key
|
||||
mov $s1,#0xfffffffc0fffffff
|
||||
movk $s1,#0x0fff,lsl#48
|
||||
ldr w17,[$t0,$t1]
|
||||
#ifdef __ARMEB__
|
||||
rev $r0,$r0 // flip bytes
|
||||
rev $r1,$r1
|
||||
@@ -93,10 +88,10 @@ poly1305_init:
|
||||
|
||||
tst w17,#ARMV7_NEON
|
||||
|
||||
adr $d0,poly1305_blocks
|
||||
adr $r0,poly1305_blocks_neon
|
||||
adr $d1,poly1305_emit
|
||||
adr $r1,poly1305_emit_neon
|
||||
adr $d0,.Lpoly1305_blocks
|
||||
adr $r0,.Lpoly1305_blocks_neon
|
||||
adr $d1,.Lpoly1305_emit
|
||||
adr $r1,.Lpoly1305_emit_neon
|
||||
|
||||
csel $d0,$d0,$r0,eq
|
||||
csel $d1,$d1,$r1,eq
|
||||
@@ -115,6 +110,7 @@ poly1305_init:
|
||||
.type poly1305_blocks,%function
|
||||
.align 5
|
||||
poly1305_blocks:
|
||||
.Lpoly1305_blocks:
|
||||
ands $len,$len,#-16
|
||||
b.eq .Lno_data
|
||||
|
||||
@@ -179,6 +175,7 @@ poly1305_blocks:
|
||||
.type poly1305_emit,%function
|
||||
.align 5
|
||||
poly1305_emit:
|
||||
.Lpoly1305_emit:
|
||||
ldp $h0,$h1,[$ctx] // load hash base 2^64
|
||||
ldr $h2,[$ctx,#16]
|
||||
ldp $t0,$t1,[$nonce] // load nonce
|
||||
@@ -285,12 +282,14 @@ poly1305_splat:
|
||||
.type poly1305_blocks_neon,%function
|
||||
.align 5
|
||||
poly1305_blocks_neon:
|
||||
.Lpoly1305_blocks_neon:
|
||||
ldr $is_base2_26,[$ctx,#24]
|
||||
cmp $len,#128
|
||||
b.hs .Lblocks_neon
|
||||
cbz $is_base2_26,poly1305_blocks
|
||||
cbz $is_base2_26,.Lpoly1305_blocks
|
||||
|
||||
.Lblocks_neon:
|
||||
.inst 0xd503233f // paciasp
|
||||
stp x29,x30,[sp,#-80]!
|
||||
add x29,sp,#0
|
||||
|
||||
@@ -430,7 +429,7 @@ poly1305_blocks_neon:
|
||||
csel $in2,$zeros,$in2,lo
|
||||
|
||||
mov x4,#1
|
||||
str x4,[$ctx,#-24] // set is_base2_26
|
||||
stur x4,[$ctx,#-24] // set is_base2_26
|
||||
sub $ctx,$ctx,#48 // restore original $ctx
|
||||
b .Ldo_neon
|
||||
|
||||
@@ -859,6 +858,7 @@ poly1305_blocks_neon:
|
||||
st1 {$ACC4}[0],[$ctx]
|
||||
|
||||
.Lno_data_neon:
|
||||
.inst 0xd50323bf // autiasp
|
||||
ldr x29,[sp],#80
|
||||
ret
|
||||
.size poly1305_blocks_neon,.-poly1305_blocks_neon
|
||||
@@ -866,6 +866,7 @@ poly1305_blocks_neon:
|
||||
.type poly1305_emit_neon,%function
|
||||
.align 5
|
||||
poly1305_emit_neon:
|
||||
.Lpoly1305_emit_neon:
|
||||
ldr $is_base2_26,[$ctx,#24]
|
||||
cbz $is_base2_26,poly1305_emit
|
||||
|
||||
@@ -918,12 +919,6 @@ poly1305_emit_neon:
|
||||
.align 5
|
||||
.Lzeros:
|
||||
.long 0,0,0,0,0,0,0,0
|
||||
.LOPENSSL_armcap_P:
|
||||
#ifdef __ILP32__
|
||||
.long OPENSSL_armcap_P-.
|
||||
#else
|
||||
.quad OPENSSL_armcap_P-.
|
||||
#endif
|
||||
.asciz "Poly1305 for ARMv8, CRYPTOGAMS by <appro\@openssl.org>"
|
||||
.align 2
|
||||
___
|
||||
|
||||
Reference in New Issue
Block a user