Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/arch/arm64/crypto/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  nh-neon-core.S   Sprache: Sparc

 
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * NH - ε-almost-universal hash function, ARM64 NEON accelerated version
 *
 * Copyright 2018 Google LLC
 *
 * Author: Eric Biggers <ebiggers@google.com>
 */


#include <linux/linkage.h>
#include <linux/cfi_types.h>

 KEY  .req x0
 MESSAGE  .req x1
 MESSAGE_LEN .req x2
 HASH  .req x3

 PASS0_SUMS .req v0
 PASS1_SUMS .req v1
 PASS2_SUMS .req v2
 PASS3_SUMS .req v3
 K0  .req v4
 K1  .req v5
 K2  .req v6
 K3  .req v7
 T0  .req v8
 T1  .req v9
 T2  .req v10
 T3  .req v11
 T4  .req v12
 T5  .req v13
 T6  .req v14
 T7  .req v15

.macro _nh_stride k0, k1, k2, k3

 // Load next message stride
 ld1  {T3.16b}, [MESSAGE], #16

 // Load next key stride
 ld1  {\k3\().4s}, [KEY], #16

 // Add message words to key words
 add  T0.4s, T3.4s, \k0\().4s
 add  T1.4s, T3.4s, \k1\().4s
 add  T2.4s, T3.4s, \k2\().4s
 add  T3.4s, T3.4s, \k3\().4s

 // Multiply 32x32 => 64 and accumulate
 mov  T4.d[0], T0.d[1]
 mov  T5.d[0], T1.d[1]
 mov  T6.d[0], T2.d[1]
 mov  T7.d[0], T3.d[1]
 umlal  PASS0_SUMS.2d, T0.2s, T4.2s
 umlal  PASS1_SUMS.2d, T1.2s, T5.2s
 umlal  PASS2_SUMS.2d, T2.2s, T6.2s
 umlal  PASS3_SUMS.2d, T3.2s, T7.2s
.endm

/*
 * void nh_neon(const u32 *key, const u8 *message, size_t message_len,
 * __le64 hash[NH_NUM_PASSES])
 *
 * It's guaranteed that message_len % 16 == 0.
 */

SYM_TYPED_FUNC_START(nh_neon)

 ld1  {K0.4s,K1.4s}, [KEY], #32
   movi  PASS0_SUMS.2d, #0
   movi  PASS1_SUMS.2d, #0
 ld1  {K2.4s}, [KEY], #16
   movi  PASS2_SUMS.2d, #0
   movi  PASS3_SUMS.2d, #0

 subs  MESSAGE_LEN, MESSAGE_LEN, #64
 blt  .Lloop4_done
.Lloop4:
 _nh_stride K0, K1, K2, K3
 _nh_stride K1, K2, K3, K0
 _nh_stride K2, K3, K0, K1
 _nh_stride K3, K0, K1, K2
 subs  MESSAGE_LEN, MESSAGE_LEN, #64
 bge  .Lloop4

.Lloop4_done:
 ands  MESSAGE_LEN, MESSAGE_LEN, #63
 beq  .Ldone
 _nh_stride K0, K1, K2, K3

 subs  MESSAGE_LEN, MESSAGE_LEN, #16
 beq  .Ldone
 _nh_stride K1, K2, K3, K0

 subs  MESSAGE_LEN, MESSAGE_LEN, #16
 beq  .Ldone
 _nh_stride K2, K3, K0, K1

.Ldone:
 // Sum the accumulators for each pass, then store the sums to 'hash'
 addp  T0.2d, PASS0_SUMS.2d, PASS1_SUMS.2d
 addp  T1.2d, PASS2_SUMS.2d, PASS3_SUMS.2d
 st1  {T0.16b,T1.16b}, [HASH]
 ret
SYM_FUNC_END(nh_neon)

Messung V0.5
C=96 H=100 G=97

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.