From 33773e3498052f391c30bf55cec881dec05f5da8 Mon Sep 17 00:00:00 2001 From: Hanno Becker Date: Fri, 11 Oct 2024 16:02:07 +0100 Subject: [PATCH] Document bounds and remove redundant reductions (#208) * Remove redundant `poly_reduce()` calls The typical flow of arithmetic data is as follows: - Forward NTT - Basemul - One of: * Remove Montgomery factor + invNTT * Remove Montgomery factor - Reduction - Serialization At present, `poly_reduce()` features in multple places in this flow, serving multiple purposes: First, it is used after the fwd NTT and after the base mul. The purpose of those `poly_reduce()` calls is to merely keep the data small, with details of canonicity and sign being irrelevant. Second, `poly_reduce()` is used ahead of serialization: Here, we do need _unsigned_ canonical representatives. The C and AArch64 versions of `poly_reduce()` produce _signed_ canonical Barret reduction, forcing the serialization functions to complete the normalization through a conditional addition. The AVX2 code uses an _unsigned_ 'almost-canonical' `poly_reduce()`, giving a representative in [0,q] (inclusive upper bound!) which are subject to conditional _subtraction_ during serialization. In a nutshell, conceptually we'd like an unsigned canonical reduction ahead of serialization, and non-strict (faster) reduction everywhere else. Looking closer, the uses of `poly_reduce()` after the forward NTT and after the basemul appear unnecessary. Reduction after basemul: - Basemul output fed into `poly_tomont()` is reduced through the Montgomery multiplication that's done in `poly_tomont()`. - Basemul output fed into inv NTT is potentially problematic if not reduced: The invNTT does currently _not_ reduce its input. _However_, the invNTT does need a scaling by `mont^2/128`. This scaling is currently happening at the _end_ of the invNTT. Instead moving it to the _start_ of the invNTT reduces the input in the same way as `poly_tomont()` does. This change affects both the C reference NTT as well as the AArch64 NTT. Reduction after fwd NTT: A reduction after the forward NTT is not needed since base multiplication does not overflow provided _one_ factor is bound by q, which is always the case in MLKEM. Signed-off-by: Hanno Becker * Document and runtime-check bounds for arithmetic data This commit documents bounds on arithmetic data as it flows through common operations like NTT, invNTT and basemul. Moreover, it introduces debug macros like POLY_BOUND or POLYVEC_BOUND which can be used in debug builds to check the documented bounds at runtime. Moreover, at a later point those assertions should be proved by converting them to CBMC assertions. Finally, the bounds show that canonicity of the result of the NTT is not needed, and this commit removes the Barrett reduction at the end of the AArch64 ASM NTT. Signed-off-by: Hanno Becker * Reduce pk & sk after unpacking It's not standards-required for the unpacked sk to be be reduced (its coefficients can be up to 2^12 in size), but our bounds reasoning assumes it to be. For pk, it must be checked at the top-level that the byte stream unpacks to coefficients in bound, which however has not yet been implemented. Until that's done, reduce the pk after unpacking, so that the lower level routines are only called with canonical pk. Signed-off-by: Hanno Becker * Add Python script confirming Barrett/Montgomery relation and bound Signed-off-by: Hanno Becker * Remove TODO in AArch64 intt_clean.S Signed-off-by: Hanno Becker * Add bound for fwd NTT and static non-overflow assertion in keygen Signed-off-by: Hanno Becker * Fix formatting Signed-off-by: Hanno Becker * Address further review feedback Signed-off-by: Hanno Becker * Introduce single contractual bound for [inv]NTT output Reasoning about safety of the C 'frontend' should not depend on details of the arithmetic backend (ref/native). We thus introduce single bounds NTT_BOUND and INVNTT_BOUND on the absolute values of the output of the [inv]NTT that any implementation needs to satisfy. For every specific implementation, we still define and check (in debug builds) for tighter bounds, plus add a static assertion that the implementation-specific bound is smaller than the contractual bound. Signed-off-by: Hanno Becker * Rewrite bounds-checking macros to work with poly and poly_mulcache Signed-off-by: Hanno Becker * Fix typo in ntt.c Signed-off-by: Hanno Becker * Document output bounds for poly_mulcache_compute() Signed-off-by: Hanno Becker * Document+Check input bound for polyvec_basemul_acc_montgomery_cached Signed-off-by: Hanno Becker * Add input bounds check for NTT Signed-off-by: Hanno Becker * Make wording of bounds estimates more accessible Signed-off-by: Hanno Becker * Document implementation-defined C behaviour in montgomery_reduce() See https://github.com/pq-crystals/kyber/issues/77 Signed-off-by: Hanno Becker * Run functional CI in debugging mode Signed-off-by: Hanno Becker --------- Signed-off-by: Hanno Becker --- .github/workflows/ci.yml | 10 +- mk/schemes.mk | 2 +- mlkem/debug/debug.c | 39 + mlkem/debug/debug.h | 105 + mlkem/indcpa.c | 26 + .../native/aarch64/intt_123_45_67_twiddles.S | 5 +- mlkem/native/aarch64/intt_clean.S | 68 +- mlkem/native/aarch64/intt_opt.S | 1388 +++++++------ mlkem/native/aarch64/ntt_clean.S | 34 +- mlkem/native/aarch64/ntt_opt.S | 1295 ++++++------ mlkem/native/aarch64/polyvec_clean.S | 33 +- mlkem/native/aarch64/polyvec_opt.S | 1799 ++++++++--------- mlkem/native/aarch64/profiles/clean.h | 2 + mlkem/native/aarch64/profiles/opt.h | 2 + mlkem/native/x86_64/profiles/default.h | 9 + mlkem/ntt.c | 99 +- mlkem/ntt.h | 9 + mlkem/poly.c | 45 +- mlkem/polyvec.c | 20 +- mlkem/reduce.c | 43 +- mlkem/reduce.h | 5 + test/test_bounds.py | 161 ++ 22 files changed, 2883 insertions(+), 2316 deletions(-) create mode 100644 mlkem/debug/debug.c create mode 100644 mlkem/debug/debug.h create mode 100644 test/test_bounds.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3f2ae47b..0e18669bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,10 +42,18 @@ jobs: runs-on: ${{ matrix.target.runner }} steps: - uses: actions/checkout@v4 - - name: native tests + - name: native build uses: ./.github/actions/multi-functest with: compile_mode: native + func: false + nistkat: false + kat: falst + - name: native tests (+debug) + uses: ./.github/actions/multi-functest + with: + compile_mode: native + cflags: "-DMLKEM_DEBUG" - name: cross tests (opt only) if: ${{ matrix.target.runner == 'pqcp-arm64' && (success() || failure()) }} uses: ./.github/actions/multi-functest diff --git a/mk/schemes.mk b/mk/schemes.mk index 4a1b4ba12..936cdcbdd 100644 --- a/mk/schemes.mk +++ b/mk/schemes.mk @@ -1,5 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 -SOURCES = $(wildcard mlkem/*.c) +SOURCES = $(wildcard mlkem/*.c) $(wildcard mlkem/debug/*.c) ifeq ($(OPT),1) SOURCES += $(wildcard mlkem/native/aarch64/*.[csS]) $(wildcard mlkem/native/x86_64/*.[csS]) CPPFLAGS += -DMLKEM_USE_NATIVE diff --git a/mlkem/debug/debug.c b/mlkem/debug/debug.c new file mode 100644 index 000000000..4aab17dc3 --- /dev/null +++ b/mlkem/debug/debug.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +#include "debug.h" + +#if defined(MLKEM_DEBUG) + +static char debug_buf[256]; + +void mlkem_debug_check_bounds(const char *file, int line, + const char *description, const int16_t *ptr, + unsigned len, int16_t lower_bound_inclusive, + int16_t upper_bound_inclusive) { + int err = 0; + unsigned i; + for (i = 0; i < len; i++) { + int16_t val = ptr[i]; + if (val < lower_bound_inclusive || val > upper_bound_inclusive) { + snprintf(debug_buf, sizeof(debug_buf), + "%s, index %u, value %d out of bounds (%d,%d)", description, i, + (int)val, (int)lower_bound_inclusive, + (int)upper_bound_inclusive); + mlkem_debug_print_error(file, line, debug_buf); + err = 1; + } + } + + if (err == 1) + exit(1); +} + +void mlkem_debug_print_error(const char *file, int line, const char *msg) { + fprintf(stderr, "[ERROR:%s:%04d] %s\n", file, line, msg); + fflush(stderr); +} + +#else /* MLKEM_DEBUG */ + +int empty_cu_debug; + +#endif /* MLKEM_DEBUG */ diff --git a/mlkem/debug/debug.h b/mlkem/debug/debug.h new file mode 100644 index 000000000..23b39e801 --- /dev/null +++ b/mlkem/debug/debug.h @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef MLKEM_DEBUG_H +#define MLKEM_DEBUG_H + +#if defined(MLKEM_DEBUG) +#include +#include + +/************************************************* + * Name: mlkem_debug_check_bounds + * + * Description: Check whether values in an array of int16_t + * are within specified bounds. + * + * Prints an error message to stderr and calls + * exit(1) if not. + * + * Arguments: - file: filename + * - line: line number + * - description: Textual description of check + * - ptr: Base of array to be checked + * - len: Number of int16_t in ptr + * - lower_bound_inclusive: Inclusive lower bound + * - upper_bound_inclusive: Inclusive upper bound + **************************************************/ +void mlkem_debug_check_bounds(const char *file, int line, + const char *description, const int16_t *ptr, + unsigned len, int16_t lower_bound_inclusive, + int16_t upper_bound_inclusive); + +/* Print error message to stderr alongside file and line information */ +void mlkem_debug_print_error(const char *file, int line, const char *msg); + +/* Check absolute bounds in array of int16_t's + * ptr: Base of array, expression of type int16_t* + * len: Number of int16_t in array + * abs_bound: Exclusive upper bound on absolute value to check + * msg: Message to print on failure */ +#define BOUND(ptr, len, abs_bound, msg) \ + do { \ + mlkem_debug_check_bounds(__FILE__, __LINE__, (msg), (int16_t *)(ptr), \ + (len), -((abs_bound)-1), ((abs_bound)-1)); \ + } while (0) + +/* Check absolute bounds on coefficients in polynomial or mulcache + * ptr: poly* or poly_mulcache* pointer to polynomial (cache) to check + * abs_bound: Exclusive upper bound on absolute value to check + * msg: Message to print on failure */ +#define POLY_BOUND_MSG(ptr, abs_bound, msg) \ + BOUND((ptr)->coeffs, (sizeof((ptr)->coeffs) / sizeof(int16_t)), (abs_bound), \ + msg) + +/* Check absolute bounds on coefficients in polynomial + * ptr: poly* of poly_mulcache* pointer to polynomial (cache) to check + * abs_bound: Exclusive upper bound on absolute value to check */ +#define POLY_BOUND(ptr, abs_bound) \ + POLY_BOUND_MSG((ptr), (abs_bound), "poly bound for " #ptr) + +/* Check absolute bounds on coefficients in vector of polynomials + * ptr: polyvec* or polyvec_mulcache* pointer to vector of polynomials to check + * abs_bound: Exclusive upper bound on absolute value to check */ +#define POLYVEC_BOUND(ptr, abs_bound) \ + do { \ + for (unsigned _debug_polyvec_bound_idx = 0; \ + _debug_polyvec_bound_idx < KYBER_K; _debug_polyvec_bound_idx++) \ + POLY_BOUND_MSG(&(ptr)->vec[_debug_polyvec_bound_idx], (abs_bound), \ + "polyvec bound for " #ptr ".vec[i]"); \ + } while (0) + +// Following AWS-LC to define a C99-compliant static assert +#define MLKEM_CONCAT(left, right) left##right +#define MLKEM_STATIC_ASSERT_DEFINE(cond, msg) \ + typedef struct { \ + unsigned int MLKEM_CONCAT(static_assertion_, msg) : (cond) ? 1 : -1; \ + } MLKEM_CONCAT(static_assertion_, msg) __attribute__((unused)); + +#define MLKEM_STATIC_ASSERT_ADD_LINE0(cond, suffix) \ + MLKEM_STATIC_ASSERT_DEFINE(cond, MLKEM_CONCAT(at_line_, suffix)) +#define MLKEM_STATIC_ASSERT_ADD_LINE1(cond, line, suffix) \ + MLKEM_STATIC_ASSERT_ADD_LINE0(cond, MLKEM_CONCAT(line, suffix)) +#define MLKEM_STATIC_ASSERT_ADD_LINE2(cond, suffix) \ + MLKEM_STATIC_ASSERT_ADD_LINE1(cond, __LINE__, suffix) +#define MLKEM_STATIC_ASSERT_ADD_ERROR(cond, suffix) \ + MLKEM_STATIC_ASSERT_ADD_LINE2(cond, MLKEM_CONCAT(_error_is_, suffix)) +#define STATIC_ASSERT(cond, error) MLKEM_STATIC_ASSERT_ADD_ERROR(cond, error) + +#else /* MLKEM_DEBUG */ + +#define BOUND(...) \ + do { \ + } while (0) +#define POLY_BOUND(...) \ + do { \ + } while (0) +#define POLYVEC_BOUND(...) \ + do { \ + } while (0) +#define POLY_BOUND_MSG(...) \ + do { \ + } while (0) +#define STATIC_ASSERT(...) + +#endif /* MLKEM_DEBUG */ + +#endif /* MLKEM_DEBUG_H */ diff --git a/mlkem/indcpa.c b/mlkem/indcpa.c index ba197c933..7dcfbee90 100644 --- a/mlkem/indcpa.c +++ b/mlkem/indcpa.c @@ -15,6 +15,7 @@ #include "symmetric.h" #include "arith_native.h" +#include "debug/debug.h" /************************************************* * Name: pack_pk @@ -29,6 +30,7 @@ **************************************************/ static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], polyvec *pk, const uint8_t seed[KYBER_SYMBYTES]) { + POLYVEC_BOUND(pk, KYBER_Q); polyvec_tobytes(r, pk); memcpy(r + KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); } @@ -48,6 +50,11 @@ static void unpack_pk(polyvec *pk, uint8_t seed[KYBER_SYMBYTES], const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) { polyvec_frombytes(pk, packedpk); memcpy(seed, packedpk + KYBER_POLYVECBYTES, KYBER_SYMBYTES); + + // TODO! pk must be subject to a "modulus check" at the top-level + // crypto_kem_enc_derand(). Once that's done, the reduction is no + // longer necessary here. + polyvec_reduce(pk); } /************************************************* @@ -60,6 +67,7 @@ static void unpack_pk(polyvec *pk, uint8_t seed[KYBER_SYMBYTES], *key) **************************************************/ static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) { + POLYVEC_BOUND(sk, KYBER_Q); polyvec_tobytes(r, sk); } @@ -76,6 +84,7 @@ static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) { static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) { polyvec_frombytes(sk, packedsk); + polyvec_reduce(sk); } /************************************************* @@ -245,6 +254,9 @@ void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], * - const uint8_t *coins: pointer to input randomness * (of length KYBER_SYMBYTES bytes) **************************************************/ + +STATIC_ASSERT(NTT_BOUND + KYBER_Q < INT16_MAX, indcpa_enc_bound_0) + void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], const uint8_t coins[KYBER_SYMBYTES]) { @@ -289,8 +301,10 @@ void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], poly_tomont(&pkpv.vec[i]); } + // Arithmetic cannot overflow, see static assertion at the top polyvec_add(&pkpv, &pkpv, &e); polyvec_reduce(&pkpv); + polyvec_reduce(&skpv); pack_sk(sk, &skpv); pack_pk(pk, &pkpv, publicseed); @@ -311,6 +325,12 @@ void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], * - const uint8_t *coins: pointer to input random coins used as *seed (of length KYBER_SYMBYTES) to deterministically generate all randomness **************************************************/ + +// Check that the arithmetic in indcpa_enc() does not overflow +STATIC_ASSERT(INVNTT_BOUND + KYBER_ETA1 < INT16_MAX, indcpa_enc_bound_0) +STATIC_ASSERT(INVNTT_BOUND + KYBER_ETA2 + KYBER_Q < INT16_MAX, + indcpa_enc_bound_1) + void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], const uint8_t m[KYBER_INDCPA_MSGBYTES], const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], @@ -355,6 +375,7 @@ void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], polyvec_invntt_tomont(&b); poly_invntt_tomont(&v); + // Arithmetic cannot overflow, see static assertion at the top polyvec_add(&b, &b, &ep); poly_add(&v, &v, &epp); poly_add(&v, &v, &k); @@ -377,6 +398,10 @@ void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], * - const uint8_t *sk: pointer to input secret key * (of length KYBER_INDCPA_SECRETKEYBYTES) **************************************************/ + +// Check that the arithmetic in indcpa_dec() does not overflow +STATIC_ASSERT(INVNTT_BOUND + KYBER_Q < INT16_MAX, indcpa_dec_bound_0) + void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], const uint8_t c[KYBER_INDCPA_BYTES], const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]) { @@ -390,6 +415,7 @@ void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], polyvec_basemul_acc_montgomery(&mp, &skpv, &b); poly_invntt_tomont(&mp); + // Arithmetic cannot overflow, see static assertion at the top poly_sub(&mp, &v, &mp); poly_reduce(&mp); diff --git a/mlkem/native/aarch64/intt_123_45_67_twiddles.S b/mlkem/native/aarch64/intt_123_45_67_twiddles.S index c029b404d..11c817cfc 100644 --- a/mlkem/native/aarch64/intt_123_45_67_twiddles.S +++ b/mlkem/native/aarch64/intt_123_45_67_twiddles.S @@ -477,9 +477,8 @@ roots_l34: .short 0 .short 0 roots_l012: -// layer 0 root modified to include ninv -.short 266 // originally: 1600 -.short 2618 // originally: 15749 +.short 1600 +.short 15749 .short 40 .short 394 .short 749 diff --git a/mlkem/native/aarch64/intt_clean.S b/mlkem/native/aarch64/intt_clean.S index 5e5061df4..73d1eb9c2 100644 --- a/mlkem/native/aarch64/intt_clean.S +++ b/mlkem/native/aarch64/intt_clean.S @@ -29,7 +29,16 @@ // Needed to provide ASM_LOAD directive #include "common.i" +// Bounds: +// If C is chosen so that |src| < q * C, then |dst| < q * (0.0508 * C + 1/2) +// +// See mlken/reduce.c and test/test_bounds.py for more details. .macro mulmodq dst, src, const, idx0, idx1 + // Signed barrett multiplication using + // round-to-nearest-even-integer approximation. + // Following https://eprint.iacr.org/2021/986.pdf, this + // is functionally the same as a signed Montgomery multiplication + // with a suitable constant of absolute value < q. sqrdmulh t2.8h, \src\().8h, \const\().h[\idx1\()] mul \dst\().8h, \src\().8h, \const\().h[\idx0\()] mls \dst\().8h, t2.8h, consts.h[0] @@ -226,11 +235,41 @@ _intt_asm_clean: ASM_LOAD(xtmp, const_addr) ld1 {consts.8h}, [xtmp] + ninv .req v29 + ninv_tw .req v30 + + ASM_LOAD(xtmp, ninv_addr) + ld1r {ninv.8h}, [xtmp] + ASM_LOAD(xtmp, ninv_tw_addr) + ld1r {ninv_tw.8h}, [xtmp] + + mov inp, in + mov count, #8 + +scale_start: + + ldr q_data0, [inp, #(16*0)] + ldr q_data1, [inp, #(16*1)] + ldr q_data2, [inp, #(16*2)] + ldr q_data3, [inp, #(16*3)] + + mul_ninv data0, data1, data2, data3, data0, data1, data2, data3 + // Bounds: Absolute value < q + + str q_data0, [inp], #64 + str q_data1, [inp, #(-64 + 16*1)] + str q_data2, [inp, #(-64 + 16*2)] + str q_data3, [inp, #(-64 + 16*3)] + + subs count, count, #1 + cbnz count, scale_start + mov inp, in mov count, #8 .p2align 2 layer4567_start: + ldr q_data0, [inp, #(16*0)] ldr q_data1, [inp, #(16*1)] ldr q_data2, [inp, #(16*2)] @@ -243,9 +282,17 @@ layer4567_start: // Layer 7 gs_butterfly_v data0, data1, root1, root1_tw gs_butterfly_v data2, data3, root2, root2_tw + // Bounds: + // data0, data2: < 2q + // data1, data3: < q + // Layer 6 gs_butterfly_v data0, data2, root0, root0_tw gs_butterfly_v data1, data3, root0, root0_tw + // Bounds: + // data0: < 4q + // data1: < 2q + // data2, data3: < q transpose4 data @@ -254,15 +301,21 @@ layer4567_start: // Layer 5 gs_butterfly data0, data1, root0, 2, 3 gs_butterfly data2, data3, root0, 4, 5 + // Max bound: 8q + // Not all of those reductions are needed, but the bounds tracking + // is easier if we uniformly reduce at this point. barrett_reduce data0 barrett_reduce data2 barrett_reduce data1 barrett_reduce data3 + // Bounds: q/2 + // Layer 4 gs_butterfly data0, data2, root0, 0, 1 gs_butterfly data1, data3, root0, 0, 1 + // Bounds: < q str q_data0, [inp], #(64) str q_data1, [inp, #(-64 + 16*1)] @@ -274,14 +327,6 @@ layer4567_start: // --------------------------------------------------------------------- - ninv .req v29 - ninv_tw .req v30 - - ASM_LOAD(xtmp, ninv_addr) - ld1r {ninv.8h}, [xtmp] - ASM_LOAD(xtmp, ninv_tw_addr) - ld1r {ninv_tw.8h}, [xtmp] - mov count, #4 ASM_LOAD(r_ptr0, roots_l012) load_roots_123 @@ -314,16 +359,13 @@ layer123_start: gs_butterfly data2, data6, root0, 0, 1 gs_butterfly data3, data7, root0, 0, 1 + // Bounds: < 8q + str q_data4, [in, #(4*(512/8))] str q_data5, [in, #(5*(512/8))] str q_data6, [in, #(6*(512/8))] str q_data7, [in, #(7*(512/8))] - // Scale half the coeffs by 1/n; for the other half, the scaling has - // been merged into the multiplication with the twiddle factor on the - // last layer. - mul_ninv data0, data1, data2, data3, data0, data1, data2, data3 - str q_data0, [in], #(16) str q_data1, [in, #(-16 + 1*(512/8))] str q_data2, [in, #(-16 + 2*(512/8))] diff --git a/mlkem/native/aarch64/intt_opt.S b/mlkem/native/aarch64/intt_opt.S index 4e2e6e97b..873790c96 100644 --- a/mlkem/native/aarch64/intt_opt.S +++ b/mlkem/native/aarch64/intt_opt.S @@ -29,6 +29,10 @@ // Needed to provide ASM_LOAD directive #include "common.i" +// Bounds: +// If C is chosen so that |src| < q * C, then |dst| < q * (0.0508 * C + 1/2) +// +// See mlken/reduce.c and test/test_bounds.py for more details. .macro mulmodq dst, src, const, idx0, idx1 sqrdmulh t2.8h, \src\().8h, \const\().h[\idx1\()] mul \dst\().8h, \src\().8h, \const\().h[\idx0\()] @@ -226,6 +230,156 @@ _intt_asm_opt: ASM_LOAD(xtmp, const_addr) ld1 {consts.8h}, [xtmp] + ninv .req v29 + ninv_tw .req v30 + + ASM_LOAD(xtmp, ninv_addr) + ld1r {ninv.8h}, [xtmp] + ASM_LOAD(xtmp, ninv_tw_addr) + ld1r {ninv_tw.8h}, [xtmp] + + mov inp, in + mov count, #8 + + // Instructions: 3 + // Expected cycles: 5 + // Expected IPC: 0.60 + // + // Cycle bound: 5.0 + // IPC bound: 0.60 + // + // Wall time: 0.00s + // User time: 0.00s + // + // ----- cycle (expected) ------> + // 0 25 + // |------------------------|---- + ldr q12, [x1, #16] // *............................. + ldr q31, [x1, #32] // ..*........................... + ldr q6, [x1, #48] // ....*......................... + + // ------ cycle (expected) ------> + // 0 25 + // |------------------------|----- + // ldr q12, [x1, #16] // *.............................. + // ldr q31, [x1, #32] // ..*............................ + // ldr q6, [x1, #48] // ....*.......................... + + sub count, count, #1 +scale_start: + // Instructions: 20 + // Expected cycles: 24 + // Expected IPC: 0.83 + // + // Cycle bound: 24.0 + // IPC bound: 0.83 + // + // Wall time: 0.51s + // User time: 0.51s + // + // ----- cycle (expected) ------> + // 0 25 + // |------------------------|---- + ldr q10, [x1, #0] // *............................. + sqrdmulh v13.8H, v12.8H, v30.8H // ..*........................... + mul v21.8H, v12.8H, v29.8H // ...*.......................... + sqrdmulh v3.8H, v10.8H, v30.8H // ....*......................... + mul v10.8H, v10.8H, v29.8H // .....*........................ + sqrdmulh v12.8H, v31.8H, v30.8H // ......*....................... + mls v21.8H, v13.8H, v7.H[0] // .......*...................... + mul v13.8H, v31.8H, v29.8H // ........*..................... + mls v10.8H, v3.8H, v7.H[0] // .........*.................... + sqrdmulh v3.8H, v6.8H, v30.8H // ..........*................... + mul v6.8H, v6.8H, v29.8H // ...........*.................. + mls v13.8H, v12.8H, v7.H[0] // ............*................. + str q10, [x1], #64 // .............*................ + ldr q12, [x1, #16] // ..............e............... + str q21, [x1, #-48] // ................*............. + mls v6.8H, v3.8H, v7.H[0] // .................*............ + str q13, [x1, #-32] // ..................*........... + ldr q31, [x1, #32] // ...................e.......... + str q6, [x1, #-16] // .....................*........ + ldr q6, [x1, #48] // ......................e....... + + // ------ cycle (expected) -------> + // 0 25 + // |------------------------|------ + // ldr q8, [x1, #(16*0)] // ..........*..................... + // ldr q9, [x1, #(16*1)] // e.........'.............~....... + // ldr q10, [x1, #(16*2)] // .....e....'..................~.. + // ldr q11, [x1, #(16*3)] // ........e.'..................... + // sqrdmulh v27.8h, v8.8h, v30.8h // ..........'...*................. + // mul v8.8h, v8.8h, v29.8h // ..........'....*................ + // mls v8.8h, v27.8h, v7.h[0] // ..........'........*............ + // sqrdmulh v27.8h, v9.8h, v30.8h // ..........'.*................... + // mul v9.8h, v9.8h, v29.8h // ..........'..*.................. + // mls v9.8h, v27.8h, v7.h[0] // ..........'......*.............. + // sqrdmulh v27.8h, v10.8h, v30.8h // ..........'.....*............... + // mul v10.8h, v10.8h, v29.8h // ..........'.......*............. + // mls v10.8h, v27.8h, v7.h[0] // ..........'...........*......... + // sqrdmulh v27.8h, v11.8h, v30.8h // ..........'.........*........... + // mul v11.8h, v11.8h, v29.8h // ..........'..........*.......... + // mls v11.8h, v27.8h, v7.h[0] // ...~......'................*.... + // str q8, [x1], #64 // ..........'............*........ + // str q9, [x1, #(-64 + 16*1)] // ..~.......'...............*..... + // str q10, [x1, #(-64 + 16*2)] // ....~.....'.................*... + // str q11, [x1, #(-64 + 16*3)] // .......~..'....................* + + sub count, count, #1 + cbnz count, scale_start + // Instructions: 17 + // Expected cycles: 20 + // Expected IPC: 0.85 + // + // Cycle bound: 20.0 + // IPC bound: 0.85 + // + // Wall time: 0.16s + // User time: 0.16s + // + // ----- cycle (expected) ------> + // 0 25 + // |------------------------|---- + sqrdmulh v0.8H, v6.8H, v30.8H // *............................. + mul v13.8H, v6.8H, v29.8H // .*............................ + ldr q10, [x1, #0] // ..*........................... + mul v23.8H, v31.8H, v29.8H // ....*......................... + mls v13.8H, v0.8H, v7.H[0] // .....*........................ + sqrdmulh v4.8H, v10.8H, v30.8H // ......*....................... + mul v18.8H, v10.8H, v29.8H // .......*...................... + sqrdmulh v10.8H, v12.8H, v30.8H // ........*..................... + mul v21.8H, v12.8H, v29.8H // .........*.................... + sqrdmulh v0.8H, v31.8H, v30.8H // ..........*................... + mls v18.8H, v4.8H, v7.H[0] // ...........*.................. + str q13, [x1, #48] // ............*................. + mls v21.8H, v10.8H, v7.H[0] // .............*................ + mls v23.8H, v0.8H, v7.H[0] // ..............*............... + str q18, [x1], #64 // ...............*.............. + str q21, [x1, #-48] // .................*............ + str q23, [x1, #-32] // ...................*.......... + + // ------ cycle (expected) ------> + // 0 25 + // |------------------------|----- + // ldr q10, [x1, #0] // ..*............................ + // sqrdmulh v13.8H, v12.8H, v30.8H // ........*...................... + // mul v21.8H, v12.8H, v29.8H // .........*..................... + // sqrdmulh v3.8H, v10.8H, v30.8H // ......*........................ + // mul v10.8H, v10.8H, v29.8H // .......*....................... + // sqrdmulh v12.8H, v31.8H, v30.8H // ..........*.................... + // mls v21.8H, v13.8H, v7.H[0] // .............*................. + // mul v13.8H, v31.8H, v29.8H // ....*.......................... + // mls v10.8H, v3.8H, v7.H[0] // ...........*................... + // sqrdmulh v3.8H, v6.8H, v30.8H // *.............................. + // mul v6.8H, v6.8H, v29.8H // .*............................. + // mls v13.8H, v12.8H, v7.H[0] // ..............*................ + // str q10, [x1], #64 // ...............*............... + // str q21, [x1, #-48] // .................*............. + // mls v6.8H, v3.8H, v7.H[0] // .....*......................... + // str q13, [x1, #-32] // ...................*........... + // str q6, [x1, #-16] // ............*.................. + + mov inp, in mov count, #8 @@ -243,32 +397,32 @@ _intt_asm_opt: // ----- cycle (expected) ------> // 0 25 // |------------------------|---- - ldr q2, [x1, #0] // *............................. - ldr q22, [x1, #16] // ..*........................... - ldr q23, [x1, #32] // ....*......................... - ldr q17, [x1, #48] // ......*....................... - ldr q24, [x4], #(6*16) // ........*..................... - trn1 v30.4S, v23.4S, v17.4S // ..........*................... - ldr q6, [x4, #-80] // ...........*.................. - ldr q1, [x4, #-64] // .............*................ - ldr q9, [x4, #-48] // ...............*.............. - ldr q5, [x4, #-32] // .................*............ - ldr q3, [x4, #-16] // ...................*.......... + ldr q10, [x1, #0] // *............................. + ldr q21, [x1, #16] // ..*........................... + ldr q31, [x1, #32] // ....*......................... + ldr q12, [x1, #48] // ......*....................... + ldr q5, [x4], #(6*16) // ........*..................... + trn1 v30.4S, v31.4S, v12.4S // ..........*................... + ldr q9, [x4, #-80] // ...........*.................. + ldr q15, [x4, #-64] // .............*................ + ldr q6, [x4, #-48] // ...............*.............. + ldr q25, [x4, #-32] // .................*............ + ldr q20, [x4, #-16] // ...................*.......... // ------ cycle (expected) ------> // 0 25 // |------------------------|----- - // ldr q2, [x1, #0] // *.............................. - // ldr q22, [x1, #16] // ..*............................ - // ldr q23, [x1, #32] // ....*.......................... - // ldr q17, [x1, #48] // ......*........................ - // trn1 v30.4S, v23.4S, v17.4S // ..........*.................... - // ldr q24, [x4], #(6*16) // ........*...................... - // ldr q6, [x4, #-80] // ...........*................... - // ldr q1, [x4, #-64] // .............*................. - // ldr q9, [x4, #-48] // ...............*............... - // ldr q5, [x4, #-32] // .................*............. - // ldr q3, [x4, #-16] // ...................*........... + // ldr q10, [x1, #0] // *.............................. + // ldr q21, [x1, #16] // ..*............................ + // ldr q31, [x1, #32] // ....*.......................... + // ldr q12, [x1, #48] // ......*........................ + // trn1 v30.4S, v31.4S, v12.4S // ..........*.................... + // ldr q5, [x4], #(6*16) // ........*...................... + // ldr q9, [x4, #-80] // ...........*................... + // ldr q15, [x4, #-64] // .............*................. + // ldr q6, [x4, #-48] // ...............*............... + // ldr q25, [x4, #-32] // .................*............. + // ldr q20, [x4, #-16] // ...................*........... sub count, count, #1 layer4567_start: @@ -279,95 +433,95 @@ layer4567_start: // Cycle bound: 94.0 // IPC bound: 0.88 // - // Wall time: 3.39s - // User time: 3.39s + // Wall time: 3.34s + // User time: 3.34s // // ------------------------------------- cycle (expected) --------------------------------------> // 0 25 50 75 // |------------------------|------------------------|------------------------|------------------ - trn1 v26.4S, v2.4S, v22.4S // *............................................................................................. - trn2 v2.4S, v2.4S, v22.4S // .*............................................................................................ - trn2 v22.4S, v23.4S, v17.4S // ..*........................................................................................... - trn2 v10.2D, v26.2D, v30.2D // ...*.......................................................................................... - trn1 v26.2D, v26.2D, v30.2D // ....*......................................................................................... - trn2 v17.2D, v2.2D, v22.2D // .....*........................................................................................ - trn1 v2.2D, v2.2D, v22.2D // ......*....................................................................................... - sub v22.8H, v10.8H, v17.8H // .......*...................................................................................... - add v10.8H, v10.8H, v17.8H // ........*..................................................................................... - sub v17.8H, v26.8H, v2.8H // .........*.................................................................................... - add v26.8H, v26.8H, v2.8H // ..........*................................................................................... - sqrdmulh v2.8H, v22.8H, v3.8H // ...........*.................................................................................. - sqrdmulh v30.8H, v17.8H, v9.8H // ............*................................................................................. - mul v17.8H, v17.8H, v1.8H // .............*................................................................................ - mul v22.8H, v22.8H, v5.8H // ..............*............................................................................... - sub v1.8H, v26.8H, v10.8H // ...............*.............................................................................. - add v26.8H, v26.8H, v10.8H // ................*............................................................................. - mls v17.8H, v30.8H, v7.H[0] // .................*............................................................................ - mls v22.8H, v2.8H, v7.H[0] // ..................*........................................................................... - sqrdmulh v2.8H, v1.8H, v6.8H // ...................*.......................................................................... - mul v10.8H, v1.8H, v24.8H // ....................*......................................................................... - ldr q1, [x3], #16 // .....................*........................................................................ - sub v30.8H, v17.8H, v22.8H // .......................*...................................................................... - mls v10.8H, v2.8H, v7.H[0] // ........................*..................................................................... - add v2.8H, v17.8H, v22.8H // .........................*.................................................................... - sqrdmulh v22.8H, v30.8H, v6.8H // ..........................*................................................................... - mul v17.8H, v30.8H, v24.8H // ...........................*.................................................................. - trn1 v30.4S, v26.4S, v2.4S // ............................*................................................................. - trn2 v26.4S, v26.4S, v2.4S // .............................*................................................................ - ldr q2, [x1, #64] // ..............................e............................................................... - mls v17.8H, v22.8H, v7.H[0] // ................................*............................................................. - ldr q22, [x1, #80] // .................................e............................................................ - ldr q23, [x1, #96] // ...................................e.......................................................... - trn1 v24.4S, v10.4S, v17.4S // .....................................*........................................................ - trn2 v10.4S, v10.4S, v17.4S // ......................................*....................................................... - ldr q17, [x1, #112] // .......................................e...................................................... - trn2 v6.2D, v30.2D, v24.2D // .........................................*.................................................... - trn2 v9.2D, v26.2D, v10.2D // ..........................................*................................................... - trn1 v30.2D, v30.2D, v24.2D // ...........................................*.................................................. - trn1 v26.2D, v26.2D, v10.2D // ............................................*................................................. - sub v10.8H, v6.8H, v9.8H // .............................................*................................................ - sub v24.8H, v30.8H, v26.8H // ..............................................*............................................... - add v26.8H, v30.8H, v26.8H // ...............................................*.............................................. - sqrdmulh v30.8H, v10.8H, v1.H[5] // ................................................*............................................. - sqrdmulh v5.8H, v24.8H, v1.H[3] // .................................................*............................................ - mul v24.8H, v24.8H, v1.H[2] // ..................................................*........................................... - mul v10.8H, v10.8H, v1.H[4] // ...................................................*.......................................... - add v6.8H, v6.8H, v9.8H // ....................................................*......................................... - sqdmulh v9.8H, v26.8H, v7.H[1] // .....................................................*........................................ - mls v24.8H, v5.8H, v7.H[0] // ......................................................*....................................... - mls v10.8H, v30.8H, v7.H[0] // .......................................................*...................................... - sqdmulh v30.8H, v6.8H, v7.H[1] // ........................................................*..................................... - srshr v9.8H, v9.8H, #11 // .........................................................*.................................... - sqdmulh v5.8H, v24.8H, v7.H[1] // ..........................................................*................................... - sqdmulh v3.8H, v10.8H, v7.H[1] // ...........................................................*.................................. - mls v26.8H, v9.8H, v7.H[0] // ............................................................*................................. + trn1 v13.4S, v10.4S, v21.4S // *............................................................................................. + trn2 v10.4S, v10.4S, v21.4S // .*............................................................................................ + trn2 v21.4S, v31.4S, v12.4S // ..*........................................................................................... + trn2 v3.2D, v13.2D, v30.2D // ...*.......................................................................................... + trn1 v13.2D, v13.2D, v30.2D // ....*......................................................................................... + trn2 v12.2D, v10.2D, v21.2D // .....*........................................................................................ + trn1 v10.2D, v10.2D, v21.2D // ......*....................................................................................... + sub v21.8H, v3.8H, v12.8H // .......*...................................................................................... + add v3.8H, v3.8H, v12.8H // ........*..................................................................................... + sub v12.8H, v13.8H, v10.8H // .........*.................................................................................... + add v13.8H, v13.8H, v10.8H // ..........*................................................................................... + sqrdmulh v10.8H, v21.8H, v20.8H // ...........*.................................................................................. + sqrdmulh v6.8H, v12.8H, v6.8H // ............*................................................................................. + mul v12.8H, v12.8H, v15.8H // .............*................................................................................ + mul v21.8H, v21.8H, v25.8H // ..............*............................................................................... + sub v30.8H, v13.8H, v3.8H // ...............*.............................................................................. + add v13.8H, v13.8H, v3.8H // ................*............................................................................. + mls v12.8H, v6.8H, v7.H[0] // .................*............................................................................ + mls v21.8H, v10.8H, v7.H[0] // ..................*........................................................................... + sqrdmulh v10.8H, v30.8H, v9.8H // ...................*.......................................................................... + mul v3.8H, v30.8H, v5.8H // ....................*......................................................................... + ldr q6, [x3], #16 // .....................*........................................................................ + sub v30.8H, v12.8H, v21.8H // .......................*...................................................................... + mls v3.8H, v10.8H, v7.H[0] // ........................*..................................................................... + add v10.8H, v12.8H, v21.8H // .........................*.................................................................... + sqrdmulh v21.8H, v30.8H, v9.8H // ..........................*................................................................... + mul v12.8H, v30.8H, v5.8H // ...........................*.................................................................. + trn1 v30.4S, v13.4S, v10.4S // ............................*................................................................. + trn2 v13.4S, v13.4S, v10.4S // .............................*................................................................ + ldr q10, [x1, #64] // ..............................e............................................................... + mls v12.8H, v21.8H, v7.H[0] // ................................*............................................................. + ldr q21, [x1, #80] // .................................e............................................................ + ldr q31, [x1, #96] // ...................................e.......................................................... + trn1 v5.4S, v3.4S, v12.4S // .....................................*........................................................ + trn2 v3.4S, v3.4S, v12.4S // ......................................*....................................................... + ldr q12, [x1, #112] // .......................................e...................................................... + trn2 v9.2D, v30.2D, v5.2D // .........................................*.................................................... + trn2 v15.2D, v13.2D, v3.2D // ..........................................*................................................... + trn1 v30.2D, v30.2D, v5.2D // ...........................................*.................................................. + trn1 v13.2D, v13.2D, v3.2D // ............................................*................................................. + sub v3.8H, v9.8H, v15.8H // .............................................*................................................ + sub v5.8H, v30.8H, v13.8H // ..............................................*............................................... + add v13.8H, v30.8H, v13.8H // ...............................................*.............................................. + sqrdmulh v30.8H, v3.8H, v6.H[5] // ................................................*............................................. + sqrdmulh v25.8H, v5.8H, v6.H[3] // .................................................*............................................ + mul v5.8H, v5.8H, v6.H[2] // ..................................................*........................................... + mul v3.8H, v3.8H, v6.H[4] // ...................................................*.......................................... + add v9.8H, v9.8H, v15.8H // ....................................................*......................................... + sqdmulh v15.8H, v13.8H, v7.H[1] // .....................................................*........................................ + mls v5.8H, v25.8H, v7.H[0] // ......................................................*....................................... + mls v3.8H, v30.8H, v7.H[0] // .......................................................*...................................... + sqdmulh v30.8H, v9.8H, v7.H[1] // ........................................................*..................................... + srshr v15.8H, v15.8H, #11 // .........................................................*.................................... + sqdmulh v25.8H, v5.8H, v7.H[1] // ..........................................................*................................... + sqdmulh v20.8H, v3.8H, v7.H[1] // ...........................................................*.................................. + mls v13.8H, v15.8H, v7.H[0] // ............................................................*................................. srshr v30.8H, v30.8H, #11 // .............................................................*................................ - srshr v9.8H, v5.8H, #11 // ..............................................................*............................... - srshr v5.8H, v3.8H, #11 // ...............................................................*.............................. - mls v6.8H, v30.8H, v7.H[0] // ................................................................*............................. - mls v24.8H, v9.8H, v7.H[0] // .................................................................*............................ - mls v10.8H, v5.8H, v7.H[0] // ..................................................................*........................... - trn1 v30.4S, v23.4S, v17.4S // ...................................................................e.......................... - sub v9.8H, v26.8H, v6.8H // ....................................................................*......................... - add v26.8H, v26.8H, v6.8H // .....................................................................*........................ - sub v6.8H, v24.8H, v10.8H // ......................................................................*....................... - sqrdmulh v5.8H, v9.8H, v1.H[1] // .......................................................................*...................... - mul v9.8H, v9.8H, v1.H[0] // ........................................................................*..................... - sqrdmulh v3.8H, v6.8H, v1.H[1] // .........................................................................*.................... - mul v1.8H, v6.8H, v1.H[0] // ..........................................................................*................... - add v10.8H, v24.8H, v10.8H // ...........................................................................*.................. - mls v9.8H, v5.8H, v7.H[0] // ............................................................................*................. - str q26, [x1], #(64) // .............................................................................*................ - mls v1.8H, v3.8H, v7.H[0] // ..............................................................................*............... - str q10, [x1, #-48] // ...............................................................................*.............. - ldr q24, [x4], #(6*16) // ................................................................................e............. - str q9, [x1, #-32] // ..................................................................................*........... - ldr q6, [x4, #-80] // ...................................................................................e.......... - str q1, [x1, #-16] // .....................................................................................*........ - ldr q1, [x4, #-64] // ......................................................................................e....... - ldr q9, [x4, #-48] // ........................................................................................e..... - ldr q5, [x4, #-32] // ..........................................................................................e... - ldr q3, [x4, #-16] // ............................................................................................e. + srshr v15.8H, v25.8H, #11 // ..............................................................*............................... + srshr v25.8H, v20.8H, #11 // ...............................................................*.............................. + mls v9.8H, v30.8H, v7.H[0] // ................................................................*............................. + mls v5.8H, v15.8H, v7.H[0] // .................................................................*............................ + mls v3.8H, v25.8H, v7.H[0] // ..................................................................*........................... + trn1 v30.4S, v31.4S, v12.4S // ...................................................................e.......................... + sub v15.8H, v13.8H, v9.8H // ....................................................................*......................... + add v13.8H, v13.8H, v9.8H // .....................................................................*........................ + sub v9.8H, v5.8H, v3.8H // ......................................................................*....................... + sqrdmulh v25.8H, v15.8H, v6.H[1] // .......................................................................*...................... + mul v15.8H, v15.8H, v6.H[0] // ........................................................................*..................... + sqrdmulh v20.8H, v9.8H, v6.H[1] // .........................................................................*.................... + mul v6.8H, v9.8H, v6.H[0] // ..........................................................................*................... + add v3.8H, v5.8H, v3.8H // ...........................................................................*.................. + mls v15.8H, v25.8H, v7.H[0] // ............................................................................*................. + str q13, [x1], #(64) // .............................................................................*................ + mls v6.8H, v20.8H, v7.H[0] // ..............................................................................*............... + str q3, [x1, #-48] // ...............................................................................*.............. + ldr q5, [x4], #(6*16) // ................................................................................e............. + str q15, [x1, #-32] // ..................................................................................*........... + ldr q9, [x4, #-80] // ...................................................................................e.......... + str q6, [x1, #-16] // .....................................................................................*........ + ldr q15, [x4, #-64] // ......................................................................................e....... + ldr q6, [x4, #-48] // ........................................................................................e..... + ldr q25, [x4, #-32] // ..........................................................................................e... + ldr q20, [x4, #-16] // ............................................................................................e. // ----------------------------------------------------------------- cycle (expected) ------------------------------------------------------------------> // 0 25 50 75 100 125 @@ -458,179 +612,171 @@ layer4567_start: sub count, count, #1 cbnz count, layer4567_start - // Instructions: 72 - // Expected cycles: 79 - // Expected IPC: 0.91 - // - // Cycle bound: 79.0 - // IPC bound: 0.91 - // - // Wall time: 9.61s - // User time: 9.61s - // - // ------------------------------ cycle (expected) ------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|--- - trn1 v10.4S, v2.4S, v22.4S // *.............................................................................. - trn2 v17.4S, v23.4S, v17.4S // .*............................................................................. - trn2 v26.4S, v2.4S, v22.4S // ..*............................................................................ - trn2 v23.2D, v10.2D, v30.2D // ...*........................................................................... - trn1 v27.2D, v10.2D, v30.2D // ....*.......................................................................... - trn2 v30.2D, v26.2D, v17.2D // .....*......................................................................... - trn1 v17.2D, v26.2D, v17.2D // ......*........................................................................ - sub v2.8H, v23.8H, v30.8H // .......*....................................................................... - sub v26.8H, v27.8H, v17.8H // ........*...................................................................... - add v28.8H, v27.8H, v17.8H // .........*..................................................................... - mul v22.8H, v2.8H, v5.8H // ..........*.................................................................... - mul v10.8H, v26.8H, v1.8H // ...........*................................................................... - sqrdmulh v26.8H, v26.8H, v9.8H // ............*.................................................................. - sqrdmulh v2.8H, v2.8H, v3.8H // .............*................................................................. - add v23.8H, v23.8H, v30.8H // ..............*................................................................ - mls v10.8H, v26.8H, v7.H[0] // ................*.............................................................. - mls v22.8H, v2.8H, v7.H[0] // .................*............................................................. - sub v2.8H, v28.8H, v23.8H // ..................*............................................................ - ldr q3, [x3], #16 // ...................*........................................................... - sub v26.8H, v10.8H, v22.8H // .....................*......................................................... - mul v17.8H, v2.8H, v24.8H // ......................*........................................................ - sqrdmulh v30.8H, v2.8H, v6.8H // .......................*....................................................... - mul v2.8H, v26.8H, v24.8H // ........................*...................................................... - sqrdmulh v26.8H, v26.8H, v6.8H // .........................*..................................................... - add v10.8H, v10.8H, v22.8H // ..........................*.................................................... - add v23.8H, v28.8H, v23.8H // ...........................*................................................... - mls v17.8H, v30.8H, v7.H[0] // ............................*.................................................. - mls v2.8H, v26.8H, v7.H[0] // .............................*................................................. - trn1 v30.4S, v23.4S, v10.4S // ..............................*................................................ - trn2 v22.4S, v23.4S, v10.4S // ...............................*............................................... - trn2 v26.4S, v17.4S, v2.4S // .................................*............................................. - trn1 v2.4S, v17.4S, v2.4S // ..................................*............................................ - trn1 v23.2D, v22.2D, v26.2D // ....................................*.......................................... - trn2 v17.2D, v22.2D, v26.2D // .....................................*......................................... - trn2 v6.2D, v30.2D, v2.2D // ......................................*........................................ - trn1 v24.2D, v30.2D, v2.2D // .......................................*....................................... - sub v10.8H, v6.8H, v17.8H // ........................................*...................................... - add v17.8H, v6.8H, v17.8H // .........................................*..................................... - sub v22.8H, v24.8H, v23.8H // ..........................................*.................................... - sqrdmulh v2.8H, v10.8H, v3.H[5] // ...........................................*................................... - mul v8.8H, v10.8H, v3.H[4] // ............................................*.................................. - mul v1.8H, v22.8H, v3.H[2] // .............................................*................................. - sqrdmulh v26.8H, v22.8H, v3.H[3] // ..............................................*................................ - add v23.8H, v24.8H, v23.8H // ...............................................*............................... - mls v8.8H, v2.8H, v7.H[0] // ................................................*.............................. - sqdmulh v30.8H, v17.8H, v7.H[1] // .................................................*............................. - mls v1.8H, v26.8H, v7.H[0] // ..................................................*............................ - sqdmulh v31.8H, v23.8H, v7.H[1] // ...................................................*........................... - sqdmulh v10.8H, v8.8H, v7.H[1] // ....................................................*.......................... - srshr v22.8H, v30.8H, #11 // .....................................................*......................... - sqdmulh v2.8H, v1.8H, v7.H[1] // ......................................................*........................ - srshr v19.8H, v31.8H, #11 // .......................................................*....................... - mls v17.8H, v22.8H, v7.H[0] // ........................................................*...................... - srshr v26.8H, v10.8H, #11 // .........................................................*..................... - srshr v2.8H, v2.8H, #11 // ..........................................................*.................... - mls v23.8H, v19.8H, v7.H[0] // ...........................................................*................... - mls v8.8H, v26.8H, v7.H[0] // ............................................................*.................. - mls v1.8H, v2.8H, v7.H[0] // .............................................................*................. - sub v26.8H, v23.8H, v17.8H // ...............................................................*............... - add v30.8H, v23.8H, v17.8H // ................................................................*.............. - sub v22.8H, v1.8H, v8.8H // .................................................................*............. - mul v10.8H, v26.8H, v3.H[0] // ..................................................................*............ - sqrdmulh v17.8H, v26.8H, v3.H[1] // ...................................................................*........... - mul v2.8H, v22.8H, v3.H[0] // ....................................................................*.......... - sqrdmulh v22.8H, v22.8H, v3.H[1] // .....................................................................*......... - add v26.8H, v1.8H, v8.8H // ......................................................................*........ - str q30, [x1], #(64) // .......................................................................*....... - mls v10.8H, v17.8H, v7.H[0] // ........................................................................*...... - str q26, [x1, #-48] // .........................................................................*..... - mls v2.8H, v22.8H, v7.H[0] // ..........................................................................*.... - str q10, [x1, #-32] // ............................................................................*.. - str q2, [x1, #-16] // ..............................................................................* + // Instructions: 72 + // Expected cycles: 79 + // Expected IPC: 0.91 + // + // Cycle bound: 79.0 + // IPC bound: 0.91 + // + // Wall time: 9.38s + // User time: 9.38s + // + // ------------------------------ cycle (expected) ------------------------------> + // 0 25 50 75 + // |------------------------|------------------------|------------------------|--- + trn1 v3.4S, v10.4S, v21.4S // *.............................................................................. + trn2 v12.4S, v31.4S, v12.4S // .*............................................................................. + trn2 v13.4S, v10.4S, v21.4S // ..*............................................................................ + trn1 v28.2D, v3.2D, v30.2D // ...*........................................................................... + trn2 v1.2D, v3.2D, v30.2D // ....*.......................................................................... + trn2 v31.2D, v13.2D, v12.2D // .....*......................................................................... + trn1 v12.2D, v13.2D, v12.2D // ......*........................................................................ + sub v10.8H, v1.8H, v31.8H // .......*....................................................................... + sub v13.8H, v28.8H, v12.8H // ........*...................................................................... + add v30.8H, v28.8H, v12.8H // .........*..................................................................... + mul v21.8H, v10.8H, v25.8H // ..........*.................................................................... + mul v3.8H, v13.8H, v15.8H // ...........*................................................................... + sqrdmulh v13.8H, v13.8H, v6.8H // ............*.................................................................. + sqrdmulh v10.8H, v10.8H, v20.8H // .............*................................................................. + add v31.8H, v1.8H, v31.8H // ..............*................................................................ + mls v3.8H, v13.8H, v7.H[0] // ................*.............................................................. + mls v21.8H, v10.8H, v7.H[0] // .................*............................................................. + sub v10.8H, v30.8H, v31.8H // ..................*............................................................ + ldr q15, [x3], #16 // ...................*........................................................... + sub v13.8H, v3.8H, v21.8H // .....................*......................................................... + sqrdmulh v6.8H, v10.8H, v9.8H // ......................*........................................................ + mul v12.8H, v10.8H, v5.8H // .......................*....................................................... + mul v10.8H, v13.8H, v5.8H // ........................*...................................................... + sqrdmulh v13.8H, v13.8H, v9.8H // .........................*..................................................... + add v3.8H, v3.8H, v21.8H // ..........................*.................................................... + add v31.8H, v30.8H, v31.8H // ...........................*................................................... + mls v12.8H, v6.8H, v7.H[0] // ............................*.................................................. + mls v10.8H, v13.8H, v7.H[0] // .............................*................................................. + trn1 v30.4S, v31.4S, v3.4S // ..............................*................................................ + trn2 v21.4S, v31.4S, v3.4S // ...............................*............................................... + trn2 v13.4S, v12.4S, v10.4S // .................................*............................................. + trn1 v10.4S, v12.4S, v10.4S // ..................................*............................................ + trn1 v6.2D, v21.2D, v13.2D // ....................................*.......................................... + trn2 v12.2D, v21.2D, v13.2D // .....................................*......................................... + trn1 v31.2D, v30.2D, v10.2D // ......................................*........................................ + trn2 v30.2D, v30.2D, v10.2D // .......................................*....................................... + sub v13.8H, v31.8H, v6.8H // ........................................*...................................... + add v31.8H, v31.8H, v6.8H // .........................................*..................................... + sub v21.8H, v30.8H, v12.8H // ..........................................*.................................... + sqrdmulh v26.8H, v13.8H, v15.H[3] // ...........................................*................................... + mul v2.8H, v13.8H, v15.H[2] // ............................................*.................................. + mul v9.8H, v21.8H, v15.H[4] // .............................................*................................. + sqrdmulh v10.8H, v21.8H, v15.H[5] // ..............................................*................................ + sqdmulh v3.8H, v31.8H, v7.H[1] // ...............................................*............................... + mls v2.8H, v26.8H, v7.H[0] // ................................................*.............................. + add v12.8H, v30.8H, v12.8H // .................................................*............................. + mls v9.8H, v10.8H, v7.H[0] // ..................................................*............................ + srshr v3.8H, v3.8H, #11 // ...................................................*........................... + sqdmulh v10.8H, v12.8H, v7.H[1] // ....................................................*.......................... + sqdmulh v21.8H, v2.8H, v7.H[1] // .....................................................*......................... + sqdmulh v13.8H, v9.8H, v7.H[1] // ......................................................*........................ + mls v31.8H, v3.8H, v7.H[0] // .......................................................*....................... + srshr v10.8H, v10.8H, #11 // ........................................................*...................... + srshr v16.8H, v21.8H, #11 // .........................................................*..................... + srshr v13.8H, v13.8H, #11 // ..........................................................*.................... + mls v12.8H, v10.8H, v7.H[0] // ...........................................................*................... + mls v2.8H, v16.8H, v7.H[0] // ............................................................*.................. + mls v9.8H, v13.8H, v7.H[0] // .............................................................*................. + sub v10.8H, v31.8H, v12.8H // ...............................................................*............... + add v6.8H, v31.8H, v12.8H // ................................................................*.............. + sub v13.8H, v2.8H, v9.8H // .................................................................*............. + mul v3.8H, v10.8H, v15.H[0] // ..................................................................*............ + sqrdmulh v12.8H, v10.8H, v15.H[1] // ...................................................................*........... + mul v10.8H, v13.8H, v15.H[0] // ....................................................................*.......... + sqrdmulh v21.8H, v13.8H, v15.H[1] // .....................................................................*......... + add v13.8H, v2.8H, v9.8H // ......................................................................*........ + mls v3.8H, v12.8H, v7.H[0] // .......................................................................*....... + str q6, [x1], #(64) // ........................................................................*...... + mls v10.8H, v21.8H, v7.H[0] // .........................................................................*..... + str q13, [x1, #-48] // ..........................................................................*.... + str q3, [x1, #-32] // ............................................................................*.. + str q10, [x1, #-16] // ..............................................................................* // ------------------------------ cycle (expected) ------------------------------> // 0 25 50 75 // |------------------------|------------------------|------------------------|--- - // trn1 v26.4S, v2.4S, v22.4S // *.............................................................................. - // trn2 v2.4S, v2.4S, v22.4S // ..*............................................................................ - // trn2 v22.4S, v23.4S, v17.4S // .*............................................................................. - // trn2 v10.2D, v26.2D, v30.2D // ...*........................................................................... - // trn1 v26.2D, v26.2D, v30.2D // ....*.......................................................................... - // trn2 v17.2D, v2.2D, v22.2D // .....*......................................................................... - // trn1 v2.2D, v2.2D, v22.2D // ......*........................................................................ - // sub v22.8H, v10.8H, v17.8H // .......*....................................................................... - // add v10.8H, v10.8H, v17.8H // ..............*................................................................ - // sub v17.8H, v26.8H, v2.8H // ........*...................................................................... - // add v26.8H, v26.8H, v2.8H // .........*..................................................................... - // sqrdmulh v2.8H, v22.8H, v3.8H // .............*................................................................. - // sqrdmulh v30.8H, v17.8H, v9.8H // ............*.................................................................. - // mul v17.8H, v17.8H, v1.8H // ...........*................................................................... - // mul v22.8H, v22.8H, v5.8H // ..........*.................................................................... - // sub v1.8H, v26.8H, v10.8H // ..................*............................................................ - // add v26.8H, v26.8H, v10.8H // ...........................*................................................... - // mls v17.8H, v30.8H, v7.H[0] // ................*.............................................................. - // mls v22.8H, v2.8H, v7.H[0] // .................*............................................................. - // sqrdmulh v2.8H, v1.8H, v6.8H // .......................*....................................................... - // mul v10.8H, v1.8H, v24.8H // ......................*........................................................ - // ldr q1, [x3], #16 // ...................*........................................................... - // sub v30.8H, v17.8H, v22.8H // .....................*......................................................... - // mls v10.8H, v2.8H, v7.H[0] // ............................*.................................................. - // add v2.8H, v17.8H, v22.8H // ..........................*.................................................... - // sqrdmulh v22.8H, v30.8H, v6.8H // .........................*..................................................... - // mul v17.8H, v30.8H, v24.8H // ........................*...................................................... - // trn1 v30.4S, v26.4S, v2.4S // ..............................*................................................ - // trn2 v26.4S, v26.4S, v2.4S // ...............................*............................................... - // mls v17.8H, v22.8H, v7.H[0] // .............................*................................................. - // trn1 v24.4S, v10.4S, v17.4S // ..................................*............................................ - // trn2 v10.4S, v10.4S, v17.4S // .................................*............................................. - // trn2 v6.2D, v30.2D, v24.2D // ......................................*........................................ - // trn2 v9.2D, v26.2D, v10.2D // .....................................*......................................... - // trn1 v30.2D, v30.2D, v24.2D // .......................................*....................................... - // trn1 v26.2D, v26.2D, v10.2D // ....................................*.......................................... - // sub v10.8H, v6.8H, v9.8H // ........................................*...................................... - // sub v24.8H, v30.8H, v26.8H // ..........................................*.................................... - // add v26.8H, v30.8H, v26.8H // ...............................................*............................... - // sqrdmulh v30.8H, v10.8H, v1.H[5] // ...........................................*................................... - // sqrdmulh v5.8H, v24.8H, v1.H[3] // ..............................................*................................ - // mul v24.8H, v24.8H, v1.H[2] // .............................................*................................. - // mul v10.8H, v10.8H, v1.H[4] // ............................................*.................................. - // add v6.8H, v6.8H, v9.8H // .........................................*..................................... - // sqdmulh v9.8H, v26.8H, v7.H[1] // ...................................................*........................... - // mls v24.8H, v5.8H, v7.H[0] // ..................................................*............................ - // mls v10.8H, v30.8H, v7.H[0] // ................................................*.............................. - // sqdmulh v30.8H, v6.8H, v7.H[1] // .................................................*............................. - // srshr v9.8H, v9.8H, #11 // .......................................................*....................... - // sqdmulh v5.8H, v24.8H, v7.H[1] // ......................................................*........................ - // sqdmulh v3.8H, v10.8H, v7.H[1] // ....................................................*.......................... - // mls v26.8H, v9.8H, v7.H[0] // ...........................................................*................... - // srshr v30.8H, v30.8H, #11 // .....................................................*......................... - // srshr v9.8H, v5.8H, #11 // ..........................................................*.................... - // srshr v5.8H, v3.8H, #11 // .........................................................*..................... - // mls v6.8H, v30.8H, v7.H[0] // ........................................................*...................... - // mls v24.8H, v9.8H, v7.H[0] // .............................................................*................. - // mls v10.8H, v5.8H, v7.H[0] // ............................................................*.................. - // sub v9.8H, v26.8H, v6.8H // ...............................................................*............... - // add v26.8H, v26.8H, v6.8H // ................................................................*.............. - // sub v6.8H, v24.8H, v10.8H // .................................................................*............. - // sqrdmulh v5.8H, v9.8H, v1.H[1] // ...................................................................*........... - // mul v9.8H, v9.8H, v1.H[0] // ..................................................................*............ - // sqrdmulh v3.8H, v6.8H, v1.H[1] // .....................................................................*......... - // mul v1.8H, v6.8H, v1.H[0] // ....................................................................*.......... - // add v10.8H, v24.8H, v10.8H // ......................................................................*........ - // mls v9.8H, v5.8H, v7.H[0] // ........................................................................*...... - // str q26, [x1], #(64) // .......................................................................*....... - // mls v1.8H, v3.8H, v7.H[0] // ..........................................................................*.... - // str q10, [x1, #-48] // .........................................................................*..... - // str q9, [x1, #-32] // ............................................................................*.. - // str q1, [x1, #-16] // ..............................................................................* + // trn1 v13.4S, v10.4S, v21.4S // *.............................................................................. + // trn2 v10.4S, v10.4S, v21.4S // ..*............................................................................ + // trn2 v21.4S, v31.4S, v12.4S // .*............................................................................. + // trn2 v3.2D, v13.2D, v30.2D // ....*.......................................................................... + // trn1 v13.2D, v13.2D, v30.2D // ...*........................................................................... + // trn2 v12.2D, v10.2D, v21.2D // .....*......................................................................... + // trn1 v10.2D, v10.2D, v21.2D // ......*........................................................................ + // sub v21.8H, v3.8H, v12.8H // .......*....................................................................... + // add v3.8H, v3.8H, v12.8H // ..............*................................................................ + // sub v12.8H, v13.8H, v10.8H // ........*...................................................................... + // add v13.8H, v13.8H, v10.8H // .........*..................................................................... + // sqrdmulh v10.8H, v21.8H, v20.8H // .............*................................................................. + // sqrdmulh v6.8H, v12.8H, v6.8H // ............*.................................................................. + // mul v12.8H, v12.8H, v15.8H // ...........*................................................................... + // mul v21.8H, v21.8H, v25.8H // ..........*.................................................................... + // sub v30.8H, v13.8H, v3.8H // ..................*............................................................ + // add v13.8H, v13.8H, v3.8H // ...........................*................................................... + // mls v12.8H, v6.8H, v7.H[0] // ................*.............................................................. + // mls v21.8H, v10.8H, v7.H[0] // .................*............................................................. + // sqrdmulh v10.8H, v30.8H, v9.8H // ......................*........................................................ + // mul v3.8H, v30.8H, v5.8H // .......................*....................................................... + // ldr q6, [x3], #16 // ...................*........................................................... + // sub v30.8H, v12.8H, v21.8H // .....................*......................................................... + // mls v3.8H, v10.8H, v7.H[0] // ............................*.................................................. + // add v10.8H, v12.8H, v21.8H // ..........................*.................................................... + // sqrdmulh v21.8H, v30.8H, v9.8H // .........................*..................................................... + // mul v12.8H, v30.8H, v5.8H // ........................*...................................................... + // trn1 v30.4S, v13.4S, v10.4S // ..............................*................................................ + // trn2 v13.4S, v13.4S, v10.4S // ...............................*............................................... + // mls v12.8H, v21.8H, v7.H[0] // .............................*................................................. + // trn1 v5.4S, v3.4S, v12.4S // ..................................*............................................ + // trn2 v3.4S, v3.4S, v12.4S // .................................*............................................. + // trn2 v9.2D, v30.2D, v5.2D // .......................................*....................................... + // trn2 v15.2D, v13.2D, v3.2D // .....................................*......................................... + // trn1 v30.2D, v30.2D, v5.2D // ......................................*........................................ + // trn1 v13.2D, v13.2D, v3.2D // ....................................*.......................................... + // sub v3.8H, v9.8H, v15.8H // ..........................................*.................................... + // sub v5.8H, v30.8H, v13.8H // ........................................*...................................... + // add v13.8H, v30.8H, v13.8H // .........................................*..................................... + // sqrdmulh v30.8H, v3.8H, v6.H[5] // ..............................................*................................ + // sqrdmulh v25.8H, v5.8H, v6.H[3] // ...........................................*................................... + // mul v5.8H, v5.8H, v6.H[2] // ............................................*.................................. + // mul v3.8H, v3.8H, v6.H[4] // .............................................*................................. + // add v9.8H, v9.8H, v15.8H // .................................................*............................. + // sqdmulh v15.8H, v13.8H, v7.H[1] // ...............................................*............................... + // mls v5.8H, v25.8H, v7.H[0] // ................................................*.............................. + // mls v3.8H, v30.8H, v7.H[0] // ..................................................*............................ + // sqdmulh v30.8H, v9.8H, v7.H[1] // ....................................................*.......................... + // srshr v15.8H, v15.8H, #11 // ...................................................*........................... + // sqdmulh v25.8H, v5.8H, v7.H[1] // .....................................................*......................... + // sqdmulh v20.8H, v3.8H, v7.H[1] // ......................................................*........................ + // mls v13.8H, v15.8H, v7.H[0] // .......................................................*....................... + // srshr v30.8H, v30.8H, #11 // ........................................................*...................... + // srshr v15.8H, v25.8H, #11 // .........................................................*..................... + // srshr v25.8H, v20.8H, #11 // ..........................................................*.................... + // mls v9.8H, v30.8H, v7.H[0] // ...........................................................*................... + // mls v5.8H, v15.8H, v7.H[0] // ............................................................*.................. + // mls v3.8H, v25.8H, v7.H[0] // .............................................................*................. + // sub v15.8H, v13.8H, v9.8H // ...............................................................*............... + // add v13.8H, v13.8H, v9.8H // ................................................................*.............. + // sub v9.8H, v5.8H, v3.8H // .................................................................*............. + // sqrdmulh v25.8H, v15.8H, v6.H[1] // ...................................................................*........... + // mul v15.8H, v15.8H, v6.H[0] // ..................................................................*............ + // sqrdmulh v20.8H, v9.8H, v6.H[1] // .....................................................................*......... + // mul v6.8H, v9.8H, v6.H[0] // ....................................................................*.......... + // add v3.8H, v5.8H, v3.8H // ......................................................................*........ + // mls v15.8H, v25.8H, v7.H[0] // .......................................................................*....... + // str q13, [x1], #(64) // ........................................................................*...... + // mls v6.8H, v20.8H, v7.H[0] // .........................................................................*..... + // str q3, [x1, #-48] // ..........................................................................*.... + // str q15, [x1, #-32] // ............................................................................*.. + // str q6, [x1, #-16] // ..............................................................................* // --------------------------------------------------------------------- - ninv .req v29 - ninv_tw .req v30 - - ASM_LOAD(xtmp, ninv_addr) - ld1r {ninv.8h}, [xtmp] - ASM_LOAD(xtmp, ninv_tw_addr) - ld1r {ninv_tw.8h}, [xtmp] - mov count, #4 ASM_LOAD(r_ptr0, roots_l012) load_roots_123 @@ -650,402 +796,354 @@ layer4567_start: // ----- cycle (expected) ------> // 0 25 // |------------------------|---- - ldr q22, [x0, #128] // *............................. - ldr q6, [x0, #320] // ..*........................... - ldr q5, [x0, #448] // ....*......................... - ldr q24, [x0, #256] // ......*....................... - ldr q9, [x0, #384] // ........*..................... - ldr q17, [x0, #192] // ..........*................... - add v28.8H, v24.8H, v6.8H // ............*................. - add v21.8H, v9.8H, v5.8H // .............*................ - add v23.8H, v22.8H, v17.8H // ..............*............... - ldr q2, [x0, #0] // ...............*.............. - add v3.8H, v28.8H, v21.8H // .................*............ - ldr q10, [x0, #64] // ..................*........... + ldr q31, [x0, #256] // *............................. + ldr q5, [x0, #320] // ..*........................... + ldr q30, [x0, #128] // ....*......................... + add v25.8H, v31.8H, v5.8H // ......*....................... + ldr q9, [x0, #384] // .......*...................... + ldr q15, [x0, #448] // .........*.................... + ldr q12, [x0, #192] // ...........*.................. + add v20.8H, v9.8H, v15.8H // .............*................ + ldr q3, [x0, #0] // ..............*............... + add v27.8H, v30.8H, v12.8H // ................*............. + add v24.8H, v25.8H, v20.8H // .................*............ + ldr q6, [x0, #64] // ..................*........... // ------ cycle (expected) ------> // 0 25 // |------------------------|----- - // ldr q2, [x0, #0] // ...............*............... - // ldr q10, [x0, #64] // ..................*............ - // ldr q22, [x0, #128] // *.............................. - // ldr q24, [x0, #256] // ......*........................ - // ldr q6, [x0, #320] // ..*............................ - // ldr q9, [x0, #384] // ........*...................... - // add v28.8H, v24.8H, v6.8H // ............*.................. - // ldr q5, [x0, #448] // ....*.......................... - // ldr q17, [x0, #192] // ..........*.................... - // add v21.8H, v9.8H, v5.8H // .............*................. - // add v23.8H, v22.8H, v17.8H // ..............*................ - // add v3.8H, v28.8H, v21.8H // .................*............. + // ldr q3, [x0, #0] // ..............*................ + // ldr q6, [x0, #64] // ..................*............ + // ldr q30, [x0, #128] // ....*.......................... + // ldr q12, [x0, #192] // ...........*................... + // ldr q31, [x0, #256] // *.............................. + // ldr q5, [x0, #320] // ..*............................ + // ldr q9, [x0, #384] // .......*....................... + // ldr q15, [x0, #448] // .........*..................... + // add v25.8H, v31.8H, v5.8H // ......*........................ + // add v20.8H, v9.8H, v15.8H // .............*................. + // add v27.8H, v30.8H, v12.8H // ................*.............. + // add v24.8H, v25.8H, v20.8H // .................*............. sub count, count, #1 layer123_start: - // Instructions: 88 - // Expected cycles: 96 - // Expected IPC: 0.92 + // Instructions: 76 + // Expected cycles: 84 + // Expected IPC: 0.90 // - // Cycle bound: 96.0 - // IPC bound: 0.92 + // Cycle bound: 84.0 + // IPC bound: 0.90 // - // Wall time: 3.45s - // User time: 3.45s + // Wall time: 2.64s + // User time: 2.64s // - // -------------------------------------- cycle (expected) ---------------------------------------> + // -------------------------------- cycle (expected) ---------------------------------> // 0 25 50 75 - // |------------------------|------------------------|------------------------|-------------------- - sub v26.8H, v2.8H, v10.8H // *............................................................................................... - add v2.8H, v2.8H, v10.8H // .*.............................................................................................. - sub v22.8H, v22.8H, v17.8H // ..*............................................................................................. - sqrdmulh v10.8H, v26.8H, v0.H[7] // ...*............................................................................................ - mul v26.8H, v26.8H, v0.H[6] // ....*........................................................................................... - sub v17.8H, v2.8H, v23.8H // .....*.......................................................................................... - add v2.8H, v2.8H, v23.8H // ......*......................................................................................... - sqrdmulh v23.8H, v22.8H, v1.H[1] // .......*........................................................................................ - mul v22.8H, v22.8H, v1.H[0] // ........*....................................................................................... - mls v26.8H, v10.8H, v7.H[0] // .........*...................................................................................... - sub v10.8H, v24.8H, v6.8H // ..........*..................................................................................... - sqrdmulh v24.8H, v17.8H, v0.H[3] // ...........*.................................................................................... - mul v17.8H, v17.8H, v0.H[2] // ............*................................................................................... - sub v6.8H, v2.8H, v3.8H // .............*.................................................................................. - add v2.8H, v2.8H, v3.8H // ..............*................................................................................. - mls v22.8H, v23.8H, v7.H[0] // ...............*................................................................................ - sqrdmulh v23.8H, v10.8H, v1.H[3] // ................*............................................................................... - mul v10.8H, v10.8H, v1.H[2] // .................*.............................................................................. - sub v9.8H, v9.8H, v5.8H // ..................*............................................................................. - sub v5.8H, v26.8H, v22.8H // ...................*............................................................................ - add v26.8H, v26.8H, v22.8H // ....................*........................................................................... - mls v10.8H, v23.8H, v7.H[0] // .....................*.......................................................................... - sqrdmulh v22.8H, v9.8H, v1.H[5] // ......................*......................................................................... - mls v17.8H, v24.8H, v7.H[0] // .......................*........................................................................ - mul v23.8H, v9.8H, v1.H[4] // ........................*....................................................................... - sqrdmulh v24.8H, v5.8H, v0.H[3] // .........................*...................................................................... - mul v9.8H, v5.8H, v0.H[2] // ..........................*..................................................................... - sqrdmulh v5.8H, v6.8H, v0.H[1] // ...........................*.................................................................... - mul v6.8H, v6.8H, v0.H[0] // ............................*................................................................... - sqrdmulh v3.8H, v2.8H, v30.8H // .............................*.................................................................. - mul v2.8H, v2.8H, v29.8H // ..............................*................................................................. - mls v23.8H, v22.8H, v7.H[0] // ...............................*................................................................ - mls v9.8H, v24.8H, v7.H[0] // ................................*............................................................... - sub v22.8H, v28.8H, v21.8H // .................................*.............................................................. - mls v6.8H, v5.8H, v7.H[0] // ..................................*............................................................. - sub v24.8H, v10.8H, v23.8H // ...................................*............................................................ - sqrdmulh v5.8H, v22.8H, v0.H[5] // ....................................*........................................................... - mul v22.8H, v22.8H, v0.H[4] // .....................................*.......................................................... - add v10.8H, v10.8H, v23.8H // ......................................*......................................................... - sqrdmulh v23.8H, v24.8H, v0.H[5] // .......................................*........................................................ - mul v24.8H, v24.8H, v0.H[4] // ........................................*....................................................... - sub v28.8H, v26.8H, v10.8H // .........................................*...................................................... - add v26.8H, v26.8H, v10.8H // ..........................................*..................................................... - mls v22.8H, v5.8H, v7.H[0] // ...........................................*.................................................... - mls v24.8H, v23.8H, v7.H[0] // ............................................*................................................... - sqrdmulh v10.8H, v28.8H, v0.H[1] // .............................................*.................................................. - mul v23.8H, v28.8H, v0.H[0] // ..............................................*................................................. - sub v5.8H, v17.8H, v22.8H // ...............................................*................................................ - add v22.8H, v17.8H, v22.8H // ................................................*............................................... - sub v17.8H, v9.8H, v24.8H // .................................................*.............................................. - mls v23.8H, v10.8H, v7.H[0] // ..................................................*............................................. - sqrdmulh v10.8H, v5.8H, v0.H[1] // ...................................................*............................................ - mul v5.8H, v5.8H, v0.H[0] // ....................................................*........................................... - add v24.8H, v9.8H, v24.8H // .....................................................*.......................................... - sqrdmulh v9.8H, v17.8H, v0.H[1] // ......................................................*......................................... - mul v17.8H, v17.8H, v0.H[0] // .......................................................*........................................ - mls v5.8H, v10.8H, v7.H[0] // ........................................................*....................................... - str q6, [x0, #256] // .........................................................*...................................... - mls v2.8H, v3.8H, v7.H[0] // ..........................................................*..................................... - mls v17.8H, v9.8H, v7.H[0] // ...........................................................*.................................... - str q23, [x0, #320] // ............................................................*................................... - sqrdmulh v10.8H, v26.8H, v30.8H // .............................................................*.................................. - str q5, [x0, #384] // ..............................................................*................................. - mul v26.8H, v26.8H, v29.8H // ...............................................................*................................ - str q17, [x0, #448] // ................................................................*............................... - sqrdmulh v17.8H, v22.8H, v30.8H // .................................................................*.............................. - mul v22.8H, v22.8H, v29.8H // ..................................................................*............................. - mls v26.8H, v10.8H, v7.H[0] // ...................................................................*............................ - sqrdmulh v10.8H, v24.8H, v30.8H // ....................................................................*........................... - mul v23.8H, v24.8H, v29.8H // .....................................................................*.......................... - mls v22.8H, v17.8H, v7.H[0] // ......................................................................*......................... - str q2, [x0], #(16) // .......................................................................*........................ - ldr q2, [x0, #0] // ........................................................................e....................... - mls v23.8H, v10.8H, v7.H[0] // ..........................................................................*..................... - str q26, [x0, #48] // ...........................................................................*.................... - ldr q10, [x0, #64] // ............................................................................e................... - str q22, [x0, #112] // ..............................................................................*................. - ldr q22, [x0, #128] // ...............................................................................e................ - ldr q24, [x0, #256] // .................................................................................e.............. - ldr q6, [x0, #320] // ...................................................................................e............ - ldr q9, [x0, #384] // .....................................................................................e.......... - add v28.8H, v24.8H, v6.8H // .......................................................................................e........ - ldr q5, [x0, #448] // ........................................................................................e....... - ldr q17, [x0, #192] // ..........................................................................................e..... - add v21.8H, v9.8H, v5.8H // ............................................................................................e... - str q23, [x0, #176] // .............................................................................................*.. - add v23.8H, v22.8H, v17.8H // ..............................................................................................e. - add v3.8H, v28.8H, v21.8H // ...............................................................................................e + // |------------------------|------------------------|------------------------|-------- + sub v13.8H, v3.8H, v6.8H // *................................................................................... + add v10.8H, v3.8H, v6.8H // .*.................................................................................. + sub v21.8H, v30.8H, v12.8H // ..*................................................................................. + sqrdmulh v3.8H, v13.8H, v0.H[7] // ...*................................................................................ + mul v13.8H, v13.8H, v0.H[6] // ....*............................................................................... + sub v12.8H, v10.8H, v27.8H // .....*.............................................................................. + add v10.8H, v10.8H, v27.8H // ......*............................................................................. + sqrdmulh v6.8H, v21.8H, v1.H[1] // .......*............................................................................ + mul v21.8H, v21.8H, v1.H[0] // ........*........................................................................... + mls v13.8H, v3.8H, v7.H[0] // .........*.......................................................................... + sub v3.8H, v31.8H, v5.8H // ..........*......................................................................... + sqrdmulh v30.8H, v12.8H, v0.H[3] // ...........*........................................................................ + mul v12.8H, v12.8H, v0.H[2] // ............*....................................................................... + sub v31.8H, v10.8H, v24.8H // .............*...................................................................... + add v10.8H, v10.8H, v24.8H // ..............*..................................................................... + mls v21.8H, v6.8H, v7.H[0] // ...............*.................................................................... + sqrdmulh v6.8H, v3.8H, v1.H[3] // ................*................................................................... + mul v3.8H, v3.8H, v1.H[2] // .................*.................................................................. + sub v5.8H, v9.8H, v15.8H // ..................*................................................................. + sub v9.8H, v13.8H, v21.8H // ...................*................................................................ + add v13.8H, v13.8H, v21.8H // ....................*............................................................... + mls v3.8H, v6.8H, v7.H[0] // .....................*.............................................................. + sqrdmulh v21.8H, v5.8H, v1.H[5] // ......................*............................................................. + mls v12.8H, v30.8H, v7.H[0] // .......................*............................................................ + mul v6.8H, v5.8H, v1.H[4] // ........................*........................................................... + sqrdmulh v30.8H, v9.8H, v0.H[3] // .........................*.......................................................... + mul v5.8H, v9.8H, v0.H[2] // ..........................*......................................................... + sqrdmulh v9.8H, v31.8H, v0.H[1] // ...........................*........................................................ + mul v31.8H, v31.8H, v0.H[0] // ............................*....................................................... + str q10, [x0], #(16) // .............................*...................................................... + mls v6.8H, v21.8H, v7.H[0] // ..............................*..................................................... + mls v5.8H, v30.8H, v7.H[0] // ...............................*.................................................... + sub v10.8H, v25.8H, v20.8H // ................................*................................................... + mls v31.8H, v9.8H, v7.H[0] // .................................*.................................................. + sub v21.8H, v3.8H, v6.8H // ..................................*................................................. + sqrdmulh v30.8H, v10.8H, v0.H[5] // ...................................*................................................ + mul v10.8H, v10.8H, v0.H[4] // ....................................*............................................... + add v3.8H, v3.8H, v6.8H // .....................................*.............................................. + sqrdmulh v6.8H, v21.8H, v0.H[5] // ......................................*............................................. + mul v21.8H, v21.8H, v0.H[4] // .......................................*............................................ + mls v10.8H, v30.8H, v7.H[0] // ........................................*........................................... + sub v30.8H, v13.8H, v3.8H // .........................................*.......................................... + add v13.8H, v13.8H, v3.8H // ..........................................*......................................... + mls v21.8H, v6.8H, v7.H[0] // ...........................................*........................................ + sqrdmulh v3.8H, v30.8H, v0.H[1] // ............................................*....................................... + mul v6.8H, v30.8H, v0.H[0] // .............................................*...................................... + sub v30.8H, v12.8H, v10.8H // ..............................................*..................................... + add v10.8H, v12.8H, v10.8H // ...............................................*.................................... + sub v12.8H, v5.8H, v21.8H // ................................................*................................... + mls v6.8H, v3.8H, v7.H[0] // .................................................*.................................. + sqrdmulh v3.8H, v30.8H, v0.H[1] // ..................................................*................................. + mul v30.8H, v30.8H, v0.H[0] // ...................................................*................................ + add v21.8H, v5.8H, v21.8H // ....................................................*............................... + sqrdmulh v5.8H, v12.8H, v0.H[1] // .....................................................*.............................. + mul v12.8H, v12.8H, v0.H[0] // ......................................................*............................. + mls v30.8H, v3.8H, v7.H[0] // .......................................................*............................ + str q31, [x0, #240] // ........................................................*........................... + ldr q3, [x0, #0] // .........................................................e.......................... + mls v12.8H, v5.8H, v7.H[0] // ...........................................................*........................ + str q6, [x0, #304] // ............................................................*....................... + ldr q6, [x0, #64] // .............................................................e...................... + str q30, [x0, #368] // ...............................................................*.................... + ldr q30, [x0, #128] // ................................................................e................... + str q12, [x0, #432] // ..................................................................*................. + ldr q12, [x0, #192] // ...................................................................e................ + str q13, [x0, #48] // .....................................................................*.............. + ldr q31, [x0, #256] // ......................................................................e............. + ldr q5, [x0, #320] // ........................................................................e........... + ldr q9, [x0, #384] // ..........................................................................e......... + ldr q15, [x0, #448] // ............................................................................e....... + str q10, [x0, #112] // ..............................................................................*..... + add v25.8H, v31.8H, v5.8H // ...............................................................................e.... + add v20.8H, v9.8H, v15.8H // ................................................................................e... + str q21, [x0, #176] // .................................................................................*.. + add v27.8H, v30.8H, v12.8H // ..................................................................................e. + add v24.8H, v25.8H, v20.8H // ...................................................................................e - // ------------------------------------------------- cycle (expected) --------------------------------------------------> + // --------------------------------------------- cycle (expected) ---------------------------------------------> // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|----------------- - // ldr q8, [x0, #0] // e.......................'.......................................................................~..................... - // ldr q9, [x0, #(1*(512/8))] // ....e...................'...........................................................................~................. - // ldr q10, [x0, #(2*(512/8))] // .......e................'..............................................................................~.............. - // ldr q11, [x0, #(3*(512/8))] // ..................e.....'.........................................................................................~... - // ldr q12, [x0, #(4*(512/8))] // .........e..............'................................................................................~............ - // ldr q13, [x0, #(5*(512/8))] // ...........e............'..................................................................................~.......... - // ldr q14, [x0, #(6*(512/8))] // .............e..........'....................................................................................~........ - // ldr q15, [x0, #(7*(512/8))] // ................e.......'.......................................................................................~..... - // sub v24.8h, v8.8h, v9.8h // ........................*............................................................................................. - // add v8.8h, v8.8h, v9.8h // ........................'*............................................................................................ - // sqrdmulh v27.8h, v24.8h, v0.h[7] // ........................'..*.......................................................................................... - // mul v9.8h, v24.8h, v0.h[6] // ........................'...*......................................................................................... - // mls v9.8h, v27.8h, v7.h[0] // ........................'........*.................................................................................... - // sub v24.8h, v10.8h, v11.8h // ........................'.*........................................................................................... - // add v10.8h, v10.8h, v11.8h // ......................e.'............................................................................................. - // sqrdmulh v27.8h, v24.8h, v1.h[1] // ........................'......*...................................................................................... - // mul v11.8h, v24.8h, v1.h[0] // ........................'.......*..................................................................................... - // mls v11.8h, v27.8h, v7.h[0] // ........................'..............*.............................................................................. - // sub v24.8h, v12.8h, v13.8h // ........................'.........*................................................................................... - // add v12.8h, v12.8h, v13.8h // ...............e........'......................................................................................~...... - // sqrdmulh v27.8h, v24.8h, v1.h[3] // ........................'...............*............................................................................. - // mul v13.8h, v24.8h, v1.h[2] // ........................'................*............................................................................ - // mls v13.8h, v27.8h, v7.h[0] // ........................'....................*........................................................................ - // sub v24.8h, v14.8h, v15.8h // ........................'.................*........................................................................... - // add v14.8h, v14.8h, v15.8h // ....................e...'...........................................................................................~. - // sqrdmulh v27.8h, v24.8h, v1.h[5] // ........................'.....................*....................................................................... - // mul v15.8h, v24.8h, v1.h[4] // ........................'.......................*..................................................................... - // mls v15.8h, v27.8h, v7.h[0] // ........................'..............................*.............................................................. - // sub v24.8h, v8.8h, v10.8h // ........................'....*........................................................................................ - // add v8.8h, v8.8h, v10.8h // ........................'.....*....................................................................................... - // sqrdmulh v27.8h, v24.8h, v0.h[3] // ........................'..........*.................................................................................. - // mul v10.8h, v24.8h, v0.h[2] // ........................'...........*................................................................................. - // mls v10.8h, v27.8h, v7.h[0] // ........................'......................*...................................................................... - // sub v24.8h, v9.8h, v11.8h // ........................'..................*.......................................................................... - // add v9.8h, v9.8h, v11.8h // ........................'...................*......................................................................... - // sqrdmulh v27.8h, v24.8h, v0.h[3] // ........................'........................*.................................................................... - // mul v11.8h, v24.8h, v0.h[2] // ........................'.........................*................................................................... - // mls v11.8h, v27.8h, v7.h[0] // ........................'...............................*............................................................. - // sub v24.8h, v12.8h, v14.8h // ........................'................................*............................................................ - // add v12.8h, v12.8h, v14.8h // .......................e'............................................................................................. - // sqrdmulh v27.8h, v24.8h, v0.h[5] // ........................'...................................*......................................................... - // mul v14.8h, v24.8h, v0.h[4] // ........................'....................................*........................................................ - // mls v14.8h, v27.8h, v7.h[0] // ........................'..........................................*.................................................. - // sub v24.8h, v13.8h, v15.8h // ........................'..................................*.......................................................... - // add v13.8h, v13.8h, v15.8h // ........................'.....................................*....................................................... - // sqrdmulh v27.8h, v24.8h, v0.h[5] // ........................'......................................*...................................................... - // mul v15.8h, v24.8h, v0.h[4] // ........................'.......................................*..................................................... - // mls v15.8h, v27.8h, v7.h[0] // ........................'...........................................*................................................. - // sub v24.8h, v8.8h, v12.8h // ........................'............*................................................................................ - // add v8.8h, v8.8h, v12.8h // ........................'.............*............................................................................... - // sqrdmulh v27.8h, v24.8h, v0.h[1] // ........................'..........................*.................................................................. - // mul v12.8h, v24.8h, v0.h[0] // ........................'...........................*................................................................. - // mls v12.8h, v27.8h, v7.h[0] // ........................'.................................*........................................................... - // sub v24.8h, v9.8h, v13.8h // ........................'........................................*.................................................... - // add v9.8h, v9.8h, v13.8h // ........................'.........................................*................................................... - // sqrdmulh v27.8h, v24.8h, v0.h[1] // ........................'............................................*................................................ - // mul v13.8h, v24.8h, v0.h[0] // ........................'.............................................*............................................... - // mls v13.8h, v27.8h, v7.h[0] // ........................'.................................................*........................................... - // sub v24.8h, v10.8h, v14.8h // ........................'..............................................*.............................................. - // add v10.8h, v10.8h, v14.8h // ........................'...............................................*............................................. - // sqrdmulh v27.8h, v24.8h, v0.h[1] // ........................'..................................................*.......................................... - // mul v14.8h, v24.8h, v0.h[0] // ........................'...................................................*......................................... - // mls v14.8h, v27.8h, v7.h[0] // ........................'.......................................................*..................................... - // sub v24.8h, v11.8h, v15.8h // ........................'................................................*............................................ - // add v11.8h, v11.8h, v15.8h // ........................'....................................................*........................................ - // sqrdmulh v27.8h, v24.8h, v0.h[1] // ........................'.....................................................*....................................... - // mul v15.8h, v24.8h, v0.h[0] // ........................'......................................................*...................................... - // mls v15.8h, v27.8h, v7.h[0] // ........................'..........................................................*.................................. - // str q12, [x0, #(4*(512/8))] // ........................'........................................................*.................................... - // str q13, [x0, #(5*(512/8))] // ........................'...........................................................*................................. - // str q14, [x0, #(6*(512/8))] // ........................'.............................................................*............................... - // str q15, [x0, #(7*(512/8))] // ........................'...............................................................*............................. - // sqrdmulh v27.8h, v8.8h, v30.8h // ........................'............................*................................................................ - // mul v8.8h, v8.8h, v29.8h // ........................'.............................*............................................................... - // mls v8.8h, v27.8h, v7.h[0] // ........................'.........................................................*................................... - // sqrdmulh v27.8h, v9.8h, v30.8h // ........................'............................................................*................................ - // mul v9.8h, v9.8h, v29.8h // ........................'..............................................................*.............................. - // mls v9.8h, v27.8h, v7.h[0] // ........................'..................................................................*.......................... - // sqrdmulh v27.8h, v10.8h, v30.8h // ........................'................................................................*............................ - // mul v10.8h, v10.8h, v29.8h // ........................'.................................................................*........................... - // mls v10.8h, v27.8h, v7.h[0] // ........................'.....................................................................*....................... - // sqrdmulh v27.8h, v11.8h, v30.8h // ........................'...................................................................*......................... - // mul v11.8h, v11.8h, v29.8h // ........................'....................................................................*........................ - // mls v11.8h, v27.8h, v7.h[0] // ..~.....................'.........................................................................*................... - // str q8, [x0], #(16) // ........................'......................................................................*...................... - // str q9, [x0, #(-16 + 1*(512/8))] // ...~....................'..........................................................................*.................. - // str q10, [x0, #(-16 + 2*(512/8))] // ......~.................'.............................................................................*............... - // str q11, [x0, #(-16 + 3*(512/8))] // .....................~..'............................................................................................* + // |------------------------|------------------------|------------------------|------------------------|-------- + // ldr q8, [x0, #0] // e..........................'........................................................~........................ + // ldr q9, [x0, #(1*(512/8))] // ....e......................'............................................................~.................... + // ldr q10, [x0, #(2*(512/8))] // .......e...................'...............................................................~................. + // ldr q11, [x0, #(3*(512/8))] // ..........e................'..................................................................~.............. + // ldr q12, [x0, #(4*(512/8))] // .............e.............'.....................................................................~........... + // ldr q13, [x0, #(5*(512/8))] // ...............e...........'.......................................................................~......... + // ldr q14, [x0, #(6*(512/8))] // .................e.........'.........................................................................~....... + // ldr q15, [x0, #(7*(512/8))] // ...................e.......'...........................................................................~..... + // sub v24.8h, v8.8h, v9.8h // ...........................*................................................................................. + // add v8.8h, v8.8h, v9.8h // ...........................'*................................................................................ + // sqrdmulh v27.8h, v24.8h, v0.h[7] // ...........................'..*.............................................................................. + // mul v9.8h, v24.8h, v0.h[6] // ...........................'...*............................................................................. + // mls v9.8h, v27.8h, v7.h[0] // ...........................'........*........................................................................ + // sub v24.8h, v10.8h, v11.8h // ...........................'.*............................................................................... + // add v10.8h, v10.8h, v11.8h // .........................e.'................................................................................. + // sqrdmulh v27.8h, v24.8h, v1.h[1] // ...........................'......*.......................................................................... + // mul v11.8h, v24.8h, v1.h[0] // ...........................'.......*......................................................................... + // mls v11.8h, v27.8h, v7.h[0] // ...........................'..............*.................................................................. + // sub v24.8h, v12.8h, v13.8h // ...........................'.........*....................................................................... + // add v12.8h, v12.8h, v13.8h // ......................e....'..............................................................................~.. + // sqrdmulh v27.8h, v24.8h, v1.h[3] // ...........................'...............*................................................................. + // mul v13.8h, v24.8h, v1.h[2] // ...........................'................*................................................................ + // mls v13.8h, v27.8h, v7.h[0] // ...........................'....................*............................................................ + // sub v24.8h, v14.8h, v15.8h // ...........................'.................*............................................................... + // add v14.8h, v14.8h, v15.8h // .......................e...'...............................................................................~. + // sqrdmulh v27.8h, v24.8h, v1.h[5] // ...........................'.....................*........................................................... + // mul v15.8h, v24.8h, v1.h[4] // ...........................'.......................*......................................................... + // mls v15.8h, v27.8h, v7.h[0] // ...........................'.............................*................................................... + // sub v24.8h, v8.8h, v10.8h // ...........................'....*............................................................................ + // add v8.8h, v8.8h, v10.8h // ...........................'.....*........................................................................... + // sqrdmulh v27.8h, v24.8h, v0.h[3] // ...........................'..........*...................................................................... + // mul v10.8h, v24.8h, v0.h[2] // ...........................'...........*..................................................................... + // mls v10.8h, v27.8h, v7.h[0] // ...........................'......................*.......................................................... + // sub v24.8h, v9.8h, v11.8h // ...........................'..................*.............................................................. + // add v9.8h, v9.8h, v11.8h // ...........................'...................*............................................................. + // sqrdmulh v27.8h, v24.8h, v0.h[3] // ...........................'........................*........................................................ + // mul v11.8h, v24.8h, v0.h[2] // ...........................'.........................*....................................................... + // mls v11.8h, v27.8h, v7.h[0] // ...........................'..............................*.................................................. + // sub v24.8h, v12.8h, v14.8h // ...........................'...............................*................................................. + // add v12.8h, v12.8h, v14.8h // ..........................e'................................................................................. + // sqrdmulh v27.8h, v24.8h, v0.h[5] // ...........................'..................................*.............................................. + // mul v14.8h, v24.8h, v0.h[4] // ...........................'...................................*............................................. + // mls v14.8h, v27.8h, v7.h[0] // ...........................'.......................................*......................................... + // sub v24.8h, v13.8h, v15.8h // ...........................'.................................*............................................... + // add v13.8h, v13.8h, v15.8h // ...........................'....................................*............................................ + // sqrdmulh v27.8h, v24.8h, v0.h[5] // ...........................'.....................................*........................................... + // mul v15.8h, v24.8h, v0.h[4] // ...........................'......................................*.......................................... + // mls v15.8h, v27.8h, v7.h[0] // ...........................'..........................................*...................................... + // sub v24.8h, v8.8h, v12.8h // ...........................'............*.................................................................... + // add v8.8h, v8.8h, v12.8h // ...........................'.............*................................................................... + // sqrdmulh v27.8h, v24.8h, v0.h[1] // ...........................'..........................*...................................................... + // mul v12.8h, v24.8h, v0.h[0] // ...........................'...........................*..................................................... + // mls v12.8h, v27.8h, v7.h[0] // ...........................'................................*................................................ + // sub v24.8h, v9.8h, v13.8h // ...........................'........................................*........................................ + // add v9.8h, v9.8h, v13.8h // ...........................'.........................................*....................................... + // sqrdmulh v27.8h, v24.8h, v0.h[1] // ...........................'...........................................*..................................... + // mul v13.8h, v24.8h, v0.h[0] // ...........................'............................................*.................................... + // mls v13.8h, v27.8h, v7.h[0] // ...........................'................................................*................................ + // sub v24.8h, v10.8h, v14.8h // ...........................'.............................................*................................... + // add v10.8h, v10.8h, v14.8h // ...........................'..............................................*.................................. + // sqrdmulh v27.8h, v24.8h, v0.h[1] // ...........................'.................................................*............................... + // mul v14.8h, v24.8h, v0.h[0] // ...........................'..................................................*.............................. + // mls v14.8h, v27.8h, v7.h[0] // ...........................'......................................................*.......................... + // sub v24.8h, v11.8h, v15.8h // ...........................'...............................................*................................. + // add v11.8h, v11.8h, v15.8h // ...........................'...................................................*............................. + // sqrdmulh v27.8h, v24.8h, v0.h[1] // ...........................'....................................................*............................ + // mul v15.8h, v24.8h, v0.h[0] // ...........................'.....................................................*........................... + // mls v15.8h, v27.8h, v7.h[0] // ..~........................'..........................................................*...................... + // str q12, [x0, #(4*(512/8))] // ...........................'.......................................................*......................... + // str q13, [x0, #(5*(512/8))] // ...~.......................'...........................................................*..................... + // str q14, [x0, #(6*(512/8))] // ......~....................'..............................................................*.................. + // str q15, [x0, #(7*(512/8))] // .........~.................'.................................................................*............... + // str q8, [x0], #(16) // ...........................'............................*.................................................... + // str q9, [x0, #(-16 + 1*(512/8))] // ............~..............'....................................................................*............ + // str q10, [x0, #(-16 + 2*(512/8))] // .....................~.....'.............................................................................*... + // str q11, [x0, #(-16 + 3*(512/8))] // ........................~..'................................................................................* sub count, count, #1 cbnz count, layer123_start - // Instructions: 76 - // Expected cycles: 78 + // Instructions: 64 + // Expected cycles: 66 // Expected IPC: 0.97 // - // Cycle bound: 78.0 + // Cycle bound: 66.0 // IPC bound: 0.97 // - // Wall time: 7.41s - // User time: 7.41s + // Wall time: 8.20s + // User time: 8.20s // - // ----------------------------- cycle (expected) ------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|-- - sub v12.8H, v9.8H, v5.8H // *............................................................................. - sub v9.8H, v2.8H, v10.8H // .*............................................................................ - sub v14.8H, v22.8H, v17.8H // ..*........................................................................... - mul v26.8H, v12.8H, v1.H[4] // ...*.......................................................................... - sqrdmulh v18.8H, v12.8H, v1.H[5] // ....*......................................................................... - sqrdmulh v22.8H, v14.8H, v1.H[1] // .....*........................................................................ - mul v5.8H, v14.8H, v1.H[0] // ......*....................................................................... - sub v24.8H, v24.8H, v6.8H // .......*...................................................................... - mul v11.8H, v9.8H, v0.H[6] // ........*..................................................................... - sqrdmulh v8.8H, v9.8H, v0.H[7] // .........*.................................................................... - mul v31.8H, v24.8H, v1.H[2] // ..........*................................................................... - sqrdmulh v17.8H, v24.8H, v1.H[3] // ...........*.................................................................. - sub v25.8H, v28.8H, v21.8H // ............*................................................................. - mls v11.8H, v8.8H, v7.H[0] // .............*................................................................ - mls v26.8H, v18.8H, v7.H[0] // ..............*............................................................... - mls v31.8H, v17.8H, v7.H[0] // ...............*.............................................................. - mls v5.8H, v22.8H, v7.H[0] // ................*............................................................. - sqrdmulh v19.8H, v25.8H, v0.H[5] // .................*............................................................ - mul v9.8H, v25.8H, v0.H[4] // ..................*........................................................... - add v22.8H, v31.8H, v26.8H // ...................*.......................................................... - add v4.8H, v11.8H, v5.8H // ....................*......................................................... - add v16.8H, v2.8H, v10.8H // .....................*........................................................ - mls v9.8H, v19.8H, v7.H[0] // ......................*....................................................... - sub v24.8H, v4.8H, v22.8H // .......................*...................................................... - add v22.8H, v4.8H, v22.8H // ........................*..................................................... - add v2.8H, v16.8H, v23.8H // .........................*.................................................... - sqrdmulh v28.8H, v24.8H, v0.H[1] // ..........................*................................................... - mul v10.8H, v22.8H, v29.8H // ...........................*.................................................. - sqrdmulh v22.8H, v22.8H, v30.8H // ............................*................................................. - sub v6.8H, v2.8H, v3.8H // .............................*................................................ - sub v26.8H, v31.8H, v26.8H // ..............................*............................................... - sub v8.8H, v16.8H, v23.8H // ...............................*.............................................. - sqrdmulh v17.8H, v6.8H, v0.H[1] // ................................*............................................. - mul v21.8H, v26.8H, v0.H[4] // .................................*............................................ - sqrdmulh v19.8H, v26.8H, v0.H[5] // ..................................*........................................... - mul v27.8H, v6.8H, v0.H[0] // ...................................*.......................................... - mls v10.8H, v22.8H, v7.H[0] // ....................................*......................................... - mul v23.8H, v8.8H, v0.H[2] // .....................................*........................................ - sqrdmulh v22.8H, v8.8H, v0.H[3] // ......................................*....................................... - mls v21.8H, v19.8H, v7.H[0] // .......................................*...................................... - sub v26.8H, v11.8H, v5.8H // ........................................*..................................... - add v18.8H, v2.8H, v3.8H // .........................................*.................................... - mls v23.8H, v22.8H, v7.H[0] // ..........................................*................................... - mul v6.8H, v26.8H, v0.H[2] // ...........................................*.................................. - sqrdmulh v31.8H, v26.8H, v0.H[3] // ............................................*................................. - sqrdmulh v15.8H, v18.8H, v30.8H // .............................................*................................ - sub v14.8H, v23.8H, v9.8H // ..............................................*............................... - add v5.8H, v23.8H, v9.8H // ...............................................*.............................. - mls v6.8H, v31.8H, v7.H[0] // ................................................*............................. - mul v18.8H, v18.8H, v29.8H // .................................................*............................ - mul v9.8H, v24.8H, v0.H[0] // ..................................................*........................... - str q10, [x0, #64] // ...................................................*.......................... - sub v24.8H, v6.8H, v21.8H // ....................................................*......................... - mls v18.8H, v15.8H, v7.H[0] // .....................................................*........................ - mls v9.8H, v28.8H, v7.H[0] // ......................................................*....................... - sqrdmulh v2.8H, v24.8H, v0.H[1] // .......................................................*...................... - mul v24.8H, v24.8H, v0.H[0] // ........................................................*..................... - str q18, [x0], #(16) // .........................................................*.................... - add v20.8H, v6.8H, v21.8H // ..........................................................*................... - mul v22.8H, v14.8H, v0.H[0] // ...........................................................*.................. - mls v24.8H, v2.8H, v7.H[0] // ............................................................*................. - sqrdmulh v2.8H, v20.8H, v30.8H // .............................................................*................ - mul v26.8H, v20.8H, v29.8H // ..............................................................*............... - mls v27.8H, v17.8H, v7.H[0] // ...............................................................*.............. - str q24, [x0, #432] // ................................................................*............. - sqrdmulh v23.8H, v14.8H, v0.H[1] // .................................................................*............ - mls v26.8H, v2.8H, v7.H[0] // ..................................................................*........... - str q27, [x0, #240] // ...................................................................*.......... - sqrdmulh v10.8H, v5.8H, v30.8H // ....................................................................*......... - mul v19.8H, v5.8H, v29.8H // .....................................................................*........ - str q26, [x0, #176] // ......................................................................*....... - mls v22.8H, v23.8H, v7.H[0] // .......................................................................*...... - str q9, [x0, #304] // ........................................................................*..... - mls v19.8H, v10.8H, v7.H[0] // .........................................................................*.... - str q22, [x0, #368] // ...........................................................................*.. - str q19, [x0, #112] // .............................................................................* + // ----------------------- cycle (expected) ------------------------> + // 0 25 50 + // |------------------------|------------------------|--------------- + add v14.8H, v3.8H, v6.8H // *................................................................. + sub v13.8H, v25.8H, v20.8H // .*................................................................ + sub v3.8H, v3.8H, v6.8H // ..*............................................................... + sub v29.8H, v14.8H, v27.8H // ...*.............................................................. + mul v28.8H, v13.8H, v0.H[4] // ....*............................................................. + sqrdmulh v10.8H, v13.8H, v0.H[5] // .....*............................................................ + sqrdmulh v13.8H, v29.8H, v0.H[3] // ......*........................................................... + mul v20.8H, v29.8H, v0.H[2] // .......*.......................................................... + sub v19.8H, v30.8H, v12.8H // ........*......................................................... + sqrdmulh v29.8H, v3.8H, v0.H[7] // .........*........................................................ + mls v28.8H, v10.8H, v7.H[0] // ..........*....................................................... + mls v20.8H, v13.8H, v7.H[0] // ...........*...................................................... + sqrdmulh v22.8H, v19.8H, v1.H[1] // ............*..................................................... + mul v23.8H, v19.8H, v1.H[0] // .............*.................................................... + mul v6.8H, v3.8H, v0.H[6] // ..............*................................................... + sub v13.8H, v20.8H, v28.8H // ...............*.................................................. + sub v15.8H, v9.8H, v15.8H // ................*................................................. + mls v23.8H, v22.8H, v7.H[0] // .................*................................................ + sqrdmulh v10.8H, v13.8H, v0.H[1] // ..................*............................................... + mul v13.8H, v13.8H, v0.H[0] // ...................*.............................................. + mls v6.8H, v29.8H, v7.H[0] // ....................*............................................. + sqrdmulh v21.8H, v15.8H, v1.H[5] // .....................*............................................ + mul v15.8H, v15.8H, v1.H[4] // ......................*........................................... + mls v13.8H, v10.8H, v7.H[0] // .......................*.......................................... + sub v16.8H, v6.8H, v23.8H // ........................*......................................... + sub v25.8H, v31.8H, v5.8H // .........................*........................................ + mls v15.8H, v21.8H, v7.H[0] // ..........................*....................................... + mul v30.8H, v16.8H, v0.H[2] // ...........................*...................................... + sqrdmulh v21.8H, v16.8H, v0.H[3] // ............................*..................................... + sqrdmulh v5.8H, v25.8H, v1.H[3] // .............................*.................................... + add v27.8H, v14.8H, v27.8H // ..............................*................................... + mul v25.8H, v25.8H, v1.H[2] // ...............................*.................................. + mls v30.8H, v21.8H, v7.H[0] // ................................*................................. + sub v3.8H, v27.8H, v24.8H // .................................*................................ + str q13, [x0, #384] // ..................................*............................... + mls v25.8H, v5.8H, v7.H[0] // ...................................*.............................. + sqrdmulh v12.8H, v3.8H, v0.H[1] // ....................................*............................. + mul v31.8H, v3.8H, v0.H[0] // .....................................*............................ + add v5.8H, v6.8H, v23.8H // ......................................*........................... + add v10.8H, v25.8H, v15.8H // .......................................*.......................... + sub v6.8H, v25.8H, v15.8H // ........................................*......................... + mls v31.8H, v12.8H, v7.H[0] // .........................................*........................ + add v9.8H, v5.8H, v10.8H // ..........................................*....................... + mul v21.8H, v6.8H, v0.H[4] // ...........................................*...................... + sqrdmulh v6.8H, v6.8H, v0.H[5] // ............................................*..................... + str q31, [x0, #256] // .............................................*.................... + sub v22.8H, v5.8H, v10.8H // ..............................................*................... + str q9, [x0, #64] // ...............................................*.................. + mls v21.8H, v6.8H, v7.H[0] // ................................................*................. + sqrdmulh v6.8H, v22.8H, v0.H[1] // .................................................*................ + mul v3.8H, v22.8H, v0.H[0] // ..................................................*............... + add v12.8H, v20.8H, v28.8H // ...................................................*.............. + sub v13.8H, v30.8H, v21.8H // ....................................................*............. + add v21.8H, v30.8H, v21.8H // .....................................................*............ + mls v3.8H, v6.8H, v7.H[0] // ......................................................*........... + sqrdmulh v10.8H, v13.8H, v0.H[1] // .......................................................*.......... + mul v13.8H, v13.8H, v0.H[0] // ........................................................*......... + str q21, [x0, #192] // .........................................................*........ + add v6.8H, v27.8H, v24.8H // ..........................................................*....... + str q3, [x0, #320] // ...........................................................*...... + mls v13.8H, v10.8H, v7.H[0] // ............................................................*..... + str q6, [x0], #(16) // .............................................................*.... + str q12, [x0, #112] // ...............................................................*.. + str q13, [x0, #432] // .................................................................* - // ----------------------------- cycle (expected) ------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|-- - // sub v26.8H, v2.8H, v10.8H // .*............................................................................ - // add v2.8H, v2.8H, v10.8H // .....................*........................................................ - // sub v22.8H, v22.8H, v17.8H // ..*........................................................................... - // sqrdmulh v10.8H, v26.8H, v0.H[7] // .........*.................................................................... - // mul v26.8H, v26.8H, v0.H[6] // ........*..................................................................... - // sub v17.8H, v2.8H, v23.8H // ...............................*.............................................. - // add v2.8H, v2.8H, v23.8H // .........................*.................................................... - // sqrdmulh v23.8H, v22.8H, v1.H[1] // .....*........................................................................ - // mul v22.8H, v22.8H, v1.H[0] // ......*....................................................................... - // mls v26.8H, v10.8H, v7.H[0] // .............*................................................................ - // sub v10.8H, v24.8H, v6.8H // .......*...................................................................... - // sqrdmulh v24.8H, v17.8H, v0.H[3] // ......................................*....................................... - // mul v17.8H, v17.8H, v0.H[2] // .....................................*........................................ - // sub v6.8H, v2.8H, v3.8H // .............................*................................................ - // add v2.8H, v2.8H, v3.8H // .........................................*.................................... - // mls v22.8H, v23.8H, v7.H[0] // ................*............................................................. - // sqrdmulh v23.8H, v10.8H, v1.H[3] // ...........*.................................................................. - // mul v10.8H, v10.8H, v1.H[2] // ..........*................................................................... - // sub v9.8H, v9.8H, v5.8H // *............................................................................. - // sub v5.8H, v26.8H, v22.8H // ........................................*..................................... - // add v26.8H, v26.8H, v22.8H // ....................*......................................................... - // mls v10.8H, v23.8H, v7.H[0] // ...............*.............................................................. - // sqrdmulh v22.8H, v9.8H, v1.H[5] // ....*......................................................................... - // mls v17.8H, v24.8H, v7.H[0] // ..........................................*................................... - // mul v23.8H, v9.8H, v1.H[4] // ...*.......................................................................... - // sqrdmulh v24.8H, v5.8H, v0.H[3] // ............................................*................................. - // mul v9.8H, v5.8H, v0.H[2] // ...........................................*.................................. - // sqrdmulh v5.8H, v6.8H, v0.H[1] // ................................*............................................. - // mul v6.8H, v6.8H, v0.H[0] // ...................................*.......................................... - // sqrdmulh v3.8H, v2.8H, v30.8H // .............................................*................................ - // mul v2.8H, v2.8H, v29.8H // .................................................*............................ - // mls v23.8H, v22.8H, v7.H[0] // ..............*............................................................... - // mls v9.8H, v24.8H, v7.H[0] // ................................................*............................. - // sub v22.8H, v28.8H, v21.8H // ............*................................................................. - // mls v6.8H, v5.8H, v7.H[0] // ...............................................................*.............. - // sub v24.8H, v10.8H, v23.8H // ..............................*............................................... - // sqrdmulh v5.8H, v22.8H, v0.H[5] // .................*............................................................ - // mul v22.8H, v22.8H, v0.H[4] // ..................*........................................................... - // add v10.8H, v10.8H, v23.8H // ...................*.......................................................... - // sqrdmulh v23.8H, v24.8H, v0.H[5] // ..................................*........................................... - // mul v24.8H, v24.8H, v0.H[4] // .................................*............................................ - // sub v28.8H, v26.8H, v10.8H // .......................*...................................................... - // add v26.8H, v26.8H, v10.8H // ........................*..................................................... - // mls v22.8H, v5.8H, v7.H[0] // ......................*....................................................... - // mls v24.8H, v23.8H, v7.H[0] // .......................................*...................................... - // sqrdmulh v10.8H, v28.8H, v0.H[1] // ..........................*................................................... - // mul v23.8H, v28.8H, v0.H[0] // ..................................................*........................... - // sub v5.8H, v17.8H, v22.8H // ..............................................*............................... - // add v22.8H, v17.8H, v22.8H // ...............................................*.............................. - // sub v17.8H, v9.8H, v24.8H // ....................................................*......................... - // mls v23.8H, v10.8H, v7.H[0] // ......................................................*....................... - // sqrdmulh v10.8H, v5.8H, v0.H[1] // .................................................................*............ - // mul v5.8H, v5.8H, v0.H[0] // ...........................................................*.................. - // add v24.8H, v9.8H, v24.8H // ..........................................................*................... - // sqrdmulh v9.8H, v17.8H, v0.H[1] // .......................................................*...................... - // mul v17.8H, v17.8H, v0.H[0] // ........................................................*..................... - // mls v5.8H, v10.8H, v7.H[0] // .......................................................................*...... - // str q6, [x0, #256] // ...................................................................*.......... - // mls v2.8H, v3.8H, v7.H[0] // .....................................................*........................ - // mls v17.8H, v9.8H, v7.H[0] // ............................................................*................. - // str q23, [x0, #320] // ........................................................................*..... - // sqrdmulh v10.8H, v26.8H, v30.8H // ............................*................................................. - // str q5, [x0, #384] // ...........................................................................*.. - // mul v26.8H, v26.8H, v29.8H // ...........................*.................................................. - // str q17, [x0, #448] // ................................................................*............. - // sqrdmulh v17.8H, v22.8H, v30.8H // ....................................................................*......... - // mul v22.8H, v22.8H, v29.8H // .....................................................................*........ - // mls v26.8H, v10.8H, v7.H[0] // ....................................*......................................... - // sqrdmulh v10.8H, v24.8H, v30.8H // .............................................................*................ - // mul v23.8H, v24.8H, v29.8H // ..............................................................*............... - // mls v22.8H, v17.8H, v7.H[0] // .........................................................................*.... - // str q2, [x0], #(16) // .........................................................*.................... - // mls v23.8H, v10.8H, v7.H[0] // ..................................................................*........... - // str q26, [x0, #48] // ...................................................*.......................... - // str q22, [x0, #112] // .............................................................................* - // str q23, [x0, #176] // ......................................................................*....... + // ----------------------- cycle (expected) ------------------------> + // 0 25 50 + // |------------------------|------------------------|--------------- + // sub v13.8H, v3.8H, v6.8H // ..*............................................................... + // add v10.8H, v3.8H, v6.8H // *................................................................. + // sub v21.8H, v30.8H, v12.8H // ........*......................................................... + // sqrdmulh v3.8H, v13.8H, v0.H[7] // .........*........................................................ + // mul v13.8H, v13.8H, v0.H[6] // ..............*................................................... + // sub v12.8H, v10.8H, v27.8H // ...*.............................................................. + // add v10.8H, v10.8H, v27.8H // ..............................*................................... + // sqrdmulh v6.8H, v21.8H, v1.H[1] // ............*..................................................... + // mul v21.8H, v21.8H, v1.H[0] // .............*.................................................... + // mls v13.8H, v3.8H, v7.H[0] // ....................*............................................. + // sub v3.8H, v31.8H, v5.8H // .........................*........................................ + // sqrdmulh v30.8H, v12.8H, v0.H[3] // ......*........................................................... + // mul v12.8H, v12.8H, v0.H[2] // .......*.......................................................... + // sub v31.8H, v10.8H, v24.8H // .................................*................................ + // add v10.8H, v10.8H, v24.8H // ..........................................................*....... + // mls v21.8H, v6.8H, v7.H[0] // .................*................................................ + // sqrdmulh v6.8H, v3.8H, v1.H[3] // .............................*.................................... + // mul v3.8H, v3.8H, v1.H[2] // ...............................*.................................. + // sub v5.8H, v9.8H, v15.8H // ................*................................................. + // sub v9.8H, v13.8H, v21.8H // ........................*......................................... + // add v13.8H, v13.8H, v21.8H // ......................................*........................... + // mls v3.8H, v6.8H, v7.H[0] // ...................................*.............................. + // sqrdmulh v21.8H, v5.8H, v1.H[5] // .....................*............................................ + // mls v12.8H, v30.8H, v7.H[0] // ...........*...................................................... + // mul v6.8H, v5.8H, v1.H[4] // ......................*........................................... + // sqrdmulh v30.8H, v9.8H, v0.H[3] // ............................*..................................... + // mul v5.8H, v9.8H, v0.H[2] // ...........................*...................................... + // sqrdmulh v9.8H, v31.8H, v0.H[1] // ....................................*............................. + // mul v31.8H, v31.8H, v0.H[0] // .....................................*............................ + // str q10, [x0], #(16) // .............................................................*.... + // mls v6.8H, v21.8H, v7.H[0] // ..........................*....................................... + // mls v5.8H, v30.8H, v7.H[0] // ................................*................................. + // sub v10.8H, v25.8H, v20.8H // .*................................................................ + // mls v31.8H, v9.8H, v7.H[0] // .........................................*........................ + // sub v21.8H, v3.8H, v6.8H // ........................................*......................... + // sqrdmulh v30.8H, v10.8H, v0.H[5] // .....*............................................................ + // mul v10.8H, v10.8H, v0.H[4] // ....*............................................................. + // add v3.8H, v3.8H, v6.8H // .......................................*.......................... + // sqrdmulh v6.8H, v21.8H, v0.H[5] // ............................................*..................... + // mul v21.8H, v21.8H, v0.H[4] // ...........................................*...................... + // mls v10.8H, v30.8H, v7.H[0] // ..........*....................................................... + // sub v30.8H, v13.8H, v3.8H // ..............................................*................... + // add v13.8H, v13.8H, v3.8H // ..........................................*....................... + // mls v21.8H, v6.8H, v7.H[0] // ................................................*................. + // sqrdmulh v3.8H, v30.8H, v0.H[1] // .................................................*................ + // mul v6.8H, v30.8H, v0.H[0] // ..................................................*............... + // sub v30.8H, v12.8H, v10.8H // ...............*.................................................. + // add v10.8H, v12.8H, v10.8H // ...................................................*.............. + // sub v12.8H, v5.8H, v21.8H // ....................................................*............. + // mls v6.8H, v3.8H, v7.H[0] // ......................................................*........... + // sqrdmulh v3.8H, v30.8H, v0.H[1] // ..................*............................................... + // mul v30.8H, v30.8H, v0.H[0] // ...................*.............................................. + // add v21.8H, v5.8H, v21.8H // .....................................................*............ + // sqrdmulh v5.8H, v12.8H, v0.H[1] // .......................................................*.......... + // mul v12.8H, v12.8H, v0.H[0] // ........................................................*......... + // mls v30.8H, v3.8H, v7.H[0] // .......................*.......................................... + // str q31, [x0, #240] // .............................................*.................... + // mls v12.8H, v5.8H, v7.H[0] // ............................................................*..... + // str q6, [x0, #304] // ...........................................................*...... + // str q30, [x0, #368] // ..................................*............................... + // str q12, [x0, #432] // .................................................................* + // str q13, [x0, #48] // ...............................................*.................. + // str q10, [x0, #112] // ...............................................................*.. + // str q21, [x0, #176] // .........................................................*........ pop_stack diff --git a/mlkem/native/aarch64/ntt_clean.S b/mlkem/native/aarch64/ntt_clean.S index 8f1f046e0..e60713f4d 100644 --- a/mlkem/native/aarch64/ntt_clean.S +++ b/mlkem/native/aarch64/ntt_clean.S @@ -29,10 +29,19 @@ // Needed to provide ASM_LOAD directive #include "common.i" +// Bounds: +// If C is chosen so that |src| < q * C, then |dst| < q * (0.0508 * C + 1/2) +// +// See mlken/reduce.c and test/test_bounds.py for more details. .macro mulmodq dst, src, const, idx0, idx1 - sqrdmulh t2.8h, \src\().8h, \const\().h[\idx1] - mul \dst\().8h, \src\().8h, \const\().h[\idx0] - mls \dst\().8h, t2.8h, consts.h[0] + // Signed barrett multiplication using + // round-to-nearest-even-integer approximation. + // Following https://eprint.iacr.org/2021/986.pdf, this + // is functionally the same as a signed Montgomery multiplication + // with a suitable constant of absolute value < q. + sqrdmulh t2.8h, \src\().8h, \const\().h[\idx1\()] + mul \dst\().8h, \src\().8h, \const\().h[\idx0\()] + mls \dst\().8h, t2.8h, consts.h[0] .endm .macro mulmod dst, src, const, const_twisted @@ -204,6 +213,20 @@ _ntt_asm_clean: load_roots_123 .p2align 2 + + // Bounds reasoning: + // - There are 7 layers + // - When passing from layer N to layer N+1, each layer-N value + // is modified through the addition/subtraction of a Montgomery + // product of a twiddle of absolute value < q/2 and a layer-N value. + // - Recalling that for C such that |a| < C * q and |t| + + // Bounds reasoning: + // - There are 7 layers + // - When passing from layer N to layer N+1, each layer-N value + // is modified through the addition/subtraction of a Montgomery + // product of a twiddle of absolute value < q/2 and a layer-N value. + // - Recalling that for C such that |a| < C * q and |t| + // 0 25 + // |------------------------|---- + ldr q20, [x0, #0] // *............................. + ldr q27, [x0, #64] // ..*........................... + ldr q15, [x0, #128] // ....*......................... + ldr q21, [x0, #192] // ......*....................... + ldr q19, [x0, #256] // ........*..................... + ldr q28, [x0, #448] // ..........*................... + mul v6.8H, v19.8H, v0.H[0] // ............*................. + ldr q29, [x0, #320] // .............*................ + mul v3.8H, v28.8H, v0.H[0] // ...............*.............. + ldr q2, [x0, #384] // ................*............. + + // ------ cycle (expected) ------> // 0 25 - // |------------------------|---- - ldr q21, [x0, #0] // *............................. - ldr q8, [x0, #64] // ..*........................... - ldr q5, [x0, #128] // ....*......................... - ldr q4, [x0, #192] // ......*....................... - ldr q15, [x0, #256] // ........*..................... - ldr q6, [x0, #448] // ..........*................... - mul v25.8H, v15.8H, v0.H[0] // ............*................. - ldr q30, [x0, #320] // .............*................ - mul v11.8H, v6.8H, v0.H[0] // ...............*.............. - ldr q17, [x0, #384] // ................*............. - - // ------ cycle (expected) ------> - // 0 25 - // |------------------------|----- - // ldr q21, [x0, #0] // *.............................. - // ldr q8, [x0, #64] // ..*............................ - // ldr q5, [x0, #128] // ....*.......................... - // ldr q4, [x0, #192] // ......*........................ - // ldr q15, [x0, #256] // ........*...................... - // ldr q30, [x0, #320] // .............*................. - // mul v25.8H, v15.8H, v0.H[0] // ............*.................. - // ldr q6, [x0, #448] // ..........*.................... - // ldr q17, [x0, #384] // ................*.............. - // mul v11.8H, v6.8H, v0.H[0] // ...............*............... + // |------------------------|----- + // ldr q20, [x0, #0] // *.............................. + // ldr q27, [x0, #64] // ..*............................ + // ldr q15, [x0, #128] // ....*.......................... + // ldr q21, [x0, #192] // ......*........................ + // ldr q19, [x0, #256] // ........*...................... + // ldr q29, [x0, #320] // .............*................. + // mul v6.8H, v19.8H, v0.H[0] // ............*.................. + // ldr q28, [x0, #448] // ..........*.................... + // ldr q2, [x0, #384] // ................*.............. + // mul v3.8H, v28.8H, v0.H[0] // ...............*............... sub count, count, #1 layer123_start: @@ -251,168 +272,168 @@ layer123_start: // Cycle bound: 84.0 // IPC bound: 0.90 // - // Wall time: 2.33s - // User time: 2.33s + // Wall time: 2.35s + // User time: 2.35s // // -------------------------------- cycle (expected) ---------------------------------> // 0 25 50 75 // |------------------------|------------------------|------------------------|-------- - sqrdmulh v13.8H, v15.8H, v0.H[1] // *................................................................................... - sqrdmulh v15.8H, v30.8H, v0.H[1] // .*.................................................................................. - mul v30.8H, v30.8H, v0.H[0] // ..*................................................................................. - sqrdmulh v3.8H, v17.8H, v0.H[1] // ...*................................................................................ - mls v25.8H, v13.8H, v7.H[0] // ....*............................................................................... - mul v13.8H, v17.8H, v0.H[0] // .....*.............................................................................. - mls v30.8H, v15.8H, v7.H[0] // ......*............................................................................. - sqrdmulh v15.8H, v6.8H, v0.H[1] // .......*............................................................................ - sub v6.8H, v21.8H, v25.8H // ........*........................................................................... - mls v13.8H, v3.8H, v7.H[0] // .........*.......................................................................... - sub v3.8H, v8.8H, v30.8H // ..........*......................................................................... - add v30.8H, v8.8H, v30.8H // ...........*........................................................................ - add v25.8H, v21.8H, v25.8H // ............*....................................................................... - sub v17.8H, v5.8H, v13.8H // .............*...................................................................... - add v13.8H, v5.8H, v13.8H // ..............*..................................................................... - mls v11.8H, v15.8H, v7.H[0] // ...............*.................................................................... - sqrdmulh v15.8H, v17.8H, v0.H[5] // ................*................................................................... - mul v17.8H, v17.8H, v0.H[4] // .................*.................................................................. - sqrdmulh v21.8H, v13.8H, v0.H[3] // ..................*................................................................. - sub v8.8H, v4.8H, v11.8H // ...................*................................................................ - add v11.8H, v4.8H, v11.8H // ....................*............................................................... - mls v17.8H, v15.8H, v7.H[0] // .....................*.............................................................. - sqrdmulh v15.8H, v8.8H, v0.H[5] // ......................*............................................................. - mul v8.8H, v8.8H, v0.H[4] // .......................*............................................................ - mul v13.8H, v13.8H, v0.H[2] // ........................*........................................................... - sub v5.8H, v6.8H, v17.8H // .........................*.......................................................... - add v6.8H, v6.8H, v17.8H // ..........................*......................................................... - mls v8.8H, v15.8H, v7.H[0] // ...........................*........................................................ - sqrdmulh v15.8H, v11.8H, v0.H[3] // ............................*....................................................... - mul v17.8H, v11.8H, v0.H[2] // .............................*...................................................... - mls v13.8H, v21.8H, v7.H[0] // ..............................*..................................................... - sub v11.8H, v3.8H, v8.8H // ...............................*.................................................... - add v3.8H, v3.8H, v8.8H // ................................*................................................... - mls v17.8H, v15.8H, v7.H[0] // .................................*.................................................. - sub v15.8H, v25.8H, v13.8H // ..................................*................................................. - add v13.8H, v25.8H, v13.8H // ...................................*................................................ - sqrdmulh v25.8H, v3.8H, v1.H[3] // ....................................*............................................... - sub v21.8H, v30.8H, v17.8H // .....................................*.............................................. - add v30.8H, v30.8H, v17.8H // ......................................*............................................. - mul v3.8H, v3.8H, v1.H[2] // .......................................*............................................ - sqrdmulh v17.8H, v21.8H, v1.H[1] // ........................................*........................................... - sqrdmulh v8.8H, v30.8H, v0.H[7] // .........................................*.......................................... - mul v30.8H, v30.8H, v0.H[6] // ..........................................*......................................... - mul v21.8H, v21.8H, v1.H[0] // ...........................................*........................................ - mls v3.8H, v25.8H, v7.H[0] // ............................................*....................................... - sqrdmulh v25.8H, v11.8H, v1.H[5] // .............................................*...................................... - mls v30.8H, v8.8H, v7.H[0] // ..............................................*..................................... - mls v21.8H, v17.8H, v7.H[0] // ...............................................*.................................... - sub v17.8H, v6.8H, v3.8H // ................................................*................................... - add v3.8H, v6.8H, v3.8H // .................................................*.................................. - sub v6.8H, v13.8H, v30.8H // ..................................................*................................. - mul v11.8H, v11.8H, v1.H[4] // ...................................................*................................ - add v13.8H, v13.8H, v30.8H // ....................................................*............................... - sub v30.8H, v15.8H, v21.8H // .....................................................*.............................. - add v15.8H, v15.8H, v21.8H // ......................................................*............................. - mls v11.8H, v25.8H, v7.H[0] // .......................................................*............................ - str q13, [x0], #(16) // ........................................................*........................... - ldr q21, [x0, #0] // .........................................................e.......................... - sub v13.8H, v5.8H, v11.8H // ...........................................................*........................ - add v25.8H, v5.8H, v11.8H // ............................................................*....................... - str q6, [x0, #48] // .............................................................*...................... - ldr q8, [x0, #64] // ..............................................................e..................... - str q15, [x0, #112] // ................................................................*................... - ldr q5, [x0, #128] // .................................................................e.................. - str q30, [x0, #176] // ...................................................................*................ - ldr q4, [x0, #192] // ....................................................................e............... - str q3, [x0, #240] // ......................................................................*............. - ldr q15, [x0, #256] // .......................................................................e............ - str q17, [x0, #304] // .........................................................................*.......... - ldr q30, [x0, #320] // ..........................................................................e......... - str q25, [x0, #368] // ............................................................................*....... - mul v25.8H, v15.8H, v0.H[0] // .............................................................................e...... - str q13, [x0, #432] // ..............................................................................*..... - ldr q6, [x0, #448] // ...............................................................................e.... - ldr q17, [x0, #384] // .................................................................................e.. - mul v11.8H, v6.8H, v0.H[0] // ...................................................................................e - - // ------------------------------------------- cycle (expected) --------------------------------------------> - // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|----- - // ldr q8, [x0, #0] // e..........................'........................................................~..................... - // ldr q9, [x0, #(1*(512/8))] // .....e.....................'.............................................................~................ - // ldr q10, [x0, #(2*(512/8))] // ........e..................'................................................................~............. - // ldr q11, [x0, #(3*(512/8))] // ...........e...............'...................................................................~.......... - // ldr q12, [x0, #(4*(512/8))] // ..............e............'......................................................................~....... - // ldr q13, [x0, #(5*(512/8))] // .................e.........'.........................................................................~.... - // ldr q14, [x0, #(6*(512/8))] // ........................e..'.............................................................................. - // ldr q15, [x0, #(7*(512/8))] // ......................e....'.............................................................................. - // sqrdmulh v27.8h, v12.8h, v0.h[1] // ...........................*.............................................................................. - // mul v24.8h, v12.8h, v0.h[0] // ....................e......'............................................................................~. - // mls v24.8h, v27.8h, v7.h[0] // ...........................'...*.......................................................................... - // sub v12.8h, v8.8h, v24.8h // ...........................'.......*...................................................................... - // add v8.8h, v8.8h, v24.8h // ...........................'...........*.................................................................. - // sqrdmulh v27.8h, v13.8h, v0.h[1] // ...........................'*............................................................................. - // mul v24.8h, v13.8h, v0.h[0] // ...........................'.*............................................................................ - // mls v24.8h, v27.8h, v7.h[0] // ...........................'.....*........................................................................ - // sub v13.8h, v9.8h, v24.8h // ...........................'.........*.................................................................... - // add v9.8h, v9.8h, v24.8h // ...........................'..........*................................................................... - // sqrdmulh v27.8h, v14.8h, v0.h[1] // ...........................'..*........................................................................... - // mul v24.8h, v14.8h, v0.h[0] // ...........................'....*......................................................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'........*..................................................................... - // sub v14.8h, v10.8h, v24.8h // ...........................'............*................................................................. - // add v10.8h, v10.8h, v24.8h // ...........................'.............*................................................................ - // sqrdmulh v27.8h, v15.8h, v0.h[1] // ...........................'......*....................................................................... - // mul v24.8h, v15.8h, v0.h[0] // ..........................e'.............................................................................. - // mls v24.8h, v27.8h, v7.h[0] // ...........................'..............*............................................................... - // sub v15.8h, v11.8h, v24.8h // ...........................'..................*........................................................... - // add v11.8h, v11.8h, v24.8h // ...........................'...................*.......................................................... - // sqrdmulh v27.8h, v10.8h, v0.h[3] // ...........................'.................*............................................................ - // mul v24.8h, v10.8h, v0.h[2] // ...........................'.......................*...................................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'.............................*................................................ - // sub v10.8h, v8.8h, v24.8h // ...........................'.................................*............................................ - // add v8.8h, v8.8h, v24.8h // ...........................'..................................*........................................... - // sqrdmulh v27.8h, v11.8h, v0.h[3] // ...........................'...........................*.................................................. - // mul v24.8h, v11.8h, v0.h[2] // ...........................'............................*................................................. - // mls v24.8h, v27.8h, v7.h[0] // ...........................'................................*............................................. - // sub v11.8h, v9.8h, v24.8h // ...........................'....................................*......................................... - // add v9.8h, v9.8h, v24.8h // ...........................'.....................................*........................................ - // sqrdmulh v27.8h, v14.8h, v0.h[5] // ...........................'...............*.............................................................. - // mul v24.8h, v14.8h, v0.h[4] // ...........................'................*............................................................. - // mls v24.8h, v27.8h, v7.h[0] // ...........................'....................*......................................................... - // sub v14.8h, v12.8h, v24.8h // ...........................'........................*..................................................... - // add v12.8h, v12.8h, v24.8h // ...........................'.........................*.................................................... - // sqrdmulh v27.8h, v15.8h, v0.h[5] // ...........................'.....................*........................................................ - // mul v24.8h, v15.8h, v0.h[4] // ...........................'......................*....................................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'..........................*................................................... - // sub v15.8h, v13.8h, v24.8h // ...........................'..............................*............................................... - // add v13.8h, v13.8h, v24.8h // ...........................'...............................*.............................................. - // sqrdmulh v27.8h, v9.8h, v0.h[7] // ...........................'........................................*..................................... - // mul v24.8h, v9.8h, v0.h[6] // ...........................'.........................................*.................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'.............................................*................................ - // sub v9.8h, v8.8h, v24.8h // ...........................'.................................................*............................ - // add v8.8h, v8.8h, v24.8h // ...........................'...................................................*.......................... - // sqrdmulh v27.8h, v11.8h, v1.h[1] // ...........................'.......................................*...................................... - // mul v24.8h, v11.8h, v1.h[0] // ...........................'..........................................*................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'..............................................*............................... - // sub v11.8h, v10.8h, v24.8h // ...........................'....................................................*......................... - // add v10.8h, v10.8h, v24.8h // ...........................'.....................................................*........................ - // sqrdmulh v27.8h, v13.8h, v1.h[3] // ...........................'...................................*.......................................... - // mul v24.8h, v13.8h, v1.h[2] // ...........................'......................................*....................................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'...........................................*.................................. - // sub v13.8h, v12.8h, v24.8h // ...........................'...............................................*.............................. - // add v12.8h, v12.8h, v24.8h // ...........................'................................................*............................. - // sqrdmulh v27.8h, v15.8h, v1.h[5] // ...........................'............................................*................................. - // mul v24.8h, v15.8h, v1.h[4] // ...........................'..................................................*........................... - // mls v24.8h, v27.8h, v7.h[0] // ...........................'......................................................*....................... - // sub v15.8h, v14.8h, v24.8h // ..~........................'..........................................................*................... - // add v14.8h, v14.8h, v24.8h // ...~.......................'...........................................................*.................. - // str q8, [x0], #(16) // ...........................'.......................................................*...................... - // str q9, [x0, #(-16 + 1*(512/8))] // ....~......................'............................................................*................. - // str q10, [x0, #(-16 + 2*(512/8))] // .......~...................'...............................................................*.............. - // str q11, [x0, #(-16 + 3*(512/8))] // ..........~................'..................................................................*........... - // str q12, [x0, #(-16 + 4*(512/8))] // .............~.............'.....................................................................*........ - // str q13, [x0, #(-16 + 5*(512/8))] // ................~..........'........................................................................*..... - // str q14, [x0, #(-16 + 6*(512/8))] // ...................~.......'...........................................................................*.. - // str q15, [x0, #(-16 + 7*(512/8))] // .....................~.....'.............................................................................* + sqrdmulh v30.8H, v19.8H, v0.H[1] // *................................................................................... + sqrdmulh v19.8H, v29.8H, v0.H[1] // .*.................................................................................. + mul v29.8H, v29.8H, v0.H[0] // ..*................................................................................. + sqrdmulh v23.8H, v2.8H, v0.H[1] // ...*................................................................................ + mls v6.8H, v30.8H, v7.H[0] // ....*............................................................................... + mul v30.8H, v2.8H, v0.H[0] // .....*.............................................................................. + mls v29.8H, v19.8H, v7.H[0] // ......*............................................................................. + sqrdmulh v19.8H, v28.8H, v0.H[1] // .......*............................................................................ + sub v28.8H, v20.8H, v6.8H // ........*........................................................................... + mls v30.8H, v23.8H, v7.H[0] // .........*.......................................................................... + sub v23.8H, v27.8H, v29.8H // ..........*......................................................................... + add v29.8H, v27.8H, v29.8H // ...........*........................................................................ + add v6.8H, v20.8H, v6.8H // ............*....................................................................... + sub v2.8H, v15.8H, v30.8H // .............*...................................................................... + add v30.8H, v15.8H, v30.8H // ..............*..................................................................... + mls v3.8H, v19.8H, v7.H[0] // ...............*.................................................................... + sqrdmulh v19.8H, v2.8H, v0.H[5] // ................*................................................................... + mul v2.8H, v2.8H, v0.H[4] // .................*.................................................................. + sqrdmulh v20.8H, v30.8H, v0.H[3] // ..................*................................................................. + sub v27.8H, v21.8H, v3.8H // ...................*................................................................ + add v3.8H, v21.8H, v3.8H // ....................*............................................................... + mls v2.8H, v19.8H, v7.H[0] // .....................*.............................................................. + sqrdmulh v19.8H, v27.8H, v0.H[5] // ......................*............................................................. + mul v27.8H, v27.8H, v0.H[4] // .......................*............................................................ + mul v30.8H, v30.8H, v0.H[2] // ........................*........................................................... + sub v15.8H, v28.8H, v2.8H // .........................*.......................................................... + add v28.8H, v28.8H, v2.8H // ..........................*......................................................... + mls v27.8H, v19.8H, v7.H[0] // ...........................*........................................................ + sqrdmulh v19.8H, v3.8H, v0.H[3] // ............................*....................................................... + mul v2.8H, v3.8H, v0.H[2] // .............................*...................................................... + mls v30.8H, v20.8H, v7.H[0] // ..............................*..................................................... + sub v3.8H, v23.8H, v27.8H // ...............................*.................................................... + add v23.8H, v23.8H, v27.8H // ................................*................................................... + mls v2.8H, v19.8H, v7.H[0] // .................................*.................................................. + sub v19.8H, v6.8H, v30.8H // ..................................*................................................. + add v30.8H, v6.8H, v30.8H // ...................................*................................................ + sqrdmulh v6.8H, v23.8H, v1.H[3] // ....................................*............................................... + sub v20.8H, v29.8H, v2.8H // .....................................*.............................................. + add v29.8H, v29.8H, v2.8H // ......................................*............................................. + mul v23.8H, v23.8H, v1.H[2] // .......................................*............................................ + sqrdmulh v2.8H, v20.8H, v1.H[1] // ........................................*........................................... + sqrdmulh v27.8H, v29.8H, v0.H[7] // .........................................*.......................................... + mul v29.8H, v29.8H, v0.H[6] // ..........................................*......................................... + mul v20.8H, v20.8H, v1.H[0] // ...........................................*........................................ + mls v23.8H, v6.8H, v7.H[0] // ............................................*....................................... + sqrdmulh v6.8H, v3.8H, v1.H[5] // .............................................*...................................... + mls v29.8H, v27.8H, v7.H[0] // ..............................................*..................................... + mls v20.8H, v2.8H, v7.H[0] // ...............................................*.................................... + sub v2.8H, v28.8H, v23.8H // ................................................*................................... + add v23.8H, v28.8H, v23.8H // .................................................*.................................. + sub v28.8H, v30.8H, v29.8H // ..................................................*................................. + mul v3.8H, v3.8H, v1.H[4] // ...................................................*................................ + add v30.8H, v30.8H, v29.8H // ....................................................*............................... + sub v29.8H, v19.8H, v20.8H // .....................................................*.............................. + add v19.8H, v19.8H, v20.8H // ......................................................*............................. + mls v3.8H, v6.8H, v7.H[0] // .......................................................*............................ + str q30, [x0], #(16) // ........................................................*........................... + ldr q20, [x0, #0] // .........................................................e.......................... + sub v30.8H, v15.8H, v3.8H // ...........................................................*........................ + add v6.8H, v15.8H, v3.8H // ............................................................*....................... + str q28, [x0, #48] // .............................................................*...................... + ldr q27, [x0, #64] // ..............................................................e..................... + str q19, [x0, #112] // ................................................................*................... + ldr q15, [x0, #128] // .................................................................e.................. + str q29, [x0, #176] // ...................................................................*................ + ldr q21, [x0, #192] // ....................................................................e............... + str q23, [x0, #240] // ......................................................................*............. + ldr q19, [x0, #256] // .......................................................................e............ + str q2, [x0, #304] // .........................................................................*.......... + ldr q29, [x0, #320] // ..........................................................................e......... + str q6, [x0, #368] // ............................................................................*....... + mul v6.8H, v19.8H, v0.H[0] // .............................................................................e...... + str q30, [x0, #432] // ..............................................................................*..... + ldr q28, [x0, #448] // ...............................................................................e.... + ldr q2, [x0, #384] // .................................................................................e.. + mul v3.8H, v28.8H, v0.H[0] // ...................................................................................e + + // ------------------------------------------- cycle (expected) --------------------------------------------> + // 0 25 50 75 100 + // |------------------------|------------------------|------------------------|------------------------|----- + // ldr q8, [x0, #0] // e..........................'........................................................~..................... + // ldr q9, [x0, #(1*(512/8))] // .....e.....................'.............................................................~................ + // ldr q10, [x0, #(2*(512/8))] // ........e..................'................................................................~............. + // ldr q11, [x0, #(3*(512/8))] // ...........e...............'...................................................................~.......... + // ldr q12, [x0, #(4*(512/8))] // ..............e............'......................................................................~....... + // ldr q13, [x0, #(5*(512/8))] // .................e.........'.........................................................................~.... + // ldr q14, [x0, #(6*(512/8))] // ........................e..'.............................................................................. + // ldr q15, [x0, #(7*(512/8))] // ......................e....'.............................................................................. + // sqrdmulh v27.8h, v12.8h, v0.h[1] // ...........................*.............................................................................. + // mul v24.8h, v12.8h, v0.h[0] // ....................e......'............................................................................~. + // mls v24.8h, v27.8h, v7.h[0] // ...........................'...*.......................................................................... + // sub v12.8h, v8.8h, v24.8h // ...........................'.......*...................................................................... + // add v8.8h, v8.8h, v24.8h // ...........................'...........*.................................................................. + // sqrdmulh v27.8h, v13.8h, v0.h[1] // ...........................'*............................................................................. + // mul v24.8h, v13.8h, v0.h[0] // ...........................'.*............................................................................ + // mls v24.8h, v27.8h, v7.h[0] // ...........................'.....*........................................................................ + // sub v13.8h, v9.8h, v24.8h // ...........................'.........*.................................................................... + // add v9.8h, v9.8h, v24.8h // ...........................'..........*................................................................... + // sqrdmulh v27.8h, v14.8h, v0.h[1] // ...........................'..*........................................................................... + // mul v24.8h, v14.8h, v0.h[0] // ...........................'....*......................................................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'........*..................................................................... + // sub v14.8h, v10.8h, v24.8h // ...........................'............*................................................................. + // add v10.8h, v10.8h, v24.8h // ...........................'.............*................................................................ + // sqrdmulh v27.8h, v15.8h, v0.h[1] // ...........................'......*....................................................................... + // mul v24.8h, v15.8h, v0.h[0] // ..........................e'.............................................................................. + // mls v24.8h, v27.8h, v7.h[0] // ...........................'..............*............................................................... + // sub v15.8h, v11.8h, v24.8h // ...........................'..................*........................................................... + // add v11.8h, v11.8h, v24.8h // ...........................'...................*.......................................................... + // sqrdmulh v27.8h, v10.8h, v0.h[3] // ...........................'.................*............................................................ + // mul v24.8h, v10.8h, v0.h[2] // ...........................'.......................*...................................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'.............................*................................................ + // sub v10.8h, v8.8h, v24.8h // ...........................'.................................*............................................ + // add v8.8h, v8.8h, v24.8h // ...........................'..................................*........................................... + // sqrdmulh v27.8h, v11.8h, v0.h[3] // ...........................'...........................*.................................................. + // mul v24.8h, v11.8h, v0.h[2] // ...........................'............................*................................................. + // mls v24.8h, v27.8h, v7.h[0] // ...........................'................................*............................................. + // sub v11.8h, v9.8h, v24.8h // ...........................'....................................*......................................... + // add v9.8h, v9.8h, v24.8h // ...........................'.....................................*........................................ + // sqrdmulh v27.8h, v14.8h, v0.h[5] // ...........................'...............*.............................................................. + // mul v24.8h, v14.8h, v0.h[4] // ...........................'................*............................................................. + // mls v24.8h, v27.8h, v7.h[0] // ...........................'....................*......................................................... + // sub v14.8h, v12.8h, v24.8h // ...........................'........................*..................................................... + // add v12.8h, v12.8h, v24.8h // ...........................'.........................*.................................................... + // sqrdmulh v27.8h, v15.8h, v0.h[5] // ...........................'.....................*........................................................ + // mul v24.8h, v15.8h, v0.h[4] // ...........................'......................*....................................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'..........................*................................................... + // sub v15.8h, v13.8h, v24.8h // ...........................'..............................*............................................... + // add v13.8h, v13.8h, v24.8h // ...........................'...............................*.............................................. + // sqrdmulh v27.8h, v9.8h, v0.h[7] // ...........................'........................................*..................................... + // mul v24.8h, v9.8h, v0.h[6] // ...........................'.........................................*.................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'.............................................*................................ + // sub v9.8h, v8.8h, v24.8h // ...........................'.................................................*............................ + // add v8.8h, v8.8h, v24.8h // ...........................'...................................................*.......................... + // sqrdmulh v27.8h, v11.8h, v1.h[1] // ...........................'.......................................*...................................... + // mul v24.8h, v11.8h, v1.h[0] // ...........................'..........................................*................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'..............................................*............................... + // sub v11.8h, v10.8h, v24.8h // ...........................'....................................................*......................... + // add v10.8h, v10.8h, v24.8h // ...........................'.....................................................*........................ + // sqrdmulh v27.8h, v13.8h, v1.h[3] // ...........................'...................................*.......................................... + // mul v24.8h, v13.8h, v1.h[2] // ...........................'......................................*....................................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'...........................................*.................................. + // sub v13.8h, v12.8h, v24.8h // ...........................'...............................................*.............................. + // add v12.8h, v12.8h, v24.8h // ...........................'................................................*............................. + // sqrdmulh v27.8h, v15.8h, v1.h[5] // ...........................'............................................*................................. + // mul v24.8h, v15.8h, v1.h[4] // ...........................'..................................................*........................... + // mls v24.8h, v27.8h, v7.h[0] // ...........................'......................................................*....................... + // sub v15.8h, v14.8h, v24.8h // ..~........................'..........................................................*................... + // add v14.8h, v14.8h, v24.8h // ...~.......................'...........................................................*.................. + // str q8, [x0], #(16) // ...........................'.......................................................*...................... + // str q9, [x0, #(-16 + 1*(512/8))] // ....~......................'............................................................*................. + // str q10, [x0, #(-16 + 2*(512/8))] // .......~...................'...............................................................*.............. + // str q11, [x0, #(-16 + 3*(512/8))] // ..........~................'..................................................................*........... + // str q12, [x0, #(-16 + 4*(512/8))] // .............~.............'.....................................................................*........ + // str q13, [x0, #(-16 + 5*(512/8))] // ................~..........'........................................................................*..... + // str q14, [x0, #(-16 + 6*(512/8))] // ...................~.......'...........................................................................*.. + // str q15, [x0, #(-16 + 7*(512/8))] // .....................~.....'.............................................................................* sub count, count, #1 cbnz count, layer123_start @@ -429,493 +450,445 @@ layer123_start: // ------------------------ cycle (expected) ------------------------> // 0 25 50 // |------------------------|------------------------|---------------- - sqrdmulh v26.8H, v6.8H, v0.H[1] // *.................................................................. - mul v10.8H, v17.8H, v0.H[0] // .*................................................................. - sqrdmulh v9.8H, v17.8H, v0.H[1] // ..*................................................................ - mul v6.8H, v30.8H, v0.H[0] // ...*............................................................... - mls v11.8H, v26.8H, v7.H[0] // ....*.............................................................. - sqrdmulh v3.8H, v30.8H, v0.H[1] // .....*............................................................. - mls v10.8H, v9.8H, v7.H[0] // ......*............................................................ - sqrdmulh v24.8H, v15.8H, v0.H[1] // .......*........................................................... - add v12.8H, v4.8H, v11.8H // ........*.......................................................... - mls v6.8H, v3.8H, v7.H[0] // .........*......................................................... - sub v22.8H, v5.8H, v10.8H // ..........*........................................................ - sqrdmulh v30.8H, v12.8H, v0.H[3] // ...........*....................................................... - mul v15.8H, v12.8H, v0.H[2] // ............*...................................................... - mul v17.8H, v22.8H, v0.H[4] // .............*..................................................... - sqrdmulh v3.8H, v22.8H, v0.H[5] // ..............*.................................................... - mls v25.8H, v24.8H, v7.H[0] // ...............*................................................... - mls v15.8H, v30.8H, v7.H[0] // ................*.................................................. - add v26.8H, v8.8H, v6.8H // .................*................................................. - mls v17.8H, v3.8H, v7.H[0] // ..................*................................................ - sub v28.8H, v21.8H, v25.8H // ...................*............................................... - add v27.8H, v5.8H, v10.8H // ....................*.............................................. - sub v13.8H, v26.8H, v15.8H // .....................*............................................. - add v5.8H, v28.8H, v17.8H // ......................*............................................ - sub v14.8H, v28.8H, v17.8H // .......................*........................................... - mul v3.8H, v13.8H, v1.H[0] // ........................*.......................................... - sqrdmulh v28.8H, v27.8H, v0.H[3] // .........................*......................................... - mul v9.8H, v27.8H, v0.H[2] // ..........................*........................................ - sqrdmulh v30.8H, v13.8H, v1.H[1] // ...........................*....................................... - sub v13.8H, v4.8H, v11.8H // ............................*...................................... - add v31.8H, v21.8H, v25.8H // .............................*..................................... - mls v9.8H, v28.8H, v7.H[0] // ..............................*.................................... - sqrdmulh v28.8H, v13.8H, v0.H[5] // ...............................*................................... - mul v17.8H, v13.8H, v0.H[4] // ................................*.................................. - mls v3.8H, v30.8H, v7.H[0] // .................................*................................. - sub v24.8H, v31.8H, v9.8H // ..................................*................................ - sub v25.8H, v8.8H, v6.8H // ...................................*............................... - mls v17.8H, v28.8H, v7.H[0] // ....................................*.............................. - sub v30.8H, v24.8H, v3.8H // .....................................*............................. - add v13.8H, v24.8H, v3.8H // ......................................*............................ - add v3.8H, v26.8H, v15.8H // .......................................*........................... - str q30, [x0, #192] // ........................................*.......................... - add v30.8H, v25.8H, v17.8H // .........................................*......................... - str q13, [x0, #128] // ..........................................*........................ - sub v17.8H, v25.8H, v17.8H // ...........................................*....................... - sqrdmulh v8.8H, v30.8H, v1.H[3] // ............................................*...................... - mul v11.8H, v30.8H, v1.H[2] // .............................................*..................... - add v24.8H, v31.8H, v9.8H // ..............................................*.................... - sqrdmulh v15.8H, v17.8H, v1.H[5] // ...............................................*................... - mul v17.8H, v17.8H, v1.H[4] // ................................................*.................. - mls v11.8H, v8.8H, v7.H[0] // .................................................*................. - sqrdmulh v13.8H, v3.8H, v0.H[7] // ..................................................*................ - mul v30.8H, v3.8H, v0.H[6] // ...................................................*............... - mls v17.8H, v15.8H, v7.H[0] // ....................................................*.............. - add v22.8H, v5.8H, v11.8H // .....................................................*............. - sub v3.8H, v5.8H, v11.8H // ......................................................*............ - mls v30.8H, v13.8H, v7.H[0] // .......................................................*........... - str q22, [x0, #256] // ........................................................*.......... - add v13.8H, v14.8H, v17.8H // .........................................................*......... - str q3, [x0, #320] // ..........................................................*........ - sub v15.8H, v14.8H, v17.8H // ...........................................................*....... - str q13, [x0, #384] // ............................................................*...... - add v2.8H, v24.8H, v30.8H // .............................................................*..... - str q15, [x0, #448] // ..............................................................*.... - sub v3.8H, v24.8H, v30.8H // ...............................................................*... - str q2, [x0], #(16) // ................................................................*.. - str q3, [x0, #48] // ..................................................................* + sqrdmulh v23.8H, v28.8H, v0.H[1] // *.................................................................. + sqrdmulh v28.8H, v2.8H, v0.H[1] // .*................................................................. + mul v5.8H, v29.8H, v0.H[0] // ..*................................................................ + mul v2.8H, v2.8H, v0.H[0] // ...*............................................................... + mls v3.8H, v23.8H, v7.H[0] // ....*.............................................................. + sqrdmulh v13.8H, v29.8H, v0.H[1] // .....*............................................................. + sqrdmulh v30.8H, v19.8H, v0.H[1] // ......*............................................................ + mls v2.8H, v28.8H, v7.H[0] // .......*........................................................... + sub v23.8H, v21.8H, v3.8H // ........*.......................................................... + mls v5.8H, v13.8H, v7.H[0] // .........*......................................................... + mls v6.8H, v30.8H, v7.H[0] // ..........*........................................................ + mul v29.8H, v23.8H, v0.H[4] // ...........*....................................................... + sqrdmulh v30.8H, v23.8H, v0.H[5] // ............*...................................................... + add v8.8H, v15.8H, v2.8H // .............*..................................................... + sub v19.8H, v15.8H, v2.8H // ..............*.................................................... + sub v18.8H, v27.8H, v5.8H // ...............*................................................... + mls v29.8H, v30.8H, v7.H[0] // ................*.................................................. + mul v2.8H, v19.8H, v0.H[4] // .................*................................................. + sqrdmulh v13.8H, v19.8H, v0.H[5] // ..................*................................................ + add v31.8H, v20.8H, v6.8H // ...................*............................................... + sub v30.8H, v18.8H, v29.8H // ....................*.............................................. + sub v12.8H, v20.8H, v6.8H // .....................*............................................. + sqrdmulh v23.8H, v8.8H, v0.H[3] // ......................*............................................ + sqrdmulh v19.8H, v30.8H, v1.H[5] // .......................*........................................... + mul v28.8H, v30.8H, v1.H[4] // ........................*.......................................... + mls v2.8H, v13.8H, v7.H[0] // .........................*......................................... + mul v15.8H, v8.8H, v0.H[2] // ..........................*........................................ + add v24.8H, v21.8H, v3.8H // ...........................*....................................... + mls v28.8H, v19.8H, v7.H[0] // ............................*...................................... + sub v8.8H, v12.8H, v2.8H // .............................*..................................... + mls v15.8H, v23.8H, v7.H[0] // ..............................*.................................... + sqrdmulh v11.8H, v24.8H, v0.H[3] // ...............................*................................... + sub v30.8H, v8.8H, v28.8H // ................................*.................................. + mul v13.8H, v24.8H, v0.H[2] // .................................*................................. + sub v20.8H, v31.8H, v15.8H // ..................................*................................ + str q30, [x0, #448] // ...................................*............................... + add v24.8H, v8.8H, v28.8H // ....................................*.............................. + mls v13.8H, v11.8H, v7.H[0] // .....................................*............................. + add v3.8H, v27.8H, v5.8H // ......................................*............................ + str q24, [x0, #384] // .......................................*........................... + add v4.8H, v31.8H, v15.8H // ........................................*.......................... + sub v11.8H, v3.8H, v13.8H // .........................................*......................... + add v19.8H, v3.8H, v13.8H // ..........................................*........................ + add v10.8H, v18.8H, v29.8H // ...........................................*....................... + sqrdmulh v30.8H, v11.8H, v1.H[1] // ............................................*...................... + mul v13.8H, v11.8H, v1.H[0] // .............................................*..................... + mul v6.8H, v19.8H, v0.H[6] // ..............................................*.................... + sqrdmulh v26.8H, v19.8H, v0.H[7] // ...............................................*................... + mul v23.8H, v10.8H, v1.H[2] // ................................................*.................. + mls v13.8H, v30.8H, v7.H[0] // .................................................*................. + sqrdmulh v19.8H, v10.8H, v1.H[3] // ..................................................*................ + mls v6.8H, v26.8H, v7.H[0] // ...................................................*............... + add v21.8H, v12.8H, v2.8H // ....................................................*.............. + add v30.8H, v20.8H, v13.8H // .....................................................*............. + mls v23.8H, v19.8H, v7.H[0] // ......................................................*............ + sub v29.8H, v20.8H, v13.8H // .......................................................*........... + str q30, [x0, #128] // ........................................................*.......... + add v5.8H, v4.8H, v6.8H // .........................................................*......... + str q29, [x0, #192] // ..........................................................*........ + sub v19.8H, v4.8H, v6.8H // ...........................................................*....... + str q5, [x0], #(16) // ............................................................*...... + sub v30.8H, v21.8H, v23.8H // .............................................................*..... + str q19, [x0, #48] // ..............................................................*.... + add v2.8H, v21.8H, v23.8H // ...............................................................*... + str q30, [x0, #304] // ................................................................*.. + str q2, [x0, #240] // ..................................................................* // ------------------------ cycle (expected) ------------------------> // 0 25 50 // |------------------------|------------------------|---------------- - // sqrdmulh v13.8H, v15.8H, v0.H[1] // .......*........................................................... - // sqrdmulh v15.8H, v30.8H, v0.H[1] // .....*............................................................. - // mul v30.8H, v30.8H, v0.H[0] // ...*............................................................... - // sqrdmulh v3.8H, v17.8H, v0.H[1] // ..*................................................................ - // mls v25.8H, v13.8H, v7.H[0] // ...............*................................................... - // mul v13.8H, v17.8H, v0.H[0] // .*................................................................. - // mls v30.8H, v15.8H, v7.H[0] // .........*......................................................... - // sqrdmulh v15.8H, v6.8H, v0.H[1] // *.................................................................. - // sub v6.8H, v21.8H, v25.8H // ...................*............................................... - // mls v13.8H, v3.8H, v7.H[0] // ......*............................................................ - // sub v3.8H, v8.8H, v30.8H // ...................................*............................... - // add v30.8H, v8.8H, v30.8H // .................*................................................. - // add v25.8H, v21.8H, v25.8H // .............................*..................................... - // sub v17.8H, v5.8H, v13.8H // ..........*........................................................ - // add v13.8H, v5.8H, v13.8H // ....................*.............................................. - // mls v11.8H, v15.8H, v7.H[0] // ....*.............................................................. - // sqrdmulh v15.8H, v17.8H, v0.H[5] // ..............*.................................................... - // mul v17.8H, v17.8H, v0.H[4] // .............*..................................................... - // sqrdmulh v21.8H, v13.8H, v0.H[3] // .........................*......................................... - // sub v8.8H, v4.8H, v11.8H // ............................*...................................... - // add v11.8H, v4.8H, v11.8H // ........*.......................................................... - // mls v17.8H, v15.8H, v7.H[0] // ..................*................................................ - // sqrdmulh v15.8H, v8.8H, v0.H[5] // ...............................*................................... - // mul v8.8H, v8.8H, v0.H[4] // ................................*.................................. - // mul v13.8H, v13.8H, v0.H[2] // ..........................*........................................ - // sub v5.8H, v6.8H, v17.8H // .......................*........................................... - // add v6.8H, v6.8H, v17.8H // ......................*............................................ - // mls v8.8H, v15.8H, v7.H[0] // ....................................*.............................. - // sqrdmulh v15.8H, v11.8H, v0.H[3] // ...........*....................................................... - // mul v17.8H, v11.8H, v0.H[2] // ............*...................................................... - // mls v13.8H, v21.8H, v7.H[0] // ..............................*.................................... - // sub v11.8H, v3.8H, v8.8H // ...........................................*....................... - // add v3.8H, v3.8H, v8.8H // .........................................*......................... - // mls v17.8H, v15.8H, v7.H[0] // ................*.................................................. - // sub v15.8H, v25.8H, v13.8H // ..................................*................................ - // add v13.8H, v25.8H, v13.8H // ..............................................*.................... - // sqrdmulh v25.8H, v3.8H, v1.H[3] // ............................................*...................... - // sub v21.8H, v30.8H, v17.8H // .....................*............................................. - // add v30.8H, v30.8H, v17.8H // .......................................*........................... - // mul v3.8H, v3.8H, v1.H[2] // .............................................*..................... - // sqrdmulh v17.8H, v21.8H, v1.H[1] // ...........................*....................................... - // sqrdmulh v8.8H, v30.8H, v0.H[7] // ..................................................*................ - // mul v30.8H, v30.8H, v0.H[6] // ...................................................*............... - // mul v21.8H, v21.8H, v1.H[0] // ........................*.......................................... - // mls v3.8H, v25.8H, v7.H[0] // .................................................*................. - // sqrdmulh v25.8H, v11.8H, v1.H[5] // ...............................................*................... - // mls v30.8H, v8.8H, v7.H[0] // .......................................................*........... - // mls v21.8H, v17.8H, v7.H[0] // .................................*................................. - // sub v17.8H, v6.8H, v3.8H // ......................................................*............ - // add v3.8H, v6.8H, v3.8H // .....................................................*............. - // sub v6.8H, v13.8H, v30.8H // ...............................................................*... - // mul v11.8H, v11.8H, v1.H[4] // ................................................*.................. - // add v13.8H, v13.8H, v30.8H // .............................................................*..... - // sub v30.8H, v15.8H, v21.8H // .....................................*............................. - // add v15.8H, v15.8H, v21.8H // ......................................*............................ - // mls v11.8H, v25.8H, v7.H[0] // ....................................................*.............. - // str q13, [x0], #(16) // ................................................................*.. - // sub v13.8H, v5.8H, v11.8H // ...........................................................*....... - // add v25.8H, v5.8H, v11.8H // .........................................................*......... - // str q6, [x0, #48] // ..................................................................* - // str q15, [x0, #112] // ..........................................*........................ - // str q30, [x0, #176] // ........................................*.......................... - // str q3, [x0, #240] // ........................................................*.......... - // str q17, [x0, #304] // ..........................................................*........ - // str q25, [x0, #368] // ............................................................*...... - // str q13, [x0, #432] // ..............................................................*.... + // sqrdmulh v30.8H, v19.8H, v0.H[1] // ......*............................................................ + // sqrdmulh v19.8H, v29.8H, v0.H[1] // .....*............................................................. + // mul v29.8H, v29.8H, v0.H[0] // ..*................................................................ + // sqrdmulh v23.8H, v2.8H, v0.H[1] // .*................................................................. + // mls v6.8H, v30.8H, v7.H[0] // ..........*........................................................ + // mul v30.8H, v2.8H, v0.H[0] // ...*............................................................... + // mls v29.8H, v19.8H, v7.H[0] // .........*......................................................... + // sqrdmulh v19.8H, v28.8H, v0.H[1] // *.................................................................. + // sub v28.8H, v20.8H, v6.8H // .....................*............................................. + // mls v30.8H, v23.8H, v7.H[0] // .......*........................................................... + // sub v23.8H, v27.8H, v29.8H // ...............*................................................... + // add v29.8H, v27.8H, v29.8H // ......................................*............................ + // add v6.8H, v20.8H, v6.8H // ...................*............................................... + // sub v2.8H, v15.8H, v30.8H // ..............*.................................................... + // add v30.8H, v15.8H, v30.8H // .............*..................................................... + // mls v3.8H, v19.8H, v7.H[0] // ....*.............................................................. + // sqrdmulh v19.8H, v2.8H, v0.H[5] // ..................*................................................ + // mul v2.8H, v2.8H, v0.H[4] // .................*................................................. + // sqrdmulh v20.8H, v30.8H, v0.H[3] // ......................*............................................ + // sub v27.8H, v21.8H, v3.8H // ........*.......................................................... + // add v3.8H, v21.8H, v3.8H // ...........................*....................................... + // mls v2.8H, v19.8H, v7.H[0] // .........................*......................................... + // sqrdmulh v19.8H, v27.8H, v0.H[5] // ............*...................................................... + // mul v27.8H, v27.8H, v0.H[4] // ...........*....................................................... + // mul v30.8H, v30.8H, v0.H[2] // ..........................*........................................ + // sub v15.8H, v28.8H, v2.8H // .............................*..................................... + // add v28.8H, v28.8H, v2.8H // ....................................................*.............. + // mls v27.8H, v19.8H, v7.H[0] // ................*.................................................. + // sqrdmulh v19.8H, v3.8H, v0.H[3] // ...............................*................................... + // mul v2.8H, v3.8H, v0.H[2] // .................................*................................. + // mls v30.8H, v20.8H, v7.H[0] // ..............................*.................................... + // sub v3.8H, v23.8H, v27.8H // ....................*.............................................. + // add v23.8H, v23.8H, v27.8H // ...........................................*....................... + // mls v2.8H, v19.8H, v7.H[0] // .....................................*............................. + // sub v19.8H, v6.8H, v30.8H // ..................................*................................ + // add v30.8H, v6.8H, v30.8H // ........................................*.......................... + // sqrdmulh v6.8H, v23.8H, v1.H[3] // ..................................................*................ + // sub v20.8H, v29.8H, v2.8H // .........................................*......................... + // add v29.8H, v29.8H, v2.8H // ..........................................*........................ + // mul v23.8H, v23.8H, v1.H[2] // ................................................*.................. + // sqrdmulh v2.8H, v20.8H, v1.H[1] // ............................................*...................... + // sqrdmulh v27.8H, v29.8H, v0.H[7] // ...............................................*................... + // mul v29.8H, v29.8H, v0.H[6] // ..............................................*.................... + // mul v20.8H, v20.8H, v1.H[0] // .............................................*..................... + // mls v23.8H, v6.8H, v7.H[0] // ......................................................*............ + // sqrdmulh v6.8H, v3.8H, v1.H[5] // .......................*........................................... + // mls v29.8H, v27.8H, v7.H[0] // ...................................................*............... + // mls v20.8H, v2.8H, v7.H[0] // .................................................*................. + // sub v2.8H, v28.8H, v23.8H // .............................................................*..... + // add v23.8H, v28.8H, v23.8H // ...............................................................*... + // sub v28.8H, v30.8H, v29.8H // ...........................................................*....... + // mul v3.8H, v3.8H, v1.H[4] // ........................*.......................................... + // add v30.8H, v30.8H, v29.8H // .........................................................*......... + // sub v29.8H, v19.8H, v20.8H // .......................................................*........... + // add v19.8H, v19.8H, v20.8H // .....................................................*............. + // mls v3.8H, v6.8H, v7.H[0] // ............................*...................................... + // str q30, [x0], #(16) // ............................................................*...... + // sub v30.8H, v15.8H, v3.8H // ................................*.................................. + // add v6.8H, v15.8H, v3.8H // ....................................*.............................. + // str q28, [x0, #48] // ..............................................................*.... + // str q19, [x0, #112] // ........................................................*.......... + // str q29, [x0, #176] // ..........................................................*........ + // str q23, [x0, #240] // ..................................................................* + // str q2, [x0, #304] // ................................................................*.. + // str q6, [x0, #368] // .......................................*........................... + // str q30, [x0, #432] // ...................................*............................... mov in, inp mov count, #8 .p2align 2 - // Instructions: 55 - // Expected cycles: 66 - // Expected IPC: 0.83 - // - // Cycle bound: 66.0 - // IPC bound: 0.83 - // - // Wall time: 7.68s - // User time: 7.68s - // - // ----------------------- cycle (expected) ------------------------> - // 0 25 50 - // |------------------------|------------------------|--------------- - ldr q11, [x3], #16 // *................................................................. - ldr q15, [x0, #48] // ..*............................................................... - ldr q30, [x0, #32] // ....*............................................................. - mul v25.8H, v15.8H, v11.H[0] // ......*........................................................... - sqrdmulh v15.8H, v15.8H, v11.H[1] // .......*.......................................................... - sqrdmulh v21.8H, v30.8H, v11.H[1] // ........*......................................................... - ldr q12, [x0, #16] // .........*........................................................ - mls v25.8H, v15.8H, v7.H[0] // ...........*...................................................... - mul v8.8H, v30.8H, v11.H[0] // ............*..................................................... - ldr q6, [x0, #0] // .............*.................................................... - sub v3.8H, v12.8H, v25.8H // ...............*.................................................. - add v15.8H, v12.8H, v25.8H // ................*................................................. - mls v8.8H, v21.8H, v7.H[0] // .................*................................................ - mul v13.8H, v3.8H, v11.H[4] // ..................*............................................... - sqrdmulh v3.8H, v3.8H, v11.H[5] // ...................*.............................................. - sqrdmulh v30.8H, v15.8H, v11.H[3] // ....................*............................................. - mul v15.8H, v15.8H, v11.H[2] // .....................*............................................ - ldr q24, [x4, #16] // ......................*........................................... - mls v13.8H, v3.8H, v7.H[0] // ........................*......................................... - sub v18.8H, v6.8H, v8.8H // .........................*........................................ - mls v15.8H, v30.8H, v7.H[0] // ..........................*....................................... - add v3.8H, v6.8H, v8.8H // ...........................*...................................... - add v25.8H, v18.8H, v13.8H // ............................*..................................... - sub v21.8H, v18.8H, v13.8H // .............................*.................................... - add v13.8H, v3.8H, v15.8H // ..............................*................................... - sub v15.8H, v3.8H, v15.8H // ...............................*.................................. - trn1 v11.4S, v25.4S, v21.4S // ................................*................................. - trn2 v6.4S, v25.4S, v21.4S // .................................*................................ - trn1 v3.4S, v13.4S, v15.4S // ..................................*............................... - ldr q9, [x4], #(6*16) // ...................................*.............................. - trn2 v30.2D, v3.2D, v11.2D // .....................................*............................ - trn2 v4.4S, v13.4S, v15.4S // ......................................*........................... - sqrdmulh v15.8H, v30.8H, v24.8H // .......................................*.......................... - mul v5.8H, v30.8H, v9.8H // ........................................*......................... - trn2 v30.2D, v4.2D, v6.2D // .........................................*........................ - ldr q17, [x4, #-48] // ..........................................*....................... - sqrdmulh v25.8H, v30.8H, v24.8H // ............................................*..................... - mul v8.8H, v30.8H, v9.8H // .............................................*.................... - ldr q13, [x4, #-64] // ..............................................*................... - trn1 v21.2D, v3.2D, v11.2D // ................................................*................. - mls v8.8H, v25.8H, v7.H[0] // .................................................*................ - trn1 v11.2D, v4.2D, v6.2D // ..................................................*............... - ldr q30, [x4, #-16] // ...................................................*.............. - add v25.8H, v11.8H, v8.8H // .....................................................*............ - sub v11.8H, v11.8H, v8.8H // ......................................................*........... - mls v5.8H, v15.8H, v7.H[0] // .......................................................*.......... - sqrdmulh v17.8H, v25.8H, v17.8H // ........................................................*......... - mul v13.8H, v25.8H, v13.8H // .........................................................*........ - sqrdmulh v6.8H, v11.8H, v30.8H // ..........................................................*....... - ldr q25, [x4, #-32] // ...........................................................*...... - mls v13.8H, v17.8H, v7.H[0] // .............................................................*.... - add v15.8H, v21.8H, v5.8H // ..............................................................*... - sub v3.8H, v21.8H, v5.8H // ...............................................................*.. - mul v25.8H, v11.8H, v25.8H // ................................................................*. - sub v11.8H, v15.8H, v13.8H // .................................................................* - - // ----------------------- cycle (expected) ------------------------> - // 0 25 50 - // |------------------------|------------------------|--------------- - // ldr q0, [x4, #16] // ......................*........................................... - // ldr q8, [x3], #16 // *................................................................. - // ldr q14, [x0, #16] // .........*........................................................ - // ldr q22, [x0, #32] // ....*............................................................. - // sqrdmulh v31.8H, v22.8H, v8.H[1] // ........*......................................................... - // ldr q19, [x0, #48] // ..*............................................................... - // sqrdmulh v16.8H, v19.8H, v8.H[1] // .......*.......................................................... - // mul v30.8H, v19.8H, v8.H[0] // ......*........................................................... - // mul v29.8H, v22.8H, v8.H[0] // ............*..................................................... - // mls v29.8H, v31.8H, v7.H[0] // .................*................................................ - // mls v30.8H, v16.8H, v7.H[0] // ...........*...................................................... - // sub v6.8H, v14.8H, v30.8H // ...............*.................................................. - // ldr q15, [x0, #0] // .............*.................................................... - // add v13.8H, v14.8H, v30.8H // ................*................................................. - // sqrdmulh v30.8H, v6.8H, v8.H[5] // ...................*.............................................. - // mul v6.8H, v6.8H, v8.H[4] // ..................*............................................... - // sqrdmulh v17.8H, v13.8H, v8.H[3] // ....................*............................................. - // mul v22.8H, v13.8H, v8.H[2] // .....................*............................................ - // sub v3.8H, v15.8H, v29.8H // .........................*........................................ - // add v15.8H, v15.8H, v29.8H // ...........................*...................................... - // mls v6.8H, v30.8H, v7.H[0] // ........................*......................................... - // mls v22.8H, v17.8H, v7.H[0] // ..........................*....................................... - // ldr q25, [x4], #(6*16) // ...................................*.............................. - // sub v18.8H, v3.8H, v6.8H // .............................*.................................... - // add v30.8H, v3.8H, v6.8H // ............................*..................................... - // sub v6.8H, v15.8H, v22.8H // ...............................*.................................. - // add v13.8H, v15.8H, v22.8H // ..............................*................................... - // trn1 v14.4S, v30.4S, v18.4S // ................................*................................. - // trn2 v4.4S, v30.4S, v18.4S // .................................*................................ - // trn1 v16.4S, v13.4S, v6.4S // ..................................*............................... - // trn2 v10.4S, v13.4S, v6.4S // ......................................*........................... - // ldr q30, [x4, #-48] // ..........................................*....................... - // trn2 v21.2D, v16.2D, v14.2D // .....................................*............................ - // trn2 v17.2D, v10.2D, v4.2D // .........................................*........................ - // mul v11.8H, v21.8H, v25.8H // ........................................*......................... - // mul v25.8H, v17.8H, v25.8H // .............................................*.................... - // sqrdmulh v3.8H, v17.8H, v0.8H // ............................................*..................... - // sqrdmulh v27.8H, v21.8H, v0.8H // .......................................*.......................... - // trn1 v15.2D, v16.2D, v14.2D // ................................................*................. - // trn1 v13.2D, v10.2D, v4.2D // ..................................................*............... - // mls v25.8H, v3.8H, v7.H[0] // .................................................*................ - // mls v11.8H, v27.8H, v7.H[0] // .......................................................*.......... - // ldr q2, [x4, #-64] // ..............................................*................... - // sub v29.8H, v13.8H, v25.8H // ......................................................*........... - // add v13.8H, v13.8H, v25.8H // .....................................................*............ - // ldr q25, [x4, #-32] // ...........................................................*...... - // sqrdmulh v30.8H, v13.8H, v30.8H // ........................................................*......... - // mul v13.8H, v13.8H, v2.8H // .........................................................*........ - // sub v3.8H, v15.8H, v11.8H // ...............................................................*.. - // ldr q5, [x4, #-16] // ...................................................*.............. - // mls v13.8H, v30.8H, v7.H[0] // .............................................................*.... - // add v15.8H, v15.8H, v11.8H // ..............................................................*... - // sqrdmulh v6.8H, v29.8H, v5.8H // ..........................................................*....... - // mul v25.8H, v29.8H, v25.8H // ................................................................*. - // sub v11.8H, v15.8H, v13.8H // .................................................................* + // Instructions: 9 + // Expected cycles: 13 + // Expected IPC: 0.69 + // + // Cycle bound: 13.0 + // IPC bound: 0.69 + // + // Wall time: 0.01s + // User time: 0.01s + // + // ----- cycle (expected) ------> + // 0 25 + // |------------------------|---- + ldr q19, [x0, #48] // *............................. + ldr q9, [x3], #16 // ..*........................... + ldr q11, [x0, #32] // ....*......................... + sqrdmulh v30.8H, v19.8H, v9.H[1] // ......*....................... + mul v4.8H, v19.8H, v9.H[0] // .......*...................... + sqrdmulh v12.8H, v11.8H, v9.H[1] // ........*..................... + ldr q18, [x4, #32] // .........*.................... + mls v4.8H, v30.8H, v7.H[0] // ...........*.................. + ldr q0, [x4, #64] // ............*................. + + // ------ cycle (expected) ------> + // 0 25 + // |------------------------|----- + // ldr q8, [x0, #48] // *.............................. + // ldr q9, [x3], #16 // ..*............................ + // sqrdmulh v31.8H, v8.8H, v9.H[1] // ......*........................ + // ldr q11, [x0, #32] // ....*.......................... + // sqrdmulh v12.8H, v11.8H, v9.H[1] // ........*...................... + // ldr q18, [x4, #32] // .........*..................... + // mul v4.8H, v8.8H, v9.H[0] // .......*....................... + // ldr q0, [x4, #64] // ............*.................. + // mls v4.8H, v31.8H, v7.H[0] // ...........*................... sub count, count, #1 layer4567_start: - // Instructions: 72 - // Expected cycles: 87 - // Expected IPC: 0.83 + // Instructions: 60 + // Expected cycles: 75 + // Expected IPC: 0.80 // - // Cycle bound: 87.0 - // IPC bound: 0.83 + // Cycle bound: 75.0 + // IPC bound: 0.80 // - // Wall time: 187.92s - // User time: 187.92s + // Wall time: 112.33s + // User time: 112.33s // - // ---------------------------------- cycle (expected) ----------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|----------- - ldr q0, [x4, #16] // e...................................................................................... - ldr q8, [x3], #16 // ..e.................................................................................... - ldr q14, [x0, #80] // ....e.................................................................................. - mls v25.8H, v6.8H, v7.H[0] // ......*................................................................................ - ldr q22, [x0, #96] // .......e............................................................................... - add v10.8H, v15.8H, v13.8H // .........*............................................................................. - sub v13.8H, v3.8H, v25.8H // ..........*............................................................................ - sqrdmulh v31.8H, v22.8H, v8.H[1] // ...........e........................................................................... - ldr q19, [x0, #112] // ............e.......................................................................... - sqdmulh v23.8H, v13.8H, v7.H[1] // ..............*........................................................................ - add v12.8H, v3.8H, v25.8H // ...............*....................................................................... - sqrdmulh v16.8H, v19.8H, v8.H[1] // ................e...................................................................... - mul v30.8H, v19.8H, v8.H[0] // .................e..................................................................... - srshr v15.8H, v23.8H, #11 // ..................*.................................................................... - sqdmulh v3.8H, v11.8H, v7.H[1] // ...................*................................................................... - mul v29.8H, v22.8H, v8.H[0] // ....................e.................................................................. - mls v13.8H, v15.8H, v7.H[0] // .....................*................................................................. - sqdmulh v15.8H, v10.8H, v7.H[1] // ......................*................................................................ - srshr v3.8H, v3.8H, #11 // .......................*............................................................... - sqdmulh v18.8H, v12.8H, v7.H[1] // ........................*.............................................................. - mls v29.8H, v31.8H, v7.H[0] // .........................e............................................................. - srshr v15.8H, v15.8H, #11 // ..........................*............................................................ - mls v30.8H, v16.8H, v7.H[0] // ...........................e........................................................... - srshr v1.8H, v18.8H, #11 // ............................*.......................................................... - mls v10.8H, v15.8H, v7.H[0] // .............................*......................................................... - mls v11.8H, v3.8H, v7.H[0] // ..............................*........................................................ - mls v12.8H, v1.8H, v7.H[0] // ...............................*....................................................... - sub v6.8H, v14.8H, v30.8H // ................................e...................................................... - ldr q15, [x0, #64] // .................................e..................................................... - st4 {v10.4S, v11.4S, v12.4S, v13.4S}, [x0], #64 // ...................................*................................................... - add v13.8H, v14.8H, v30.8H // ........................................e.............................................. - sqrdmulh v30.8H, v6.8H, v8.H[5] // .........................................e............................................. - mul v6.8H, v6.8H, v8.H[4] // ..........................................e............................................ - sqrdmulh v17.8H, v13.8H, v8.H[3] // ...........................................e........................................... - mul v22.8H, v13.8H, v8.H[2] // ............................................e.......................................... - sub v3.8H, v15.8H, v29.8H // .............................................e......................................... - add v15.8H, v15.8H, v29.8H // ..............................................e........................................ - mls v6.8H, v30.8H, v7.H[0] // ...............................................e....................................... - mls v22.8H, v17.8H, v7.H[0] // ................................................e...................................... - ldr q25, [x4], #(6*16) // .................................................e..................................... - sub v18.8H, v3.8H, v6.8H // ...................................................e................................... - add v30.8H, v3.8H, v6.8H // ....................................................e.................................. - sub v6.8H, v15.8H, v22.8H // .....................................................e................................. - add v13.8H, v15.8H, v22.8H // ......................................................e................................ - trn1 v14.4S, v30.4S, v18.4S // .......................................................e............................... - trn2 v4.4S, v30.4S, v18.4S // ........................................................e.............................. - trn1 v16.4S, v13.4S, v6.4S // .........................................................e............................. - trn2 v10.4S, v13.4S, v6.4S // ..........................................................e............................ - ldr q30, [x4, #-48] // ...........................................................e........................... - trn2 v21.2D, v16.2D, v14.2D // .............................................................e......................... - trn2 v17.2D, v10.2D, v4.2D // ..............................................................e........................ - mul v11.8H, v21.8H, v25.8H // ...............................................................e....................... - mul v25.8H, v17.8H, v25.8H // ................................................................e...................... - sqrdmulh v3.8H, v17.8H, v0.8H // .................................................................e..................... - sqrdmulh v27.8H, v21.8H, v0.8H // ..................................................................e.................... - trn1 v15.2D, v16.2D, v14.2D // ...................................................................e................... - trn1 v13.2D, v10.2D, v4.2D // ....................................................................e.................. - mls v25.8H, v3.8H, v7.H[0] // .....................................................................e................. - mls v11.8H, v27.8H, v7.H[0] // ......................................................................e................ - ldr q2, [x4, #-64] // .......................................................................e............... - sub v29.8H, v13.8H, v25.8H // .........................................................................e............. - add v13.8H, v13.8H, v25.8H // ..........................................................................e............ - ldr q25, [x4, #-32] // ...........................................................................e........... - sqrdmulh v30.8H, v13.8H, v30.8H // .............................................................................e......... - mul v13.8H, v13.8H, v2.8H // ..............................................................................e........ - sub v3.8H, v15.8H, v11.8H // ...............................................................................e....... - ldr q5, [x4, #-16] // ................................................................................e...... - mls v13.8H, v30.8H, v7.H[0] // ..................................................................................e.... - add v15.8H, v15.8H, v11.8H // ...................................................................................e... - sqrdmulh v6.8H, v29.8H, v5.8H // ....................................................................................e.. - mul v25.8H, v29.8H, v25.8H // .....................................................................................e. - sub v11.8H, v15.8H, v13.8H // ......................................................................................e - - // ---------------------------------------------------- cycle (expected) ----------------------------------------------------> + // ---------------------------- cycle (expected) ----------------------------> + // 0 25 50 + // |------------------------|------------------------| + ldr q20, [x4, #48] // *.......................................................................... + mul v24.8H, v11.8H, v9.H[0] // ..*........................................................................ + ldr q16, [x0, #16] // ...*....................................................................... + ldr q17, [x4, #80] // .....*..................................................................... + sub v1.8H, v16.8H, v4.8H // .......*................................................................... + add v23.8H, v16.8H, v4.8H // ........*.................................................................. + mls v24.8H, v12.8H, v7.H[0] // .........*................................................................. + sqrdmulh v4.8H, v1.8H, v9.H[5] // ..........*................................................................ + sqrdmulh v28.8H, v23.8H, v9.H[3] // ...........*............................................................... + mul v22.8H, v23.8H, v9.H[2] // ............*.............................................................. + mul v5.8H, v1.8H, v9.H[4] // .............*............................................................. + ldr q6, [x0, #0] // ..............*............................................................ + mls v22.8H, v28.8H, v7.H[0] // ................*.......................................................... + mls v5.8H, v4.8H, v7.H[0] // .................*......................................................... + ldr q4, [x4], #(6*16) // ..................*........................................................ + add v16.8H, v6.8H, v24.8H // ....................*...................................................... + sub v26.8H, v6.8H, v24.8H // .....................*..................................................... + ldr q10, [x4, #-80] // ......................*.................................................... + sub v19.8H, v16.8H, v22.8H // ........................*.................................................. + add v25.8H, v16.8H, v22.8H // .........................*................................................. + sub v14.8H, v26.8H, v5.8H // ..........................*................................................ + ldr q8, [x0, #112] // ...........................e............................................... + add v2.8H, v26.8H, v5.8H // .............................*............................................. + trn1 v12.4S, v25.4S, v19.4S // ..............................*............................................ + trn2 v26.4S, v25.4S, v19.4S // ...............................*........................................... + trn2 v5.4S, v2.4S, v14.4S // ................................*.......................................... + ldr q9, [x3], #16 // .................................e......................................... + trn2 v16.2D, v26.2D, v5.2D // ...................................*....................................... + trn1 v29.4S, v2.4S, v14.4S // ....................................*...................................... + trn1 v22.2D, v26.2D, v5.2D // .....................................*..................................... + mul v24.8H, v16.8H, v4.8H // ......................................*.................................... + sqrdmulh v5.8H, v16.8H, v10.8H // .......................................*................................... + trn2 v16.2D, v12.2D, v29.2D // ........................................*.................................. + sqrdmulh v31.8H, v8.8H, v9.H[1] // .........................................e................................. + mul v26.8H, v16.8H, v4.8H // ..........................................*................................ + sqrdmulh v4.8H, v16.8H, v10.8H // ...........................................*............................... + trn1 v16.2D, v12.2D, v29.2D // ............................................*.............................. + mls v24.8H, v5.8H, v7.H[0] // .............................................*............................. + ldr q11, [x0, #96] // ..............................................e............................ + mls v26.8H, v4.8H, v7.H[0] // ................................................*.......................... + add v5.8H, v22.8H, v24.8H // .................................................*......................... + sub v14.8H, v22.8H, v24.8H // ..................................................*........................ + sqrdmulh v12.8H, v11.8H, v9.H[1] // ...................................................e....................... + sqrdmulh v25.8H, v5.8H, v20.8H // ....................................................*...................... + mul v10.8H, v5.8H, v18.8H // .....................................................*..................... + add v22.8H, v16.8H, v26.8H // ......................................................*.................... + sqrdmulh v4.8H, v14.8H, v17.8H // .......................................................*................... + mul v5.8H, v14.8H, v0.8H // ........................................................*.................. + mls v10.8H, v25.8H, v7.H[0] // .........................................................*................. + ldr q18, [x4, #32] // ..........................................................e................ + sub v13.8H, v16.8H, v26.8H // ............................................................*.............. + mls v5.8H, v4.8H, v7.H[0] // .............................................................*............. + sub v25.8H, v22.8H, v10.8H // ..............................................................*............ + add v24.8H, v22.8H, v10.8H // ...............................................................*........... + mul v4.8H, v8.8H, v9.H[0] // ................................................................e.......... + sub v27.8H, v13.8H, v5.8H // .................................................................*......... + add v26.8H, v13.8H, v5.8H // ..................................................................*........ + ldr q0, [x4, #64] // ...................................................................e....... + st4 {v24.4S, v25.4S, v26.4S, v27.4S}, [x0], #64 // .....................................................................*..... + mls v4.8H, v31.8H, v7.H[0] // ..........................................................................e + + // ------------------------------------------------- cycle (expected) --------------------------------------------------> // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|---------------------- - // ldr q8, [x0, #(16*0)] // .................................e.....................................................'................................~.. - // ldr q9, [x0, #(16*1)] // ....e..................................................................................'...~............................... - // ldr q10, [x0, #(16*2)] // .......e...............................................................................'......~............................ - // ldr q11, [x0, #(16*3)] // ............e..........................................................................'...........~....................... - // ldr q0, [x3], #16 // ..e....................................................................................'.~................................. - // sqrdmulh v27.8h, v10.8h, v0.h[1] // ...........e...........................................................................'..........~........................ - // mul v24.8h, v10.8h, v0.h[0] // ....................e..................................................................'...................~............... - // mls v24.8h, v27.8h, v7.h[0] // .........................e.............................................................'........................~.......... - // sub v10.8h, v8.8h, v24.8h // .............................................e.........................................'................................... - // add v8.8h, v8.8h, v24.8h // ..............................................e........................................'................................... - // sqrdmulh v27.8h, v11.8h, v0.h[1] // ................e......................................................................'...............~................... - // mul v24.8h, v11.8h, v0.h[0] // .................e.....................................................................'................~.................. - // mls v24.8h, v27.8h, v7.h[0] // ...........................e...........................................................'..........................~........ - // sub v11.8h, v9.8h, v24.8h // ................................e......................................................'...............................~... - // add v9.8h, v9.8h, v24.8h // ........................................e..............................................'................................... - // sqrdmulh v27.8h, v9.8h, v0.h[3] // ...........................................e...........................................'................................... - // mul v24.8h, v9.8h, v0.h[2] // ............................................e..........................................'................................... - // mls v24.8h, v27.8h, v7.h[0] // ................................................e......................................'................................... - // sub v9.8h, v8.8h, v24.8h // .....................................................e.................................'................................... - // add v8.8h, v8.8h, v24.8h // ......................................................e................................'................................... - // sqrdmulh v27.8h, v11.8h, v0.h[5] // .........................................e.............................................'................................... - // mul v24.8h, v11.8h, v0.h[4] // ..........................................e............................................'................................... - // mls v24.8h, v27.8h, v7.h[0] // ...............................................e.......................................'................................... - // sub v11.8h, v10.8h, v24.8h // ...................................................e...................................'................................... - // add v10.8h, v10.8h, v24.8h // ....................................................e..................................'................................... - // trn1 v25.4s, v8.4s, v9.4s // .........................................................e.............................'................................... - // trn2 v26.4s, v8.4s, v9.4s // ..........................................................e............................'................................... - // trn1 v27.4s, v10.4s, v11.4s // .......................................................e...............................'................................... - // trn2 v28.4s, v10.4s, v11.4s // ........................................................e..............................'................................... - // trn2 v10.2d, v25.2d, v27.2d // .............................................................e.........................'................................... - // trn2 v11.2d, v26.2d, v28.2d // ..............................................................e........................'................................... - // trn1 v8.2d, v25.2d, v27.2d // ...................................................................e...................'................................... - // trn1 v9.2d, v26.2d, v28.2d // ....................................................................e..................'................................... - // ldr q0, [x4], #(6*16) // .................................................e.....................................'................................... - // ldr q4, [x4, #(-6*16 + 1*16)] // e......................................................................................~................................... - // ldr q1, [x4, #(-6*16 + 2*16)] // .......................................................................e...............'................................... - // ldr q5, [x4, #(-6*16 + 3*16)] // ...........................................................e...........................'................................... - // ldr q2, [x4, #(-6*16 + 4*16)] // ...........................................................................e...........'................................... - // ldr q6, [x4, #(-6*16 + 5*16)] // ................................................................................e......'................................... - // sqrdmulh v27.8h, v10.8h, v4.8h // ..................................................................e....................'................................... - // mul v24.8h, v10.8h, v0.8h // ...............................................................e.......................'................................... - // mls v24.8h, v27.8h, v7.h[0] // ......................................................................e................'................................... - // sub v10.8h, v8.8h, v24.8h // ...............................................................................e.......'................................... - // add v8.8h, v8.8h, v24.8h // ...................................................................................e...'................................... - // sqrdmulh v27.8h, v11.8h, v4.8h // .................................................................e.....................'................................... - // mul v24.8h, v11.8h, v0.8h // ................................................................e......................'................................... - // mls v24.8h, v27.8h, v7.h[0] // .....................................................................e.................'................................... - // sub v11.8h, v9.8h, v24.8h // .........................................................................e.............'................................... - // add v9.8h, v9.8h, v24.8h // ..........................................................................e............'................................... - // sqrdmulh v27.8h, v9.8h, v5.8h // .............................................................................e.........'................................... - // mul v24.8h, v9.8h, v1.8h // ..............................................................................e........'................................... - // mls v24.8h, v27.8h, v7.h[0] // ..................................................................................e....'................................... - // sub v9.8h, v8.8h, v24.8h // ......................................................................................e'................................... - // add v8.8h, v8.8h, v24.8h // .........~.............................................................................'........*.......................... - // sqrdmulh v27.8h, v11.8h, v6.8h // ....................................................................................e..'................................... - // mul v24.8h, v11.8h, v2.8h // .....................................................................................e.'................................... - // mls v24.8h, v27.8h, v7.h[0] // ......~................................................................................'.....*............................. - // sub v11.8h, v10.8h, v24.8h // ..........~............................................................................'.........*......................... - // add v10.8h, v10.8h, v24.8h // ...............~.......................................................................'..............*.................... - // sqdmulh v25.8h, v8.8h, v7.h[1] // ......................~................................................................'.....................*............. - // srshr v25.8h, v25.8h, #11 // ..........................~............................................................'.........................*......... - // mls v8.8h, v25.8h, v7.h[0] // .............................~.........................................................'............................*...... - // sqdmulh v25.8h, v9.8h, v7.h[1] // ...................~...................................................................'..................*................ - // srshr v25.8h, v25.8h, #11 // .......................~...............................................................'......................*............ - // mls v9.8h, v25.8h, v7.h[0] // ..............................~........................................................'.............................*..... - // sqdmulh v25.8h, v10.8h, v7.h[1] // ........................~..............................................................'.......................*........... - // srshr v25.8h, v25.8h, #11 // ............................~..........................................................'...........................*....... - // mls v10.8h, v25.8h, v7.h[0] // ...............................~.......................................................'..............................*.... - // sqdmulh v25.8h, v11.8h, v7.h[1] // ..............~........................................................................'.............*..................... - // srshr v25.8h, v25.8h, #11 // ..................~....................................................................'.................*................. - // mls v11.8h, v25.8h, v7.h[0] // .....................~.................................................................'....................*.............. - // st4 {v8.4S, v9.4S, v10.4S, v11.4S}, [x0], #64 // ...................................~...................................................'..................................* + // |------------------------|------------------------|------------------------|------------------------|----------------- + // ldr q8, [x0, #(16*0)] // ................................................'.............*....................................................... + // ldr q9, [x0, #(16*1)] // ................................................'..*.................................................................. + // ldr q10, [x0, #(16*2)] // ...................e............................'.............................................~....................... + // ldr q11, [x0, #(16*3)] // e...............................................'..........................~.......................................... + // ldr q0, [x3], #16 // ......e.........................................'................................~.................................... + // sqrdmulh v27.8h, v10.8h, v0.h[1] // ........................e.......................'..................................................~.................. + // mul v24.8h, v10.8h, v0.h[0] // ................................................'.*................................................................... + // mls v24.8h, v27.8h, v7.h[0] // ................................................'........*............................................................ + // sub v10.8h, v8.8h, v24.8h // ................................................'....................*................................................ + // add v8.8h, v8.8h, v24.8h // ................................................'...................*................................................. + // sqrdmulh v27.8h, v11.8h, v0.h[1] // ..............e.................................'........................................~............................ + // mul v24.8h, v11.8h, v0.h[0] // .....................................e..........'...............................................................~..... + // mls v24.8h, v27.8h, v7.h[0] // ...............................................e'..................................................................... + // sub v11.8h, v9.8h, v24.8h // ................................................'......*.............................................................. + // add v9.8h, v9.8h, v24.8h // ................................................'.......*............................................................. + // sqrdmulh v27.8h, v9.8h, v0.h[3] // ................................................'..........*.......................................................... + // mul v24.8h, v9.8h, v0.h[2] // ................................................'...........*......................................................... + // mls v24.8h, v27.8h, v7.h[0] // ................................................'...............*..................................................... + // sub v9.8h, v8.8h, v24.8h // ................................................'.......................*............................................. + // add v8.8h, v8.8h, v24.8h // ................................................'........................*............................................ + // sqrdmulh v27.8h, v11.8h, v0.h[5] // ................................................'.........*........................................................... + // mul v24.8h, v11.8h, v0.h[4] // ................................................'............*........................................................ + // mls v24.8h, v27.8h, v7.h[0] // ................................................'................*.................................................... + // sub v11.8h, v10.8h, v24.8h // ................................................'.........................*........................................... + // add v10.8h, v10.8h, v24.8h // ..~.............................................'............................*........................................ + // trn1 v25.4s, v8.4s, v9.4s // ...~............................................'.............................*....................................... + // trn2 v26.4s, v8.4s, v9.4s // ....~...........................................'..............................*...................................... + // trn1 v27.4s, v10.4s, v11.4s // .........~......................................'...................................*................................. + // trn2 v28.4s, v10.4s, v11.4s // .....~..........................................'...............................*..................................... + // trn2 v10.2d, v25.2d, v27.2d // .............~..................................'.......................................*............................. + // trn2 v11.2d, v26.2d, v28.2d // ........~.......................................'..................................*.................................. + // trn1 v8.2d, v25.2d, v27.2d // .................~..............................'...........................................*......................... + // trn1 v9.2d, v26.2d, v28.2d // ..........~.....................................'....................................*................................ + // ldr q0, [x4], #(6*16) // ................................................'.................*................................................... + // ldr q4, [x4, #(-6*16 + 1*16)] // ................................................'.....................*............................................... + // ldr q1, [x4, #(-6*16 + 2*16)] // ...............................e................'.........................................................~........... + // ldr q5, [x4, #(-6*16 + 3*16)] // ................................................*..................................................................... + // ldr q2, [x4, #(-6*16 + 4*16)] // ........................................e.......'..................................................................~.. + // ldr q6, [x4, #(-6*16 + 5*16)] // ................................................'....*................................................................ + // sqrdmulh v27.8h, v10.8h, v4.8h // ................~...............................'..........................................*.......................... + // mul v24.8h, v10.8h, v0.8h // ...............~................................'.........................................*........................... + // mls v24.8h, v27.8h, v7.h[0] // .....................~..........................'...............................................*..................... + // sub v10.8h, v8.8h, v24.8h // .................................~..............'...........................................................*......... + // add v8.8h, v8.8h, v24.8h // ...........................~....................'.....................................................*............... + // sqrdmulh v27.8h, v11.8h, v4.8h // ............~...................................'......................................*.............................. + // mul v24.8h, v11.8h, v0.8h // ...........~....................................'.....................................*............................... + // mls v24.8h, v27.8h, v7.h[0] // ..................~.............................'............................................*........................ + // sub v11.8h, v9.8h, v24.8h // .......................~........................'.................................................*................... + // add v9.8h, v9.8h, v24.8h // ......................~.........................'................................................*.................... + // sqrdmulh v27.8h, v9.8h, v5.8h // .........................~......................'...................................................*................. + // mul v24.8h, v9.8h, v1.8h // ..........................~.....................'....................................................*................ + // mls v24.8h, v27.8h, v7.h[0] // ..............................~.................'........................................................*............ + // sub v9.8h, v8.8h, v24.8h // ...................................~............'.............................................................*....... + // add v8.8h, v8.8h, v24.8h // ....................................~...........'..............................................................*...... + // sqrdmulh v27.8h, v11.8h, v6.8h // ............................~...................'......................................................*.............. + // mul v24.8h, v11.8h, v2.8h // .............................~..................'.......................................................*............. + // mls v24.8h, v27.8h, v7.h[0] // ..................................~.............'............................................................*........ + // sub v11.8h, v10.8h, v24.8h // ......................................~.........'................................................................*.... + // add v10.8h, v10.8h, v24.8h // .......................................~........'.................................................................*... + // st4 {v8.4S, v9.4S, v10.4S, v11.4S}, [x0], #64 // ..........................................~.....'....................................................................* sub count, count, #1 cbnz count, layer4567_start - // Instructions: 17 - // Expected cycles: 21 - // Expected IPC: 0.81 + // Instructions: 51 + // Expected cycles: 59 + // Expected IPC: 0.86 // - // Cycle bound: 21.0 - // IPC bound: 0.81 + // Cycle bound: 59.0 + // IPC bound: 0.86 // - // Wall time: 0.04s - // User time: 0.04s + // Wall time: 5.53s + // User time: 5.53s // - // ----- cycle (expected) ------> - // 0 25 - // |------------------------|---- - mls v25.8H, v6.8H, v7.H[0] // *............................. - sqdmulh v4.8H, v11.8H, v7.H[1] // .*............................ - add v10.8H, v15.8H, v13.8H // ...*.......................... - add v12.8H, v3.8H, v25.8H // ....*......................... - srshr v8.8H, v4.8H, #11 // .....*........................ - sub v13.8H, v3.8H, v25.8H // ......*....................... - sqdmulh v21.8H, v12.8H, v7.H[1] // .......*...................... - sqdmulh v5.8H, v10.8H, v7.H[1] // ........*..................... - sqdmulh v9.8H, v13.8H, v7.H[1] // .........*.................... - mls v11.8H, v8.8H, v7.H[0] // ..........*................... - srshr v30.8H, v21.8H, #11 // ...........*.................. - srshr v17.8H, v5.8H, #11 // ............*................. - srshr v4.8H, v9.8H, #11 // .............*................ - mls v12.8H, v30.8H, v7.H[0] // ..............*............... - mls v10.8H, v17.8H, v7.H[0] // ...............*.............. - mls v13.8H, v4.8H, v7.H[0] // ................*............. - st4 {v10.4S, v11.4S, v12.4S, v13.4S}, [x0], #64 // ....................*......... - - // ------ cycle (expected) ------> - // 0 25 - // |------------------------|----- - // mls v25.8H, v6.8H, v7.H[0] // *.............................. - // add v10.8H, v15.8H, v13.8H // ...*........................... - // sub v13.8H, v3.8H, v25.8H // ......*........................ - // sqdmulh v23.8H, v13.8H, v7.H[1] // .........*..................... - // add v12.8H, v3.8H, v25.8H // ....*.......................... - // srshr v15.8H, v23.8H, #11 // .............*................. - // sqdmulh v3.8H, v11.8H, v7.H[1] // .*............................. - // mls v13.8H, v15.8H, v7.H[0] // ................*.............. - // sqdmulh v15.8H, v10.8H, v7.H[1] // ........*...................... - // srshr v3.8H, v3.8H, #11 // .....*......................... - // sqdmulh v18.8H, v12.8H, v7.H[1] // .......*....................... - // srshr v15.8H, v15.8H, #11 // ............*.................. - // srshr v1.8H, v18.8H, #11 // ...........*................... - // mls v10.8H, v15.8H, v7.H[0] // ...............*............... - // mls v11.8H, v3.8H, v7.H[0] // ..........*.................... - // mls v12.8H, v1.8H, v7.H[0] // ..............*................ - // st4 {v10.4S, v11.4S, v12.4S, v13.4S}, [x0], #64 // ....................*.......... + // -------------------- cycle (expected) --------------------> + // 0 25 50 + // |------------------------|------------------------|-------- + ldr q23, [x0, #16] // *.......................................................... + ldr q19, [x0, #0] // ..*........................................................ + sub v30.8H, v23.8H, v4.8H // ....*...................................................... + mul v28.8H, v11.8H, v9.H[0] // .....*..................................................... + add v23.8H, v23.8H, v4.8H // ......*.................................................... + mul v29.8H, v30.8H, v9.H[4] // .......*................................................... + sqrdmulh v30.8H, v30.8H, v9.H[5] // ........*.................................................. + mls v28.8H, v12.8H, v7.H[0] // .........*................................................. + mul v6.8H, v23.8H, v9.H[2] // ..........*................................................ + sqrdmulh v2.8H, v23.8H, v9.H[3] // ...........*............................................... + mls v29.8H, v30.8H, v7.H[0] // ............*.............................................. + sub v30.8H, v19.8H, v28.8H // .............*............................................. + add v28.8H, v19.8H, v28.8H // ..............*............................................ + mls v6.8H, v2.8H, v7.H[0] // ...............*........................................... + sub v19.8H, v30.8H, v29.8H // ................*.......................................... + add v30.8H, v30.8H, v29.8H // .................*......................................... + ldr q20, [x4], #(6*16) // ..................*........................................ + add v23.8H, v28.8H, v6.8H // ....................*...................................... + sub v29.8H, v28.8H, v6.8H // .....................*..................................... + trn1 v1.4S, v30.4S, v19.4S // ......................*.................................... + trn2 v6.4S, v30.4S, v19.4S // .......................*................................... + trn2 v28.4S, v23.4S, v29.4S // ........................*.................................. + ldr q2, [x4, #-80] // .........................*................................. + trn2 v30.2D, v28.2D, v6.2D // ...........................*............................... + trn1 v3.4S, v23.4S, v29.4S // ............................*.............................. + sqrdmulh v19.8H, v30.8H, v2.8H // .............................*............................. + mul v29.8H, v30.8H, v20.8H // ..............................*............................ + ldr q9, [x4, #-48] // ...............................*........................... + trn2 v30.2D, v3.2D, v1.2D // .................................*......................... + mls v29.8H, v19.8H, v7.H[0] // ..................................*........................ + sqrdmulh v23.8H, v30.8H, v2.8H // ...................................*....................... + trn1 v2.2D, v28.2D, v6.2D // ....................................*...................... + mul v28.8H, v30.8H, v20.8H // .....................................*..................... + sub v30.8H, v2.8H, v29.8H // ......................................*.................... + ldr q20, [x4, #-16] // .......................................*................... + mul v19.8H, v30.8H, v0.8H // .........................................*................. + add v29.8H, v2.8H, v29.8H // ..........................................*................ + sqrdmulh v30.8H, v30.8H, v20.8H // ...........................................*............... + mls v28.8H, v23.8H, v7.H[0] // ............................................*.............. + mul v23.8H, v29.8H, v18.8H // .............................................*............. + sqrdmulh v29.8H, v29.8H, v9.8H // ..............................................*............ + trn1 v6.2D, v3.2D, v1.2D // ...............................................*........... + mls v19.8H, v30.8H, v7.H[0] // ................................................*.......... + sub v30.8H, v6.8H, v28.8H // .................................................*......... + mls v23.8H, v29.8H, v7.H[0] // ..................................................*........ + add v29.8H, v6.8H, v28.8H // ...................................................*....... + add v20.8H, v30.8H, v19.8H // ....................................................*...... + sub v21.8H, v30.8H, v19.8H // .....................................................*..... + add v18.8H, v29.8H, v23.8H // ......................................................*.... + sub v19.8H, v29.8H, v23.8H // .......................................................*... + st4 {v18.4S, v19.4S, v20.4S, v21.4S}, [x0], #64 // ..........................................................* + + // -------------------- cycle (expected) --------------------> + // 0 25 50 + // |------------------------|------------------------|-------- + // ldr q20, [x4, #48] // ...............................*........................... + // mul v24.8H, v11.8H, v9.H[0] // .....*..................................................... + // ldr q16, [x0, #16] // *.......................................................... + // ldr q17, [x4, #80] // .......................................*................... + // sub v1.8H, v16.8H, v4.8H // ....*...................................................... + // add v23.8H, v16.8H, v4.8H // ......*.................................................... + // mls v24.8H, v12.8H, v7.H[0] // .........*................................................. + // sqrdmulh v4.8H, v1.8H, v9.H[5] // ........*.................................................. + // sqrdmulh v28.8H, v23.8H, v9.H[3] // ...........*............................................... + // mul v22.8H, v23.8H, v9.H[2] // ..........*................................................ + // mul v5.8H, v1.8H, v9.H[4] // .......*................................................... + // ldr q6, [x0, #0] // ..*........................................................ + // mls v22.8H, v28.8H, v7.H[0] // ...............*........................................... + // mls v5.8H, v4.8H, v7.H[0] // ............*.............................................. + // ldr q4, [x4], #(6*16) // ..................*........................................ + // add v16.8H, v6.8H, v24.8H // ..............*............................................ + // sub v26.8H, v6.8H, v24.8H // .............*............................................. + // ldr q10, [x4, #-80] // .........................*................................. + // sub v19.8H, v16.8H, v22.8H // .....................*..................................... + // add v25.8H, v16.8H, v22.8H // ....................*...................................... + // sub v14.8H, v26.8H, v5.8H // ................*.......................................... + // add v2.8H, v26.8H, v5.8H // .................*......................................... + // trn1 v12.4S, v25.4S, v19.4S // ............................*.............................. + // trn2 v26.4S, v25.4S, v19.4S // ........................*.................................. + // trn2 v5.4S, v2.4S, v14.4S // .......................*................................... + // trn2 v16.2D, v26.2D, v5.2D // ...........................*............................... + // trn1 v29.4S, v2.4S, v14.4S // ......................*.................................... + // trn1 v22.2D, v26.2D, v5.2D // ....................................*...................... + // mul v24.8H, v16.8H, v4.8H // ..............................*............................ + // sqrdmulh v5.8H, v16.8H, v10.8H // .............................*............................. + // trn2 v16.2D, v12.2D, v29.2D // .................................*......................... + // mul v26.8H, v16.8H, v4.8H // .....................................*..................... + // sqrdmulh v4.8H, v16.8H, v10.8H // ...................................*....................... + // trn1 v16.2D, v12.2D, v29.2D // ...............................................*........... + // mls v24.8H, v5.8H, v7.H[0] // ..................................*........................ + // mls v26.8H, v4.8H, v7.H[0] // ............................................*.............. + // add v5.8H, v22.8H, v24.8H // ..........................................*................ + // sub v14.8H, v22.8H, v24.8H // ......................................*.................... + // sqrdmulh v25.8H, v5.8H, v20.8H // ..............................................*............ + // mul v10.8H, v5.8H, v18.8H // .............................................*............. + // add v22.8H, v16.8H, v26.8H // ...................................................*....... + // sqrdmulh v4.8H, v14.8H, v17.8H // ...........................................*............... + // mul v5.8H, v14.8H, v0.8H // .........................................*................. + // mls v10.8H, v25.8H, v7.H[0] // ..................................................*........ + // sub v13.8H, v16.8H, v26.8H // .................................................*......... + // mls v5.8H, v4.8H, v7.H[0] // ................................................*.......... + // sub v25.8H, v22.8H, v10.8H // .......................................................*... + // add v24.8H, v22.8H, v10.8H // ......................................................*.... + // sub v27.8H, v13.8H, v5.8H // .....................................................*..... + // add v26.8H, v13.8H, v5.8H // ....................................................*...... + // st4 {v24.4S, v25.4S, v26.4S, v27.4S}, [x0], #64 // ..........................................................* pop_stack diff --git a/mlkem/native/aarch64/polyvec_clean.S b/mlkem/native/aarch64/polyvec_clean.S index ad0b7aed1..992c648c5 100644 --- a/mlkem/native/aarch64/polyvec_clean.S +++ b/mlkem/native/aarch64/polyvec_clean.S @@ -14,12 +14,6 @@ // Needed to provide ASM_LOAD directive #include "common.i" -.macro barrett_reduce a - sqdmulh t0.8h, \a\().8h, consts.h[1] - srshr t0.8h, t0.8h, #11 - mls \a\().8h, t0.8h, consts.h[0] -.endm - // Input: // - Vectors al, ah of 32-bit entries // Output: @@ -33,6 +27,10 @@ .endm // Computes products (a0*b0 + a0*b0t, a0*b1 + a1*b0) in 32-bit. +// +// Bounds: +// - Assume |a| < q, |b|, |bt| < NTT_BOUND +// - Result: < 2*q*NTT_BOUND .macro pmull d, a, b smull \d\()0l.4s, \a\()0.4h, \b\()0.4h smull2 \d\()0h.4s, \a\()0.8h, \b\()0.8h @@ -120,6 +118,11 @@ res0h .req v10 res1h .req v11 + tmp0 .req v12 + tmp1 .req v13 + q_tmp0 .req q12 + q_tmp1 .req q13 + out0 .req v26 out1 .req v27 @@ -167,10 +170,6 @@ k2_loop_start: montgomery_reduce_long out0, res0 montgomery_reduce_long out1, res1 - // CHECK: Is this needed? - barrett_reduce out0 - barrett_reduce out1 - st2 {out0.8h, out1.8h}, [out], #32 subs count, count, #1 @@ -214,9 +213,6 @@ k3_loop_start: montgomery_reduce_long out0, res0 montgomery_reduce_long out1, res1 - // CHECK: Is this needed? - barrett_reduce out0 - barrett_reduce out1 st2 {out0.8h, out1.8h}, [out], #32 @@ -252,6 +248,14 @@ _polyvec_basemul_acc_montgomery_cached_asm_k4_clean: add b3_ptr, b0_ptr, #(3 * 512) add b3_cache_ptr, b0_cache_ptr, #(3 * 512/2) + // Bounds: + // + // Each pmull is bound by 2*q*2^15, so the final value + // before Montgomery reduction is bound by q*2^18 ~ 2^29.7 + // + // The Montgomery reduction is thus bound by + // q * (2^18/2^16 + 1/2) = 4.5 q < 14981 + mov count, #(KYBER_N / 16) k4_loop_start: @@ -266,9 +270,6 @@ k4_loop_start: montgomery_reduce_long out0, res0 montgomery_reduce_long out1, res1 - // CHECK: Is this needed? - barrett_reduce out0 - barrett_reduce out1 st2 {out0.8h, out1.8h}, [out], #32 diff --git a/mlkem/native/aarch64/polyvec_opt.S b/mlkem/native/aarch64/polyvec_opt.S index ffdc306d5..2f0437d99 100644 --- a/mlkem/native/aarch64/polyvec_opt.S +++ b/mlkem/native/aarch64/polyvec_opt.S @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 -// + // AArch64 re-implementation of the asymmetric base multiplication from: -// + // Neon NTT: Faster Dilithium, Kyber, and Saber on Cortex-A72 and Apple M1 -// https://eprint.iacr.org/2021/986 -// https://github.com/neon-ntt/neon-ntt +// https: // eprint.iacr.org/2021/986 +// https: // github.com/neon-ntt/neon-ntt #include "config.h" #if defined(MLKEM_USE_NATIVE_AARCH64) @@ -14,12 +14,6 @@ // Needed to provide ASM_LOAD directive #include "common.i" -.macro barrett_reduce a - sqdmulh t0.8h, \a\().8h, consts.h[1] - srshr t0.8h, t0.8h, #11 - mls \a\().8h, t0.8h, consts.h[0] -.endm - // Input: // - Vectors al, ah of 32-bit entries // Output: @@ -120,6 +114,11 @@ res0h .req v10 res1h .req v11 + tmp0 .req v12 + tmp1 .req v13 + q_tmp0 .req q12 + q_tmp1 .req q13 + out0 .req v26 out1 .req v27 @@ -157,219 +156,195 @@ _polyvec_basemul_acc_montgomery_cached_asm_k2_opt: add b1_cache_ptr, b0_cache_ptr, #(1 * 512/2) mov count, #(KYBER_N / 16) - // Instructions: 15 - // Expected cycles: 30 - // Expected IPC: 0.50 + // Instructions: 6 + // Expected cycles: 11 + // Expected IPC: 0.55 - // Cycle bound: 30.0 - // IPC bound: 0.50 + // Cycle bound: 11.0 + // IPC bound: 0.55 - // Wall time: 0.02s - // User time: 0.02s + // Wall time: 0.01s + // User time: 0.01s // ----- cycle (expected) ------> // 0 25 // |------------------------|---- - ld1 {v29.8H}, [x3], #16 // *............................. - ld2 {v15.8H, v16.8H}, [x1], #32 // ..*........................... - ld2 {v17.8H, v18.8H}, [x2], #32 // ......*....................... - ld2 {v7.8H, v8.8H}, [x4], #32 // ..........*................... - smull v1.4S, v15.4H, v17.4H // ..............*............... - smull2 v30.4S, v15.8H, v17.8H // ...............*.............. - ld2 {v11.8H, v12.8H}, [x5], #32 // ................*............. - smlal2 v30.4S, v16.8H, v29.8H // ....................*......... - smlal v1.4S, v16.4H, v29.4H // .....................*........ - ld1 {v6.8H}, [x6], #16 // ......................*....... - smlal2 v30.4S, v7.8H, v11.8H // ........................*..... - smlal v1.4S, v7.4H, v11.4H // .........................*.... - smull2 v14.4S, v15.8H, v18.8H // ..........................*... - smlal2 v30.4S, v8.8H, v6.8H // ............................*. - smlal v1.4S, v8.4H, v6.4H // .............................* + ld2 {v6.8H, v7.8H}, [x1], #32 // *............................. + ld2 {v4.8H, v5.8H}, [x2], #32 // ..*........................... + ld1 {v12.8H}, [x3], #16 // ....*......................... + ld2 {v15.8H, v16.8H}, [x4], #32 // ......*....................... + ld2 {v29.8H, v30.8H}, [x5], #32 // ........*..................... + ld1 {v31.8H}, [x6], #16 // ..........*................... // ------ cycle (expected) ------> // 0 25 // |------------------------|----- - // ld1 {v9.8H}, [x3], #16 // *.............................. - // ld1 {v20.8H}, [x6], #16 // ......................*........ - // ld2 {v15.8H, v16.8H}, [x1], #32 // ..*............................ - // ld2 {v17.8H, v18.8H}, [x2], #32 // ......*........................ - // smull v1.4S, v15.4H, v17.4H // ..............*................ - // smull2 v30.4S, v15.8H, v17.8H // ...............*............... - // ld2 {v7.8H, v8.8H}, [x4], #32 // ..........*.................... - // ld2 {v11.8H, v12.8H}, [x5], #32 // ................*.............. - // smlal v1.4S, v16.4H, v9.4H // .....................*......... - // smlal2 v30.4S, v16.8H, v9.8H // ....................*.......... - // smlal v1.4S, v7.4H, v11.4H // .........................*..... - // smlal2 v30.4S, v7.8H, v11.8H // ........................*...... - // smull2 v14.4S, v15.8H, v18.8H // ..........................*.... - // smlal v1.4S, v8.4H, v20.4H // .............................*. - // smlal2 v30.4S, v8.8H, v20.8H // ............................*.. + // ld2 {v6.8H, v7.8H}, [x1], #32 // *.............................. + // ld2 {v4.8H, v5.8H}, [x2], #32 // ..*............................ + // ld1 {v12.8H}, [x3], #16 // ....*.......................... + // ld2 {v15.8H, v16.8H}, [x4], #32 // ......*........................ + // ld2 {v29.8H, v30.8H}, [x5], #32 // ........*...................... + // ld1 {v31.8H}, [x6], #16 // ..........*.................... sub count, count, #1 k2_loop_start: - // Instructions: 39 - // Expected cycles: 54 - // Expected IPC: 0.72 + // Instructions: 33 + // Expected cycles: 40 + // Expected IPC: 0.82 - // Cycle bound: 53.0 - // IPC bound: 0.74 + // Cycle bound: 40.0 + // IPC bound: 0.82 - // Wall time: 31.04s - // User time: 31.04s + // Wall time: 1.67s + // User time: 1.67s - // ----------------- cycle (expected) ------------------> - // 0 25 50 - // |------------------------|------------------------|--- - ld1 {v9.8H}, [x3], #16 // e..................................................... - ld1 {v20.8H}, [x6], #16 // ..e................................................... - smull v25.4S, v15.4H, v18.4H // ....*................................................. - uzp1 v10.8H, v1.8H, v30.8H // .....*................................................ - smlal2 v14.4S, v16.8H, v17.8H // ......*............................................... - mul v19.8H, v10.8H, v2.H[2] // .......*.............................................. - smlal v25.4S, v16.4H, v17.4H // ........*............................................. - ld2 {v15.8H, v16.8H}, [x1], #32 // .........e............................................ - smlal v1.4S, v19.4H, v0.4H // .............*........................................ - smlal2 v30.4S, v19.8H, v0.8H // ..............*....................................... - smlal v25.4S, v7.4H, v12.4H // ...............*...................................... - smlal2 v14.4S, v7.8H, v12.8H // ................*..................................... - ld2 {v17.8H, v18.8H}, [x2], #32 // .................e.................................... - smlal2 v14.4S, v8.8H, v11.8H // .....................*................................ - smlal v25.4S, v8.4H, v11.4H // ......................*............................... - uzp2 v4.8H, v1.8H, v30.8H // .......................*.............................. - smull v1.4S, v15.4H, v17.4H // ........................e............................. - smull2 v30.4S, v15.8H, v17.8H // .........................e............................ - uzp1 v27.8H, v25.8H, v14.8H // ..........................*........................... - sqdmulh v22.8H, v4.8H, v2.H[1] // ...........................*.......................... - mul v28.8H, v27.8H, v2.H[2] // ............................*......................... - ld2 {v7.8H, v8.8H}, [x4], #32 // .............................e........................ - smlal v25.4S, v28.4H, v0.4H // .................................*.................... - smlal2 v14.4S, v28.8H, v0.8H // ..................................*................... - ld2 {v11.8H, v12.8H}, [x5], #32 // ...................................e.................. - uzp2 v5.8H, v25.8H, v14.8H // .......................................*.............. - srshr v21.8H, v22.8H, #11 // ........................................*............. - sqdmulh v22.8H, v5.8H, v2.H[1] // .........................................*............ - smlal v1.4S, v16.4H, v9.4H // ..........................................e........... - smlal2 v30.4S, v16.8H, v9.8H // ...........................................e.......... - mls v4.8H, v21.8H, v2.H[0] // ............................................*......... - srshr v10.8H, v22.8H, #11 // .............................................*........ - smlal v1.4S, v7.4H, v11.4H // ..............................................e....... - smlal2 v30.4S, v7.8H, v11.8H // ...............................................e...... - mls v5.8H, v10.8H, v2.H[0] // ................................................*..... - smull2 v14.4S, v15.8H, v18.8H // .................................................e.... - smlal v1.4S, v8.4H, v20.4H // ..................................................e... - smlal2 v30.4S, v8.8H, v20.8H // ...................................................e.. - st2 {v4.8H, v5.8H}, [x0], #32 // ....................................................*. - - // -------------------------------------------- cycle (expected) --------------------------------------------> - // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|------ - // ld2 {v3.8h, v4.8h}, [x1], #32 // .........e............................................'........~........................................... - // ld2 {v5.8h, v6.8h}, [x2], #32 // .................e....................................'................~................................... - // ld1 {v7.8h}, [x3], #16 // e.....................................................~.................................................... - // smull v8.4s, v3.4h, v5.4h // ........................e.............................'.......................~............................ - // smull2 v10.4s, v3.8h, v5.8h // .........................e............................'........................~........................... - // smlal v8.4s, v4.4h, v7.4h // ..........................................e...........'.........................................~.......... - // smlal2 v10.4s, v4.8h, v7.8h // ...........................................e..........'..........................................~......... - // smull v9.4s, v3.4h, v6.4h // ....~.................................................'...*................................................ - // smull2 v11.4s, v3.8h, v6.8h // .................................................e....'................................................~... - // smlal v9.4s, v4.4h, v5.4h // ........~.............................................'.......*............................................ - // smlal2 v11.4s, v4.8h, v5.8h // ......~...............................................'.....*.............................................. - // ld2 {v3.8h, v4.8h}, [x4], #32 // .............................e........................'............................~....................... - // ld2 {v5.8h, v6.8h}, [x5], #32 // ...................................e..................'..................................~................. - // ld1 {v7.8h}, [x6], #16 // ..e...................................................'.~.................................................. - // smlal v8.4s, v3.4h, v5.4h // ..............................................e.......'.............................................~...... - // smlal2 v10.4s, v3.8h, v5.8h // ...............................................e......'..............................................~..... - // smlal v8.4s, v4.4h, v7.4h // ..................................................e...'.................................................~.. - // smlal2 v10.4s, v4.8h, v7.8h // ...................................................e..'..................................................~. - // smlal v9.4s, v3.4h, v6.4h // ...............~......................................'..............*..................................... - // smlal2 v11.4s, v3.8h, v6.8h // ................~.....................................'...............*.................................... - // smlal v9.4s, v4.4h, v5.4h // ......................~...............................'.....................*.............................. - // smlal2 v11.4s, v4.8h, v5.8h // .....................~................................'....................*............................... - // uzp1 v28.8h, v8.8h, v10.8h // .....~................................................'....*............................................... - // mul v28.8h, v28.8h, v2.h[2] // .......~..............................................'......*............................................. - // smlal v8.4s, v28.4h, v0.4h // .............~........................................'............*....................................... - // smlal2 v10.4s, v28.8h, v0.8h // ..............~.......................................'.............*...................................... - // uzp2 v26.8h, v8.8h, v10.8h // .......................~..............................'......................*............................. - // uzp1 v28.8h, v9.8h, v11.8h // ..........................~...........................'.........................*.......................... - // mul v28.8h, v28.8h, v2.h[2] // ............................~.........................'...........................*........................ - // smlal v9.4s, v28.4h, v0.4h // .................................~....................'................................*................... - // smlal2 v11.4s, v28.8h, v0.8h // ..................................~...................'.................................*.................. - // uzp2 v27.8h, v9.8h, v11.8h // .......................................~..............'......................................*............. - // sqdmulh v28.8h, v26.8h, v2.h[1] // ...........................~..........................'..........................*......................... - // srshr v28.8h, v28.8h, #11 // ........................................~.............'.......................................*............ - // mls v26.8h, v28.8h, v2.h[0] // ............................................~.........'...........................................*........ - // sqdmulh v28.8h, v27.8h, v2.h[1] // .........................................~............'........................................*........... - // srshr v28.8h, v28.8h, #11 // .............................................~........'............................................*....... - // mls v27.8h, v28.8h, v2.h[0] // ................................................~.....'...............................................*.... - // st2 {v26.8h, v27.8h}, [x0], #32 // ....................................................~.'...................................................* + // ---------- cycle (expected) -----------> + // 0 25 + // |------------------------|-------------- + smull v13.4S, v6.4H, v4.4H // *....................................... + smull2 v10.4S, v6.8H, v4.8H // .*...................................... + smull v21.4S, v6.4H, v5.4H // ..*..................................... + smull2 v3.4S, v6.8H, v5.8H // ...*.................................... + smlal v13.4S, v7.4H, v12.4H // ....*................................... + smlal2 v10.4S, v7.8H, v12.8H // .....*.................................. + smlal v21.4S, v7.4H, v4.4H // ......*................................. + smlal2 v3.4S, v7.8H, v4.8H // .......*................................ + smlal v13.4S, v15.4H, v29.4H // ........*............................... + smlal2 v10.4S, v15.8H, v29.8H // .........*.............................. + smlal v21.4S, v15.4H, v30.4H // ..........*............................. + smlal2 v3.4S, v15.8H, v30.8H // ...........*............................ + smlal v13.4S, v16.4H, v31.4H // ............*........................... + smlal2 v10.4S, v16.8H, v31.8H // .............*.......................... + smlal v21.4S, v16.4H, v29.4H // ..............*......................... + smlal2 v3.4S, v16.8H, v29.8H // ...............*........................ + ld2 {v6.8H, v7.8H}, [x1], #32 // ................e....................... + uzp1 v12.8H, v13.8H, v10.8H // ..................*..................... + uzp1 v30.8H, v21.8H, v3.8H // ...................*.................... + mul v12.8H, v12.8H, v2.H[2] // ....................*................... + mul v30.8H, v30.8H, v2.H[2] // .....................*.................. + ld2 {v4.8H, v5.8H}, [x2], #32 // ......................e................. + smlal v13.4S, v12.4H, v0.4H // ........................*............... + smlal2 v10.4S, v12.8H, v0.8H // .........................*.............. + smlal v21.4S, v30.4H, v0.4H // ..........................*............. + smlal2 v3.4S, v30.8H, v0.8H // ...........................*............ + ld1 {v12.8H}, [x3], #16 // ............................e........... + uzp2 v13.8H, v13.8H, v10.8H // ..............................*......... + uzp2 v14.8H, v21.8H, v3.8H // ...............................*........ + ld2 {v15.8H, v16.8H}, [x4], #32 // ................................e....... + st2 {v13.8H, v14.8H}, [x0], #32 // ..................................*..... + ld2 {v29.8H, v30.8H}, [x5], #32 // ....................................e... + ld1 {v31.8H}, [x6], #16 // ......................................e. + + // -------------------- cycle (expected) --------------------> + // 0 25 50 + // |------------------------|------------------------|-------- + // ld2 {v3.8h, v4.8h}, [x1], #32 // e.......................'...............~.................. + // ld2 {v5.8h, v6.8h}, [x2], #32 // ......e.................'.....................~............ + // ld1 {v7.8h}, [x3], #16 // ............e...........'...........................~...... + // smull v8.4s, v3.4h, v5.4h // ........................*.................................. + // smull2 v10.4s, v3.8h, v5.8h // ........................'*................................. + // smlal v8.4s, v4.4h, v7.4h // ........................'...*.............................. + // smlal2 v10.4s, v4.8h, v7.8h // ........................'....*............................. + // smull v9.4s, v3.4h, v6.4h // ........................'.*................................ + // smull2 v11.4s, v3.8h, v6.8h // ........................'..*............................... + // smlal v9.4s, v4.4h, v5.4h // ........................'.....*............................ + // smlal2 v11.4s, v4.8h, v5.8h // ........................'......*........................... + // ld2 {v3.8h, v4.8h}, [x4], #32 // ................e.......'...............................~.. + // ld2 {v5.8h, v6.8h}, [x5], #32 // ....................e...'.................................. + // ld1 {v7.8h}, [x6], #16 // ......................e.'.................................. + // smlal v8.4s, v3.4h, v5.4h // ........................'.......*.......................... + // smlal2 v10.4s, v3.8h, v5.8h // ........................'........*......................... + // smlal v8.4s, v4.4h, v7.4h // ........................'...........*...................... + // smlal2 v10.4s, v4.8h, v7.8h // ........................'............*..................... + // smlal v9.4s, v3.4h, v6.4h // ........................'.........*........................ + // smlal2 v11.4s, v3.8h, v6.8h // ........................'..........*....................... + // smlal v9.4s, v4.4h, v5.4h // ........................'.............*.................... + // smlal2 v11.4s, v4.8h, v5.8h // ........................'..............*................... + // uzp1 v28.8h, v8.8h, v10.8h // ..~.....................'.................*................ + // mul v28.8h, v28.8h, v2.h[2] // ....~...................'...................*.............. + // smlal v8.4s, v28.4h, v0.4h // ........~...............'.......................*.......... + // smlal2 v10.4s, v28.8h, v0.8h // .........~..............'........................*......... + // uzp2 v26.8h, v8.8h, v10.8h // ..............~.........'.............................*.... + // uzp1 v28.8h, v9.8h, v11.8h // ...~....................'..................*............... + // mul v28.8h, v28.8h, v2.h[2] // .....~..................'....................*............. + // smlal v9.4s, v28.4h, v0.4h // ..........~.............'.........................*........ + // smlal2 v11.4s, v28.8h, v0.8h // ...........~............'..........................*....... + // uzp2 v27.8h, v9.8h, v11.8h // ...............~........'..............................*... + // st2 {v26.8h, v27.8h}, [x0], #32 // ..................~.....'.................................* sub count, count, #1 cbnz count, k2_loop_start - // Instructions: 24 - // Expected cycles: 41 - // Expected IPC: 0.59 + // Instructions: 27 + // Expected cycles: 34 + // Expected IPC: 0.79 - // Cycle bound: 41.0 - // IPC bound: 0.59 + // Cycle bound: 34.0 + // IPC bound: 0.79 - // Wall time: 0.14s - // User time: 0.14s + // Wall time: 0.25s + // User time: 0.25s - // ----------- cycle (expected) -----------> - // 0 25 - // |------------------------|--------------- - smull v28.4S, v15.4H, v18.4H // *........................................ - smlal2 v14.4S, v16.8H, v17.8H // .*....................................... - uzp1 v6.8H, v1.8H, v30.8H // ..*...................................... - smlal v28.4S, v16.4H, v17.4H // ....*.................................... - mul v4.8H, v6.8H, v2.H[2] // .....*................................... - smlal2 v14.4S, v7.8H, v12.8H // ......*.................................. - smlal v28.4S, v7.4H, v12.4H // ........*................................ - smlal v1.4S, v4.4H, v0.4H // .........*............................... - smlal2 v30.4S, v4.8H, v0.8H // ..........*.............................. - smlal2 v14.4S, v8.8H, v11.8H // ...........*............................. - smlal v28.4S, v8.4H, v11.4H // ............*............................ - uzp2 v22.8H, v1.8H, v30.8H // ..............*.......................... - uzp1 v4.8H, v28.8H, v14.8H // ................*........................ - sqdmulh v8.8H, v22.8H, v2.H[1] // .................*....................... - mul v19.8H, v4.8H, v2.H[2] // ..................*...................... - srshr v20.8H, v8.8H, #11 // .....................*................... - smlal v28.4S, v19.4H, v0.4H // ......................*.................. - smlal2 v14.4S, v19.8H, v0.8H // .......................*................. - mls v22.8H, v20.8H, v2.H[0] // ........................*................ - uzp2 v23.8H, v28.8H, v14.8H // ...........................*............. - sqdmulh v19.8H, v23.8H, v2.H[1] // .............................*........... - srshr v30.8H, v19.8H, #11 // .................................*....... - mls v23.8H, v30.8H, v2.H[0] // ....................................*.... - st2 {v22.8H, v23.8H}, [x0], #32 // ........................................* - - // ----------- cycle (expected) -----------> + // ------- cycle (expected) --------> // 0 25 - // |------------------------|--------------- - // smull v25.4S, v15.4H, v18.4H // *........................................ - // uzp1 v10.8H, v1.8H, v30.8H // ..*...................................... - // smlal2 v14.4S, v16.8H, v17.8H // .*....................................... - // mul v19.8H, v10.8H, v2.H[2] // .....*................................... - // smlal v25.4S, v16.4H, v17.4H // ....*.................................... - // smlal v1.4S, v19.4H, v0.4H // .........*............................... - // smlal2 v30.4S, v19.8H, v0.8H // ..........*.............................. - // smlal v25.4S, v7.4H, v12.4H // ........*................................ - // smlal2 v14.4S, v7.8H, v12.8H // ......*.................................. - // smlal2 v14.4S, v8.8H, v11.8H // ...........*............................. - // smlal v25.4S, v8.4H, v11.4H // ............*............................ - // uzp2 v4.8H, v1.8H, v30.8H // ..............*.......................... - // uzp1 v27.8H, v25.8H, v14.8H // ................*........................ - // sqdmulh v22.8H, v4.8H, v2.H[1] // .................*....................... - // mul v28.8H, v27.8H, v2.H[2] // ..................*...................... - // smlal v25.4S, v28.4H, v0.4H // ......................*.................. - // smlal2 v14.4S, v28.8H, v0.8H // .......................*................. - // uzp2 v5.8H, v25.8H, v14.8H // ...........................*............. - // srshr v21.8H, v22.8H, #11 // .....................*................... - // sqdmulh v22.8H, v5.8H, v2.H[1] // .............................*........... - // mls v4.8H, v21.8H, v2.H[0] // ........................*................ - // srshr v10.8H, v22.8H, #11 // .................................*....... - // mls v5.8H, v10.8H, v2.H[0] // ....................................*.... - // st2 {v4.8H, v5.8H}, [x0], #32 // ........................................* + // |------------------------|-------- + smull v13.4S, v6.4H, v5.4H // *................................. + smull2 v10.4S, v6.8H, v5.8H // .*................................ + smull v21.4S, v6.4H, v4.4H // ..*............................... + smull2 v3.4S, v6.8H, v4.8H // ...*.............................. + smlal v13.4S, v7.4H, v4.4H // ....*............................. + smlal2 v10.4S, v7.8H, v4.8H // .....*............................ + smlal v21.4S, v7.4H, v12.4H // ......*........................... + smlal2 v3.4S, v7.8H, v12.8H // .......*.......................... + smlal v13.4S, v15.4H, v30.4H // ........*......................... + smlal2 v10.4S, v15.8H, v30.8H // .........*........................ + smlal v21.4S, v15.4H, v29.4H // ..........*....................... + smlal2 v3.4S, v15.8H, v29.8H // ...........*...................... + smlal v13.4S, v16.4H, v29.4H // ............*..................... + smlal2 v10.4S, v16.8H, v29.8H // .............*.................... + smlal v21.4S, v16.4H, v31.4H // ..............*................... + smlal2 v3.4S, v16.8H, v31.8H // ...............*.................. + uzp1 v12.8H, v13.8H, v10.8H // .................*................ + uzp1 v6.8H, v21.8H, v3.8H // ...................*.............. + mul v12.8H, v12.8H, v2.H[2] // ....................*............. + mul v6.8H, v6.8H, v2.H[2] // .....................*............ + smlal v13.4S, v12.4H, v0.4H // ........................*......... + smlal v21.4S, v6.4H, v0.4H // .........................*........ + smlal2 v3.4S, v6.8H, v0.8H // ..........................*....... + smlal2 v10.4S, v12.8H, v0.8H // ...........................*...... + uzp2 v21.8H, v21.8H, v3.8H // ..............................*... + uzp2 v22.8H, v13.8H, v10.8H // ...............................*.. + st2 {v21.8H, v22.8H}, [x0], #32 // .................................* + + // ------- cycle (expected) --------> + // 0 25 + // |------------------------|-------- + // smull v13.4S, v6.4H, v4.4H // ..*............................... + // smull2 v10.4S, v6.8H, v4.8H // ...*.............................. + // smull v21.4S, v6.4H, v5.4H // *................................. + // smull2 v3.4S, v6.8H, v5.8H // .*................................ + // smlal v13.4S, v7.4H, v12.4H // ......*........................... + // smlal2 v10.4S, v7.8H, v12.8H // .......*.......................... + // smlal v21.4S, v7.4H, v4.4H // ....*............................. + // smlal2 v3.4S, v7.8H, v4.8H // .....*............................ + // smlal v13.4S, v15.4H, v29.4H // ..........*....................... + // smlal2 v10.4S, v15.8H, v29.8H // ...........*...................... + // smlal v21.4S, v15.4H, v30.4H // ........*......................... + // smlal2 v3.4S, v15.8H, v30.8H // .........*........................ + // smlal v13.4S, v16.4H, v31.4H // ..............*................... + // smlal2 v10.4S, v16.8H, v31.8H // ...............*.................. + // smlal v21.4S, v16.4H, v29.4H // ............*..................... + // smlal2 v3.4S, v16.8H, v29.8H // .............*.................... + // uzp1 v12.8H, v13.8H, v10.8H // ...................*.............. + // uzp1 v30.8H, v21.8H, v3.8H // .................*................ + // mul v12.8H, v12.8H, v2.H[2] // .....................*............ + // mul v30.8H, v30.8H, v2.H[2] // ....................*............. + // smlal v13.4S, v12.4H, v0.4H // .........................*........ + // smlal2 v10.4S, v12.8H, v0.8H // ..........................*....... + // smlal v21.4S, v30.4H, v0.4H // ........................*......... + // smlal2 v3.4S, v30.8H, v0.8H // ...........................*...... + // uzp2 v13.8H, v13.8H, v10.8H // ..............................*... + // uzp2 v14.8H, v21.8H, v3.8H // ...............................*.. + // st2 {v13.8H, v14.8H}, [x0], #32 // .................................* pop_stack @@ -399,363 +374,327 @@ _polyvec_basemul_acc_montgomery_cached_asm_k3_opt: add b2_cache_ptr, b0_cache_ptr, #(2 * 512/2) mov count, #(KYBER_N / 16) - // Instructions: 66 - // Expected cycles: 101 - // Expected IPC: 0.65 - - // Cycle bound: 101.0 - // IPC bound: 0.65 - - // Wall time: 1.16s - // User time: 1.16s - - // ----------------------------------------- cycle (expected) -----------------------------------------> - // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------| - ld1 {v3.8H}, [x3], #16 // *.................................................................................................... - ld2 {v10.8H, v11.8H}, [x1], #32 // ..*.................................................................................................. - ld2 {v24.8H, v25.8H}, [x2], #32 // ......*.............................................................................................. - ld1 {v8.8H}, [x6], #16 // ..........*.......................................................................................... - smull2 v28.4S, v10.8H, v24.8H // ............*........................................................................................ - smull v21.4S, v10.4H, v24.4H // .............*....................................................................................... - smull2 v19.4S, v10.8H, v25.8H // ..............*...................................................................................... - smull v10.4S, v10.4H, v25.4H // ...............*..................................................................................... - smlal2 v28.4S, v11.8H, v3.8H // ................*.................................................................................... - smlal v21.4S, v11.4H, v3.4H // .................*................................................................................... - smlal2 v19.4S, v11.8H, v24.8H // ..................*.................................................................................. - smlal v10.4S, v11.4H, v24.4H // ...................*................................................................................. - ld1 {v3.8H}, [x9], #16 // ....................*................................................................................ - ld2 {v25.8H, v26.8H}, [x4], #32 // ......................*.............................................................................. - ld2 {v22.8H, v23.8H}, [x5], #32 // ..........................*.......................................................................... - ld1 {v12.8H}, [x3], #16 // ..............................*...................................................................... - smlal v21.4S, v25.4H, v22.4H // ................................*.................................................................... - smlal2 v28.4S, v25.8H, v22.8H // .................................*................................................................... - smlal2 v19.4S, v25.8H, v23.8H // ..................................*.................................................................. - smlal v10.4S, v25.4H, v23.4H // ...................................*................................................................. - smlal v21.4S, v26.4H, v8.4H // ....................................*................................................................ - smlal2 v28.4S, v26.8H, v8.8H // .....................................*............................................................... - smlal2 v19.4S, v26.8H, v22.8H // ......................................*.............................................................. - smlal v10.4S, v26.4H, v22.4H // .......................................*............................................................. - ld1 {v8.8H}, [x6], #16 // ........................................*............................................................ - ld2 {v23.8H, v24.8H}, [x7], #32 // ..........................................*.......................................................... - ld2 {v17.8H, v18.8H}, [x8], #32 // ..............................................*...................................................... - ld2 {v25.8H, v26.8H}, [x4], #32 // ..................................................*.................................................. - smlal v21.4S, v23.4H, v17.4H // ......................................................*.............................................. - smlal2 v28.4S, v23.8H, v17.8H // .......................................................*............................................. - smlal2 v19.4S, v23.8H, v18.8H // ........................................................*............................................ - smlal v10.4S, v23.4H, v18.4H // .........................................................*........................................... - smlal v21.4S, v24.4H, v3.4H // ..........................................................*.......................................... - smlal2 v28.4S, v24.8H, v3.8H // ...........................................................*......................................... - smlal2 v19.4S, v24.8H, v17.8H // ............................................................*........................................ - ld2 {v13.8H, v14.8H}, [x1], #32 // .............................................................*....................................... - uzp1 v3.8H, v21.8H, v28.8H // .................................................................*................................... - smlal v10.4S, v24.4H, v17.4H // ..................................................................*.................................. - ld2 {v22.8H, v23.8H}, [x2], #32 // ...................................................................*................................. - uzp1 v18.8H, v10.8H, v19.8H // .......................................................................*............................. - mul v3.8H, v3.8H, v2.H[2] // ........................................................................*............................ - mul v18.8H, v18.8H, v2.H[2] // .........................................................................*........................... - smull v4.4S, v13.4H, v22.4H // ..........................................................................*.......................... - smull v17.4S, v13.4H, v23.4H // ...........................................................................*......................... - smlal v21.4S, v3.4H, v0.4H // ............................................................................*........................ - smlal2 v19.4S, v18.8H, v0.8H // .............................................................................*....................... - smlal v10.4S, v18.4H, v0.4H // ..............................................................................*...................... - smlal2 v28.4S, v3.8H, v0.8H // ...............................................................................*..................... - smlal v4.4S, v14.4H, v12.4H // ................................................................................*.................... - smlal v17.4S, v14.4H, v22.4H // .................................................................................*................... - uzp2 v6.8H, v10.8H, v19.8H // ..................................................................................*.................. - smull2 v10.4S, v13.8H, v22.8H // ...................................................................................*................. - uzp2 v5.8H, v21.8H, v28.8H // ....................................................................................*................ - smull2 v19.4S, v13.8H, v23.8H // .....................................................................................*............... - sqdmulh v3.8H, v5.8H, v2.H[1] // ......................................................................................*.............. - smlal2 v10.4S, v14.8H, v12.8H // .......................................................................................*............. - ld2 {v15.8H, v16.8H}, [x5], #32 // ........................................................................................*............ - smlal2 v19.4S, v14.8H, v22.8H // ............................................................................................*........ - srshr v3.8H, v3.8H, #11 // .............................................................................................*....... - smlal v4.4S, v25.4H, v15.4H // ..............................................................................................*...... - smlal2 v10.4S, v25.8H, v15.8H // ...............................................................................................*..... - sqdmulh v7.8H, v6.8H, v2.H[1] // ................................................................................................*.... - mls v5.8H, v3.8H, v2.H[0] // .................................................................................................*... - smlal v4.4S, v26.4H, v8.4H // ..................................................................................................*.. - smlal2 v10.4S, v26.8H, v8.8H // ...................................................................................................*. - ld2 {v12.8H, v13.8H}, [x7], #32 // ....................................................................................................* - - // ----------------------------------------- cycle (expected) -----------------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|------------------------- - // ld2 {v25.8H, v26.8H}, [x4], #32 // ......................*.............................................................................. - // ld2 {v28.8H, v29.8H}, [x1], #32 // ..*.................................................................................................. - // ld2 {v22.8H, v23.8H}, [x2], #32 // ......*.............................................................................................. - // smull2 v10.4S, v28.8H, v22.8H // ............*........................................................................................ - // smull2 v19.4S, v28.8H, v23.8H // ..............*...................................................................................... - // smull v4.4S, v28.4H, v22.4H // .............*....................................................................................... - // ld1 {v1.8H}, [x3], #16 // *.................................................................................................... - // smlal2 v19.4S, v29.8H, v22.8H // ..................*.................................................................................. - // smull v17.4S, v28.4H, v23.4H // ...............*..................................................................................... - // smlal v4.4S, v29.4H, v1.4H // .................*................................................................................... - // ld2 {v15.8H, v16.8H}, [x5], #32 // ..........................*.......................................................................... - // smlal2 v10.4S, v29.8H, v1.8H // ................*.................................................................................... - // smlal v17.4S, v29.4H, v22.4H // ...................*................................................................................. - // smlal v4.4S, v25.4H, v15.4H // ................................*.................................................................... - // smlal2 v10.4S, v25.8H, v15.8H // .................................*................................................................... - // ld1 {v29.8H}, [x6], #16 // ..........*.......................................................................................... - // smlal2 v10.4S, v26.8H, v29.8H // .....................................*............................................................... - // ld2 {v12.8H, v13.8H}, [x7], #32 // ..........................................*.......................................................... - // smlal v4.4S, v26.4H, v29.4H // ....................................*................................................................ - // smlal2 v19.4S, v25.8H, v16.8H // ..................................*.................................................................. - // smlal v17.4S, v25.4H, v16.4H // ...................................*................................................................. - // ld2 {v20.8H, v21.8H}, [x8], #32 // ..............................................*...................................................... - // smlal2 v19.4S, v26.8H, v15.8H // ......................................*.............................................................. - // smlal v17.4S, v26.4H, v15.4H // .......................................*............................................................. - // smlal v4.4S, v12.4H, v20.4H // ......................................................*.............................................. - // smlal2 v10.4S, v12.8H, v20.8H // .......................................................*............................................. - // smlal2 v19.4S, v12.8H, v21.8H // ........................................................*............................................ - // smlal v17.4S, v12.4H, v21.4H // .........................................................*........................................... - // ld1 {v29.8H}, [x9], #16 // ....................*................................................................................ - // smlal2 v19.4S, v13.8H, v20.8H // ............................................................*........................................ - // smlal v17.4S, v13.4H, v20.4H // ..................................................................*.................................. - // smlal v4.4S, v13.4H, v29.4H // ..........................................................*.......................................... - // smlal2 v10.4S, v13.8H, v29.8H // ...........................................................*......................................... - // uzp1 v6.8H, v17.8H, v19.8H // .......................................................................*............................. - // uzp1 v14.8H, v4.8H, v10.8H // .................................................................*................................... - // mul v7.8H, v6.8H, v2.H[2] // .........................................................................*........................... - // mul v1.8H, v14.8H, v2.H[2] // ........................................................................*............................ - // ld2 {v25.8H, v26.8H}, [x4], #32 // ..................................................*.................................................. - // smlal v4.4S, v1.4H, v0.4H // ............................................................................*........................ - // smlal2 v19.4S, v7.8H, v0.8H // .............................................................................*....................... - // smlal v17.4S, v7.4H, v0.4H // ..............................................................................*...................... - // smlal2 v10.4S, v1.8H, v0.8H // ...............................................................................*..................... - // ld2 {v28.8H, v29.8H}, [x1], #32 // .............................................................*....................................... - // ld2 {v22.8H, v23.8H}, [x2], #32 // ...................................................................*................................. - // uzp2 v6.8H, v17.8H, v19.8H // ..................................................................................*.................. - // uzp2 v5.8H, v4.8H, v10.8H // ....................................................................................*................ - // smull2 v10.4S, v28.8H, v22.8H // ...................................................................................*................. - // smull2 v19.4S, v28.8H, v23.8H // .....................................................................................*............... - // smull v4.4S, v28.4H, v22.4H // ..........................................................................*.......................... - // ld1 {v1.8H}, [x3], #16 // ..............................*...................................................................... - // smlal2 v19.4S, v29.8H, v22.8H // ............................................................................................*........ - // smull v17.4S, v28.4H, v23.4H // ...........................................................................*......................... - // smlal v4.4S, v29.4H, v1.4H // ................................................................................*.................... - // ld2 {v15.8H, v16.8H}, [x5], #32 // ........................................................................................*............ - // smlal2 v10.4S, v29.8H, v1.8H // .......................................................................................*............. - // smlal v17.4S, v29.4H, v22.4H // .................................................................................*................... - // smlal v4.4S, v25.4H, v15.4H // ..............................................................................................*...... - // sqdmulh v27.8H, v5.8H, v2.H[1] // ......................................................................................*.............. - // smlal2 v10.4S, v25.8H, v15.8H // ...............................................................................................*..... - // ld1 {v29.8H}, [x6], #16 // ........................................*............................................................ - // srshr v3.8H, v27.8H, #11 // .............................................................................................*....... - // sqdmulh v7.8H, v6.8H, v2.H[1] // ................................................................................................*.... - // smlal2 v10.4S, v26.8H, v29.8H // ...................................................................................................*. - // mls v5.8H, v3.8H, v2.H[0] // .................................................................................................*... - // ld2 {v12.8H, v13.8H}, [x7], #32 // ....................................................................................................* - // smlal v4.4S, v26.4H, v29.4H // ..................................................................................................*.. + // Instructions: 52 + // Expected cycles: 66 + // Expected IPC: 0.79 + + // Cycle bound: 66.0 + // IPC bound: 0.79 + + // Wall time: 8.09s + // User time: 8.09s + + // ----------------------- cycle (expected) ------------------------> + // 0 25 50 + // |------------------------|------------------------|--------------- + ld2 {v7.8H, v8.8H}, [x2], #32 // *................................................................. + ld2 {v28.8H, v29.8H}, [x1], #32 // ..*............................................................... + ld1 {v10.8H}, [x3], #16 // ....*............................................................. + smull2 v15.4S, v28.8H, v8.8H // ......*........................................................... + smull v9.4S, v28.4H, v8.4H // .......*.......................................................... + ld1 {v31.8H}, [x3], #16 // ........*......................................................... + smlal2 v15.4S, v29.8H, v7.8H // ..........*....................................................... + ld2 {v19.8H, v20.8H}, [x5], #32 // ...........*...................................................... + smlal v9.4S, v29.4H, v7.4H // .............*.................................................... + ld2 {v16.8H, v17.8H}, [x4], #32 // ..............*................................................... + ld2 {v3.8H, v4.8H}, [x7], #32 // ................*................................................. + smlal v9.4S, v16.4H, v20.4H // ..................*............................................... + smlal2 v15.4S, v16.8H, v20.8H // ...................*.............................................. + smull v1.4S, v28.4H, v7.4H // ....................*............................................. + smull2 v22.4S, v28.8H, v7.8H // .....................*............................................ + smlal v9.4S, v17.4H, v19.4H // ......................*........................................... + smlal2 v15.4S, v17.8H, v19.8H // .......................*.......................................... + ld2 {v6.8H, v7.8H}, [x8], #32 // ........................*......................................... + smlal v1.4S, v29.4H, v10.4H // ..........................*....................................... + smlal2 v22.4S, v29.8H, v10.8H // ...........................*...................................... + smlal2 v15.4S, v3.8H, v7.8H // ............................*..................................... + smlal v9.4S, v3.4H, v7.4H // .............................*.................................... + smlal v1.4S, v16.4H, v19.4H // ..............................*................................... + smlal2 v22.4S, v16.8H, v19.8H // ...............................*.................................. + ld1 {v5.8H}, [x6], #16 // ................................*................................. + smlal v9.4S, v4.4H, v6.4H // ..................................*............................... + smlal2 v15.4S, v4.8H, v6.8H // ...................................*.............................. + smlal v1.4S, v17.4H, v5.4H // ....................................*............................. + smlal2 v22.4S, v17.8H, v5.8H // .....................................*............................ + ld1 {v30.8H}, [x9], #16 // ......................................*........................... + smlal v1.4S, v3.4H, v6.4H // ........................................*......................... + smlal2 v22.4S, v3.8H, v6.8H // .........................................*........................ + ld2 {v11.8H, v12.8H}, [x1], #32 // ..........................................*....................... + smlal v1.4S, v4.4H, v30.4H // ............................................*..................... + smlal2 v22.4S, v4.8H, v30.8H // .............................................*.................... + uzp1 v21.8H, v9.8H, v15.8H // ..............................................*................... + ld1 {v14.8H}, [x6], #16 // ...............................................*.................. + uzp1 v13.8H, v1.8H, v22.8H // .................................................*................ + mul v10.8H, v21.8H, v2.H[2] // ..................................................*............... + mul v21.8H, v13.8H, v2.H[2] // ...................................................*.............. + ld2 {v23.8H, v24.8H}, [x2], #32 // ....................................................*............. + smlal2 v15.4S, v10.8H, v0.8H // ......................................................*........... + smlal2 v22.4S, v21.8H, v0.8H // .......................................................*.......... + smlal v1.4S, v21.4H, v0.4H // ........................................................*......... + smull2 v13.4S, v11.8H, v23.8H // .........................................................*........ + ld2 {v25.8H, v26.8H}, [x5], #32 // ..........................................................*....... + smlal v9.4S, v10.4H, v0.4H // ............................................................*..... + smlal2 v13.4S, v12.8H, v31.8H // .............................................................*.... + smull2 v27.4S, v11.8H, v24.8H // ..............................................................*... + uzp2 v16.8H, v1.8H, v22.8H // ...............................................................*.. + uzp2 v17.8H, v9.8H, v15.8H // ................................................................*. + ld2 {v6.8H, v7.8H}, [x4], #32 // .................................................................* + + // ----------------------- cycle (expected) ------------------------> + // 0 25 50 + // |------------------------|------------------------|--------------- + // ld2 {v23.8H, v24.8H}, [x2], #32 // *................................................................. + // ld2 {v11.8H, v12.8H}, [x1], #32 // ..*............................................................... + // ld2 {v6.8H, v7.8H}, [x4], #32 // ..............*................................................... + // ld1 {v31.8H}, [x3], #16 // ....*............................................................. + // ld2 {v25.8H, v26.8H}, [x5], #32 // ...........*...................................................... + // smull2 v13.4S, v11.8H, v23.8H // .....................*............................................ + // ld1 {v14.8H}, [x6], #16 // ................................*................................. + // smlal2 v13.4S, v12.8H, v31.8H // ...........................*...................................... + // smull2 v27.4S, v11.8H, v24.8H // ......*........................................................... + // smlal2 v13.4S, v6.8H, v25.8H // ...............................*.................................. + // smull v20.4S, v11.4H, v24.4H // .......*.......................................................... + // smull v17.4S, v11.4H, v23.4H // ....................*............................................. + // smlal2 v27.4S, v12.8H, v23.8H // ..........*....................................................... + // smlal2 v13.4S, v7.8H, v14.8H // .....................................*............................ + // smlal v20.4S, v12.4H, v23.4H // .............*.................................................... + // smlal v17.4S, v12.4H, v31.4H // ..........................*....................................... + // smlal2 v27.4S, v6.8H, v26.8H // ...................*.............................................. + // ld1 {v5.8H}, [x9], #16 // ......................................*........................... + // smlal v17.4S, v6.4H, v25.4H // ..............................*................................... + // smlal v20.4S, v6.4H, v26.4H // ..................*............................................... + // ld2 {v23.8H, v24.8H}, [x2], #32 // ....................................................*............. + // ld2 {v15.8H, v16.8H}, [x8], #32 // ........................*......................................... + // smlal v17.4S, v7.4H, v14.4H // ....................................*............................. + // ld2 {v8.8H, v9.8H}, [x7], #32 // ................*................................................. + // smlal v20.4S, v7.4H, v25.4H // ......................*........................................... + // smlal2 v27.4S, v7.8H, v25.8H // .......................*.......................................... + // smlal2 v13.4S, v8.8H, v15.8H // .........................................*........................ + // smlal v17.4S, v8.4H, v15.4H // ........................................*......................... + // smlal v20.4S, v8.4H, v16.4H // .............................*.................................... + // smlal2 v27.4S, v8.8H, v16.8H // ............................*..................................... + // smlal2 v13.4S, v9.8H, v5.8H // .............................................*.................... + // smlal v17.4S, v9.4H, v5.4H // ............................................*..................... + // smlal v20.4S, v9.4H, v15.4H // ..................................*............................... + // smlal2 v27.4S, v9.8H, v15.8H // ...................................*.............................. + // ld2 {v11.8H, v12.8H}, [x1], #32 // ..........................................*....................... + // uzp1 v31.8H, v17.8H, v13.8H // .................................................*................ + // uzp1 v8.8H, v20.8H, v27.8H // ..............................................*................... + // ld2 {v6.8H, v7.8H}, [x4], #32 // .................................................................* + // mul v18.8H, v31.8H, v2.H[2] // ...................................................*.............. + // mul v14.8H, v8.8H, v2.H[2] // ..................................................*............... + // ld1 {v31.8H}, [x3], #16 // ........*......................................................... + // smlal v17.4S, v18.4H, v0.4H // ........................................................*......... + // smlal2 v27.4S, v14.8H, v0.8H // ......................................................*........... + // smlal2 v13.4S, v18.8H, v0.8H // .......................................................*.......... + // smlal v20.4S, v14.4H, v0.4H // ............................................................*..... + // ld2 {v25.8H, v26.8H}, [x5], #32 // ..........................................................*....... + // uzp2 v16.8H, v17.8H, v13.8H // ...............................................................*.. + // smull2 v13.4S, v11.8H, v23.8H // .........................................................*........ + // uzp2 v17.8H, v20.8H, v27.8H // ................................................................*. + // ld1 {v14.8H}, [x6], #16 // ...............................................*.................. + // smlal2 v13.4S, v12.8H, v31.8H // .............................................................*.... + // smull2 v27.4S, v11.8H, v24.8H // ..............................................................*... sub count, count, #2 k3_loop_start: - // Instructions: 50 - // Expected cycles: 72 - // Expected IPC: 0.69 + // Instructions: 44 + // Expected cycles: 54 + // Expected IPC: 0.81 - // Cycle bound: 71.0 - // IPC bound: 0.70 + // Cycle bound: 54.0 + // IPC bound: 0.81 - // Wall time: 28.72s - // User time: 28.72s + // Wall time: 4.51s + // User time: 4.51s - // -------------------------- cycle (expected) ---------------------------> + // ----------------- cycle (expected) ------------------> // 0 25 50 - // |------------------------|------------------------|--------------------- - srshr v28.8H, v7.8H, #11 // l....................................................................... - smlal2 v19.4S, v25.8H, v16.8H // .*...................................................................... - smlal v17.4S, v25.4H, v16.4H // ..*..................................................................... - mls v6.8H, v28.8H, v2.H[0] // ...l.................................................................... - ld2 {v20.8H, v21.8H}, [x8], #32 // ....*................................................................... - smlal2 v19.4S, v26.8H, v15.8H // ........*............................................................... - smlal v17.4S, v26.4H, v15.4H // .........*.............................................................. - smlal v4.4S, v12.4H, v20.4H // ..........*............................................................. - smlal2 v10.4S, v12.8H, v20.8H // ...........*............................................................ - smlal2 v19.4S, v12.8H, v21.8H // ............*........................................................... - smlal v17.4S, v12.4H, v21.4H // .............*.......................................................... - ld1 {v29.8H}, [x9], #16 // ..............*......................................................... - smlal2 v19.4S, v13.8H, v20.8H // ................*....................................................... - smlal v17.4S, v13.4H, v20.4H // .................*...................................................... - smlal v4.4S, v13.4H, v29.4H // ..................*..................................................... - smlal2 v10.4S, v13.8H, v29.8H // ...................*.................................................... - st2 {v5.8H, v6.8H}, [x0], #32 // ....................l................................................... - uzp1 v6.8H, v17.8H, v19.8H // ......................*................................................. - uzp1 v14.8H, v4.8H, v10.8H // .......................*................................................ - mul v7.8H, v6.8H, v2.H[2] // ........................*............................................... - mul v1.8H, v14.8H, v2.H[2] // .........................*.............................................. - ld2 {v25.8H, v26.8H}, [x4], #32 // ..........................e............................................. - smlal v4.4S, v1.4H, v0.4H // ..............................*......................................... - smlal2 v19.4S, v7.8H, v0.8H // ...............................*........................................ - smlal v17.4S, v7.4H, v0.4H // ................................*....................................... - smlal2 v10.4S, v1.8H, v0.8H // .................................*...................................... - ld2 {v28.8H, v29.8H}, [x1], #32 // ..................................e..................................... - ld2 {v22.8H, v23.8H}, [x2], #32 // ......................................e................................. - uzp2 v6.8H, v17.8H, v19.8H // ..........................................*............................. - uzp2 v5.8H, v4.8H, v10.8H // ...........................................*............................ - smull2 v10.4S, v28.8H, v22.8H // ............................................e........................... - smull2 v19.4S, v28.8H, v23.8H // .............................................e.......................... - smull v4.4S, v28.4H, v22.4H // ..............................................e......................... - ld1 {v1.8H}, [x3], #16 // ...............................................e........................ - smlal2 v19.4S, v29.8H, v22.8H // .................................................e...................... - smull v17.4S, v28.4H, v23.4H // ..................................................e..................... - smlal v4.4S, v29.4H, v1.4H // ...................................................e.................... - ld2 {v15.8H, v16.8H}, [x5], #32 // ....................................................e................... - smlal2 v10.4S, v29.8H, v1.8H // ........................................................e............... - smlal v17.4S, v29.4H, v22.4H // .........................................................e.............. - smlal v4.4S, v25.4H, v15.4H // ..........................................................e............. - sqdmulh v27.8H, v5.8H, v2.H[1] // ...........................................................*............ - smlal2 v10.4S, v25.8H, v15.8H // ............................................................e........... - ld1 {v29.8H}, [x6], #16 // .............................................................e.......... - srshr v3.8H, v27.8H, #11 // ...............................................................*........ - sqdmulh v7.8H, v6.8H, v2.H[1] // ................................................................*....... - smlal2 v10.4S, v26.8H, v29.8H // .................................................................e...... - mls v5.8H, v3.8H, v2.H[0] // ..................................................................*..... - ld2 {v12.8H, v13.8H}, [x7], #32 // ...................................................................e.... - smlal v4.4S, v26.4H, v29.4H // .......................................................................e - - // ------------------------------------------------------------ cycle (expected) ------------------------------------------------------------> - // 0 25 50 75 100 125 - // |------------------------|------------------------|------------------------|------------------------|------------------------|------------- - // ld2 {v3.8h, v4.8h}, [x1], #32 // ........e.....................................'.................................~.....................................'.................... - // ld2 {v5.8h, v6.8h}, [x2], #32 // ............e.................................'.....................................~.................................'.................... - // ld1 {v7.8h}, [x3], #16 // .....................e........................'..............................................~........................'.................... - // smull v8.4s, v3.4h, v5.4h // ....................e.........................'.............................................~.........................'.................... - // smull2 v10.4s, v3.8h, v5.8h // ..................e...........................'...........................................~...........................'.................... - // smlal v8.4s, v4.4h, v7.4h // .........................e....................'..................................................~....................'.................... - // smlal2 v10.4s, v4.8h, v7.8h // ..............................e...............'.......................................................~...............'.................... - // smull v9.4s, v3.4h, v6.4h // ........................e.....................'.................................................~.....................'.................... - // smull2 v11.4s, v3.8h, v6.8h // ...................e..........................'............................................~..........................'.................... - // smlal v9.4s, v4.4h, v5.4h // ...............................e..............'........................................................~..............'.................... - // smlal2 v11.4s, v4.8h, v5.8h // .......................e......................'................................................~......................'.................... - // ld2 {v3.8h, v4.8h}, [x4], #32 // e.............................................'.........................~.............................................'.................... - // ld2 {v5.8h, v6.8h}, [x5], #32 // ..........................e...................'...................................................~...................'.................... - // ld1 {v7.8h}, [x6], #16 // ...................................e..........'............................................................~..........'.................... - // smlal v8.4s, v3.4h, v5.4h // ................................e.............'.........................................................~.............'.................... - // smlal2 v10.4s, v3.8h, v5.8h // ..................................e...........'...........................................................~...........'.................... - // smlal v8.4s, v4.4h, v7.4h // .............................................e'......................................................................~'.................... - // smlal2 v10.4s, v4.8h, v7.8h // .......................................e......'................................................................~......'.................... - // smlal v9.4s, v3.4h, v6.4h // ..............................................'.*.....................................................................'.~.................. - // smlal2 v11.4s, v3.8h, v6.8h // ..............................................'*......................................................................'~................... - // smlal v9.4s, v4.4h, v5.4h // ..............................................'........*..............................................................'........~........... - // smlal2 v11.4s, v4.8h, v5.8h // ..............................................'.......*...............................................................'.......~............ - // ld2 {v3.8h, v4.8h}, [x7], #32 // .........................................e....'..................................................................~....'.................... - // ld2 {v5.8h, v6.8h}, [x8], #32 // ..............................................'...*...................................................................'...~................ - // ld1 {v7.8h}, [x9], #16 // ..............................................'.............*.........................................................'.............~...... - // smlal v8.4s, v3.4h, v5.4h // ..............................................'.........*.............................................................'.........~.......... - // smlal2 v10.4s, v3.8h, v5.8h // ..............................................'..........*............................................................'..........~......... - // smlal v8.4s, v4.4h, v7.4h // ..............................................'.................*.....................................................'.................~.. - // smlal2 v10.4s, v4.8h, v7.8h // ..............................................'..................*....................................................'..................~. - // smlal v9.4s, v3.4h, v6.4h // ..............................................'............*..........................................................'............~....... - // smlal2 v11.4s, v3.8h, v6.8h // ..............................................'...........*...........................................................'...........~........ - // smlal v9.4s, v4.4h, v5.4h // ..............................................'................*......................................................'................~... - // smlal2 v11.4s, v4.8h, v5.8h // ..............................................'...............*.......................................................'...............~.... - // uzp1 v28.8h, v8.8h, v10.8h // ..............................................'......................*................................................'.................... - // mul v28.8h, v28.8h, v2.h[2] // ..............................................'........................*..............................................'.................... - // smlal v8.4s, v28.4h, v0.4h // ....~.........................................'.............................*.........................................'.................... - // smlal2 v10.4s, v28.8h, v0.8h // .......~......................................'................................*......................................'.................... - // uzp2 v26.8h, v8.8h, v10.8h // .................~............................'..........................................*............................'.................... - // uzp1 v28.8h, v9.8h, v11.8h // ..............................................'.....................*.................................................'.................... - // mul v28.8h, v28.8h, v2.h[2] // ..............................................'.......................*...............................................'.................... - // smlal v9.4s, v28.4h, v0.4h // ......~.......................................'...............................*.......................................'.................... - // smlal2 v11.4s, v28.8h, v0.8h // .....~........................................'..............................*........................................'.................... - // uzp2 v27.8h, v9.8h, v11.8h // ................~.............................'.........................................*.............................'.................... - // sqdmulh v28.8h, v26.8h, v2.h[1] // .................................~............'..........................................................*............'.................... - // srshr v28.8h, v28.8h, #11 // .....................................~........'..............................................................*........'.................... - // mls v26.8h, v28.8h, v2.h[0] // ........................................~.....'.................................................................*.....'.................... - // sqdmulh v28.8h, v27.8h, v2.h[1] // ......................................~.......'...............................................................*.......'.................... - // srshr v28.8h, v28.8h, #11 // ..............................................~.......................................................................l.................... - // mls v27.8h, v28.8h, v2.h[0] // ..............................................'..~....................................................................'..l................. - // st2 {v26.8h, v27.8h}, [x0], #32 // ..............................................'...................~...................................................'...................l + // |------------------------|------------------------|--- + st2 {v16.8H, v17.8H}, [x0], #32 // l..................................................... + smlal2 v13.4S, v6.8H, v25.8H // ..*................................................... + smull v20.4S, v11.4H, v24.4H // ...*.................................................. + smull v17.4S, v11.4H, v23.4H // ....*................................................. + smlal2 v27.4S, v12.8H, v23.8H // .....*................................................ + smlal2 v13.4S, v7.8H, v14.8H // ......*............................................... + smlal v20.4S, v12.4H, v23.4H // .......*.............................................. + smlal v17.4S, v12.4H, v31.4H // ........*............................................. + smlal2 v27.4S, v6.8H, v26.8H // .........*............................................ + ld1 {v5.8H}, [x9], #16 // ..........*........................................... + smlal v17.4S, v6.4H, v25.4H // ............*......................................... + smlal v20.4S, v6.4H, v26.4H // .............*........................................ + ld2 {v23.8H, v24.8H}, [x2], #32 // ..............e....................................... + ld2 {v15.8H, v16.8H}, [x8], #32 // ................*..................................... + smlal v17.4S, v7.4H, v14.4H // ..................*................................... + ld2 {v8.8H, v9.8H}, [x7], #32 // ...................*.................................. + smlal v20.4S, v7.4H, v25.4H // .....................*................................ + smlal2 v27.4S, v7.8H, v25.8H // ......................*............................... + smlal2 v13.4S, v8.8H, v15.8H // .......................*.............................. + smlal v17.4S, v8.4H, v15.4H // ........................*............................. + smlal v20.4S, v8.4H, v16.4H // .........................*............................ + smlal2 v27.4S, v8.8H, v16.8H // ..........................*........................... + smlal2 v13.4S, v9.8H, v5.8H // ...........................*.......................... + smlal v17.4S, v9.4H, v5.4H // ............................*......................... + smlal v20.4S, v9.4H, v15.4H // .............................*........................ + smlal2 v27.4S, v9.8H, v15.8H // ..............................*....................... + ld2 {v11.8H, v12.8H}, [x1], #32 // ...............................e...................... + uzp1 v31.8H, v17.8H, v13.8H // .................................*.................... + uzp1 v8.8H, v20.8H, v27.8H // ..................................*................... + ld2 {v6.8H, v7.8H}, [x4], #32 // ...................................e.................. + mul v18.8H, v31.8H, v2.H[2] // .....................................*................ + mul v14.8H, v8.8H, v2.H[2] // ......................................*............... + ld1 {v31.8H}, [x3], #16 // .......................................e.............. + smlal v17.4S, v18.4H, v0.4H // .........................................*............ + smlal2 v27.4S, v14.8H, v0.8H // ..........................................*........... + smlal2 v13.4S, v18.8H, v0.8H // ...........................................*.......... + smlal v20.4S, v14.4H, v0.4H // ............................................*......... + ld2 {v25.8H, v26.8H}, [x5], #32 // .............................................e........ + uzp2 v16.8H, v17.8H, v13.8H // ...............................................*...... + smull2 v13.4S, v11.8H, v23.8H // ................................................e..... + uzp2 v17.8H, v20.8H, v27.8H // .................................................*.... + ld1 {v14.8H}, [x6], #16 // ..................................................e... + smlal2 v13.4S, v12.8H, v31.8H // ....................................................e. + smull2 v27.4S, v11.8H, v24.8H // .....................................................e + + // -------------------------------------- cycle (expected) --------------------------------------> + // 0 25 50 75 + // |------------------------|------------------------|------------------------|------------------- + // ld2 {v3.8h, v4.8h}, [x1], #32 // .................e......................'..............................~....................... + // ld2 {v5.8h, v6.8h}, [x2], #32 // e.......................................'.............~........................................ + // ld1 {v7.8h}, [x3], #16 // .........................e..............'......................................~............... + // smull v8.4s, v3.4h, v5.4h // ........................................'...*.................................................. + // smull2 v10.4s, v3.8h, v5.8h // ..................................e.....'...............................................~...... + // smlal v8.4s, v4.4h, v7.4h // ........................................'.......*.............................................. + // smlal2 v10.4s, v4.8h, v7.8h // ......................................e.'...................................................~.. + // smull v9.4s, v3.4h, v6.4h // ........................................'..*................................................... + // smull2 v11.4s, v3.8h, v6.8h // .......................................e'....................................................~. + // smlal v9.4s, v4.4h, v5.4h // ........................................'......*............................................... + // smlal2 v11.4s, v4.8h, v5.8h // ........................................'....*................................................. + // ld2 {v3.8h, v4.8h}, [x4], #32 // .....................e..................'..................................~................... + // ld2 {v5.8h, v6.8h}, [x5], #32 // ...............................e........'............................................~......... + // ld1 {v7.8h}, [x6], #16 // ....................................e...'.................................................~.... + // smlal v8.4s, v3.4h, v5.4h // ........................................'...........*.......................................... + // smlal2 v10.4s, v3.8h, v5.8h // ........................................'.*.................................................... + // smlal v8.4s, v4.4h, v7.4h // ....~...................................'.................*.................................... + // smlal2 v10.4s, v4.8h, v7.8h // ........................................'.....*................................................ + // smlal v9.4s, v3.4h, v6.4h // ........................................'............*......................................... + // smlal2 v11.4s, v3.8h, v6.8h // ........................................'........*............................................. + // smlal v9.4s, v4.4h, v5.4h // .......~................................'....................*................................. + // smlal2 v11.4s, v4.8h, v5.8h // ........~...............................'.....................*................................ + // ld2 {v3.8h, v4.8h}, [x7], #32 // .....~..................................'..................*................................... + // ld2 {v5.8h, v6.8h}, [x8], #32 // ..~.....................................'...............*...................................... + // ld1 {v7.8h}, [x9], #16 // ........................................'.........*............................................ + // smlal v8.4s, v3.4h, v5.4h // ..........~.............................'.......................*.............................. + // smlal2 v10.4s, v3.8h, v5.8h // .........~..............................'......................*............................... + // smlal v8.4s, v4.4h, v7.4h // ..............~.........................'...........................*.......................... + // smlal2 v10.4s, v4.8h, v7.8h // .............~..........................'..........................*........................... + // smlal v9.4s, v3.4h, v6.4h // ...........~............................'........................*............................. + // smlal2 v11.4s, v3.8h, v6.8h // ............~...........................'.........................*............................ + // smlal v9.4s, v4.4h, v5.4h // ...............~........................'............................*......................... + // smlal2 v11.4s, v4.8h, v5.8h // ................~.......................'.............................*........................ + // uzp1 v28.8h, v8.8h, v10.8h // ...................~....................'................................*..................... + // mul v28.8h, v28.8h, v2.h[2] // .......................~................'....................................*................. + // smlal v8.4s, v28.4h, v0.4h // ...........................~............'........................................*............. + // smlal2 v10.4s, v28.8h, v0.8h // .............................~..........'..........................................*........... + // uzp2 v26.8h, v8.8h, v10.8h // .................................~......'..............................................*....... + // uzp1 v28.8h, v9.8h, v11.8h // ....................~...................'.................................*.................... + // mul v28.8h, v28.8h, v2.h[2] // ........................~...............'.....................................*................ + // smlal v9.4s, v28.4h, v0.4h // ..............................~.........'...........................................*.......... + // smlal2 v11.4s, v28.8h, v0.8h // ............................~...........'.........................................*............ + // uzp2 v27.8h, v9.8h, v11.8h // ...................................~....'................................................*..... + // st2 {v26.8h, v27.8h}, [x0], #32 // ........................................~.....................................................l sub count, count, #1 cbnz count, k3_loop_start - // Instructions: 34 - // Expected cycles: 47 - // Expected IPC: 0.72 + // Instructions: 36 + // Expected cycles: 45 + // Expected IPC: 0.80 - // Cycle bound: 47.0 - // IPC bound: 0.72 + // Cycle bound: 45.0 + // IPC bound: 0.80 - // Wall time: 0.16s - // User time: 0.16s + // Wall time: 0.30s + // User time: 0.30s - // -------------- cycle (expected) --------------> + // ------------- cycle (expected) -------------> // 0 25 - // |------------------------|--------------------- - smlal v17.4S, v25.4H, v16.4H // *.............................................. - smlal2 v19.4S, v25.8H, v16.8H // .*............................................. - ld2 {v27.8H, v28.8H}, [x8], #32 // ..*............................................ - smlal2 v19.4S, v26.8H, v15.8H // ......*........................................ - ld1 {v31.8H}, [x9], #16 // .......*....................................... - smlal v17.4S, v26.4H, v15.4H // .........*..................................... - smlal2 v19.4S, v12.8H, v28.8H // ..........*.................................... - smlal v4.4S, v12.4H, v27.4H // ...........*................................... - smlal2 v10.4S, v12.8H, v27.8H // ............*.................................. - smlal v17.4S, v12.4H, v28.4H // .............*................................. - smlal2 v19.4S, v13.8H, v27.8H // ..............*................................ - smlal v4.4S, v13.4H, v31.4H // ...............*............................... - smlal2 v10.4S, v13.8H, v31.8H // ................*.............................. - smlal v17.4S, v13.4H, v27.4H // .................*............................. - srshr v3.8H, v7.8H, #11 // ..................*............................ - uzp1 v1.8H, v4.8H, v10.8H // ....................*.......................... - uzp1 v24.8H, v17.8H, v19.8H // .....................*......................... - mul v7.8H, v1.8H, v2.H[2] // ......................*........................ - mul v27.8H, v24.8H, v2.H[2] // .......................*....................... - mls v6.8H, v3.8H, v2.H[0] // ........................*...................... - smlal2 v10.4S, v7.8H, v0.8H // ..........................*.................... - smlal v17.4S, v27.4H, v0.4H // ...........................*................... - smlal2 v19.4S, v27.8H, v0.8H // ............................*.................. - smlal v4.4S, v7.4H, v0.4H // .............................*................. - st2 {v5.8H, v6.8H}, [x0], #32 // ..............................*................ - uzp2 v24.8H, v17.8H, v19.8H // ................................*.............. - uzp2 v23.8H, v4.8H, v10.8H // .................................*............. - sqdmulh v7.8H, v24.8H, v2.H[1] // ..................................*............ - sqdmulh v30.8H, v23.8H, v2.H[1] // ...................................*........... - srshr v4.8H, v7.8H, #11 // ......................................*........ - srshr v7.8H, v30.8H, #11 // .......................................*....... - mls v24.8H, v4.8H, v2.H[0] // .........................................*..... - mls v23.8H, v7.8H, v2.H[0] // ..........................................*.... - st2 {v23.8H, v24.8H}, [x0], #32 // ..............................................* - - // -------------- cycle (expected) --------------> + // |------------------------|------------------- + ld2 {v21.8H, v22.8H}, [x8], #32 // *............................................ + smull v10.4S, v11.4H, v24.4H // ..*.......................................... + smlal2 v13.4S, v6.8H, v25.8H // ...*......................................... + smlal2 v27.4S, v12.8H, v23.8H // ....*........................................ + smull v18.4S, v11.4H, v23.4H // .....*....................................... + smlal v10.4S, v12.4H, v23.4H // ......*...................................... + ld2 {v29.8H, v30.8H}, [x7], #32 // .......*..................................... + smlal2 v27.4S, v6.8H, v26.8H // .........*................................... + smlal v10.4S, v6.4H, v26.4H // ..........*.................................. + smlal v18.4S, v12.4H, v31.4H // ...........*................................. + smlal2 v13.4S, v7.8H, v14.8H // ............*................................ + smlal2 v27.4S, v7.8H, v25.8H // .............*............................... + smlal v10.4S, v7.4H, v25.4H // ..............*.............................. + smlal v18.4S, v6.4H, v25.4H // ...............*............................. + smlal2 v13.4S, v29.8H, v21.8H // ................*............................ + smlal2 v27.4S, v29.8H, v22.8H // .................*........................... + smlal v10.4S, v29.4H, v22.4H // ..................*.......................... + smlal v18.4S, v7.4H, v14.4H // ...................*......................... + ld1 {v3.8H}, [x9], #16 // ....................*........................ + smlal v10.4S, v30.4H, v21.4H // ......................*...................... + smlal v18.4S, v29.4H, v21.4H // .......................*..................... + smlal2 v27.4S, v30.8H, v21.8H // ........................*.................... + smlal2 v13.4S, v30.8H, v3.8H // .........................*................... + smlal v18.4S, v30.4H, v3.4H // ...........................*................. + uzp1 v8.8H, v10.8H, v27.8H // ............................*................ + mul v23.8H, v8.8H, v2.H[2] // ..............................*.............. + uzp1 v30.8H, v18.8H, v13.8H // ...............................*............. + mul v19.8H, v30.8H, v2.H[2] // .................................*........... + smlal2 v27.4S, v23.8H, v0.8H // ..................................*.......... + smlal v10.4S, v23.4H, v0.4H // ...................................*......... + smlal v18.4S, v19.4H, v0.4H // .....................................*....... + smlal2 v13.4S, v19.8H, v0.8H // ......................................*...... + st2 {v16.8H, v17.8H}, [x0], #32 // .......................................*..... + uzp2 v12.8H, v10.8H, v27.8H // .........................................*... + uzp2 v11.8H, v18.8H, v13.8H // ..........................................*.. + st2 {v11.8H, v12.8H}, [x0], #32 // ............................................* + + // ------------- cycle (expected) -------------> // 0 25 - // |------------------------|--------------------- - // srshr v28.8H, v7.8H, #11 // ..................*............................ - // smlal2 v19.4S, v25.8H, v16.8H // .*............................................. - // smlal v17.4S, v25.4H, v16.4H // *.............................................. - // mls v6.8H, v28.8H, v2.H[0] // ........................*...................... - // ld2 {v20.8H, v21.8H}, [x8], #32 // ..*............................................ - // smlal2 v19.4S, v26.8H, v15.8H // ......*........................................ - // smlal v17.4S, v26.4H, v15.4H // .........*..................................... - // smlal v4.4S, v12.4H, v20.4H // ...........*................................... - // smlal2 v10.4S, v12.8H, v20.8H // ............*.................................. - // smlal2 v19.4S, v12.8H, v21.8H // ..........*.................................... - // smlal v17.4S, v12.4H, v21.4H // .............*................................. - // ld1 {v29.8H}, [x9], #16 // .......*....................................... - // smlal2 v19.4S, v13.8H, v20.8H // ..............*................................ - // smlal v17.4S, v13.4H, v20.4H // .................*............................. - // smlal v4.4S, v13.4H, v29.4H // ...............*............................... - // smlal2 v10.4S, v13.8H, v29.8H // ................*.............................. - // st2 {v5.8H, v6.8H}, [x0], #32 // ..............................*................ - // uzp1 v6.8H, v17.8H, v19.8H // .....................*......................... - // uzp1 v14.8H, v4.8H, v10.8H // ....................*.......................... - // mul v7.8H, v6.8H, v2.H[2] // .......................*....................... - // mul v1.8H, v14.8H, v2.H[2] // ......................*........................ - // smlal v4.4S, v1.4H, v0.4H // .............................*................. - // smlal2 v19.4S, v7.8H, v0.8H // ............................*.................. - // smlal v17.4S, v7.4H, v0.4H // ...........................*................... - // smlal2 v10.4S, v1.8H, v0.8H // ..........................*.................... - // uzp2 v6.8H, v17.8H, v19.8H // ................................*.............. - // uzp2 v5.8H, v4.8H, v10.8H // .................................*............. - // sqdmulh v27.8H, v5.8H, v2.H[1] // ...................................*........... - // srshr v3.8H, v27.8H, #11 // .......................................*....... - // sqdmulh v7.8H, v6.8H, v2.H[1] // ..................................*............ - // mls v5.8H, v3.8H, v2.H[0] // ..........................................*.... - // srshr v28.8H, v7.8H, #11 // ......................................*........ - // mls v6.8H, v28.8H, v2.H[0] // .........................................*..... - // st2 {v5.8H, v6.8H}, [x0], #32 // ..............................................* + // |------------------------|------------------- + // st2 {v16.8H, v17.8H}, [x0], #32 // .......................................*..... + // smlal2 v13.4S, v6.8H, v25.8H // ...*......................................... + // smull v20.4S, v11.4H, v24.4H // ..*.......................................... + // smull v17.4S, v11.4H, v23.4H // .....*....................................... + // smlal2 v27.4S, v12.8H, v23.8H // ....*........................................ + // smlal2 v13.4S, v7.8H, v14.8H // ............*................................ + // smlal v20.4S, v12.4H, v23.4H // ......*...................................... + // smlal v17.4S, v12.4H, v31.4H // ...........*................................. + // smlal2 v27.4S, v6.8H, v26.8H // .........*................................... + // ld1 {v5.8H}, [x9], #16 // ....................*........................ + // smlal v17.4S, v6.4H, v25.4H // ...............*............................. + // smlal v20.4S, v6.4H, v26.4H // ..........*.................................. + // ld2 {v15.8H, v16.8H}, [x8], #32 // *............................................ + // smlal v17.4S, v7.4H, v14.4H // ...................*......................... + // ld2 {v8.8H, v9.8H}, [x7], #32 // .......*..................................... + // smlal v20.4S, v7.4H, v25.4H // ..............*.............................. + // smlal2 v27.4S, v7.8H, v25.8H // .............*............................... + // smlal2 v13.4S, v8.8H, v15.8H // ................*............................ + // smlal v17.4S, v8.4H, v15.4H // .......................*..................... + // smlal v20.4S, v8.4H, v16.4H // ..................*.......................... + // smlal2 v27.4S, v8.8H, v16.8H // .................*........................... + // smlal2 v13.4S, v9.8H, v5.8H // .........................*................... + // smlal v17.4S, v9.4H, v5.4H // ...........................*................. + // smlal v20.4S, v9.4H, v15.4H // ......................*...................... + // smlal2 v27.4S, v9.8H, v15.8H // ........................*.................... + // uzp1 v31.8H, v17.8H, v13.8H // ...............................*............. + // uzp1 v8.8H, v20.8H, v27.8H // ............................*................ + // mul v18.8H, v31.8H, v2.H[2] // .................................*........... + // mul v14.8H, v8.8H, v2.H[2] // ..............................*.............. + // smlal v17.4S, v18.4H, v0.4H // .....................................*....... + // smlal2 v27.4S, v14.8H, v0.8H // ..................................*.......... + // smlal2 v13.4S, v18.8H, v0.8H // ......................................*...... + // smlal v20.4S, v14.4H, v0.4H // ...................................*......... + // uzp2 v16.8H, v17.8H, v13.8H // ..........................................*.. + // uzp2 v17.8H, v20.8H, v27.8H // .........................................*... + // st2 {v16.8H, v17.8H}, [x0], #32 // ............................................* pop_stack @@ -788,429 +727,393 @@ _polyvec_basemul_acc_montgomery_cached_asm_k4_opt: add b3_cache_ptr, b0_cache_ptr, #(3 * 512/2) mov count, #(KYBER_N / 16) - // Instructions: 45 - // Expected cycles: 74 - // Expected IPC: 0.61 + // Instructions: 18 + // Expected cycles: 27 + // Expected IPC: 0.67 // - // Cycle bound: 74.0 - // IPC bound: 0.61 + // Cycle bound: 27.0 + // IPC bound: 0.67 // - // Wall time: 3.04s - // User time: 3.04s + // Wall time: 0.03s + // User time: 0.03s // - // --------------------------- cycle (expected) ----------------------------> - // 0 25 50 - // |------------------------|------------------------|----------------------- - ld2 {v12.8H, v13.8H}, [x2], #32 // *......................................................................... - ld2 {v10.8H, v11.8H}, [x1], #32 // ....*..................................................................... - ld1 {v29.8H}, [x3], #16 // ........*................................................................. - smull v1.4S, v10.4H, v12.4H // ..........*............................................................... - ld1 {v31.8H}, [x9], #16 // ...........*.............................................................. - smull2 v28.4S, v10.8H, v12.8H // .............*............................................................ - smlal v1.4S, v11.4H, v29.4H // ..............*........................................................... - smull v5.4S, v10.4H, v13.4H // ...............*.......................................................... - smull2 v21.4S, v10.8H, v13.8H // ................*......................................................... - smlal2 v28.4S, v11.8H, v29.8H // .................*........................................................ - ld2 {v14.8H, v15.8H}, [x8], #32 // ..................*....................................................... - ld2 {v25.8H, v26.8H}, [x5], #32 // ......................*................................................... - ld2 {v29.8H, v30.8H}, [x4], #32 // ..........................*............................................... - smlal v5.4S, v11.4H, v12.4H // ..............................*........................................... - smlal2 v21.4S, v11.8H, v12.8H // ...............................*.......................................... - smlal2 v28.4S, v29.8H, v25.8H // ................................*......................................... - ld2 {v9.8H, v10.8H}, [x11], #32 // .................................*........................................ - smlal v5.4S, v29.4H, v26.4H // .....................................*.................................... - smlal2 v21.4S, v29.8H, v26.8H // ......................................*................................... - ld2 {v22.8H, v23.8H}, [x7], #32 // .......................................*.................................. - smlal v5.4S, v30.4H, v25.4H // ...........................................*.............................. - smlal2 v21.4S, v30.8H, v25.8H // ............................................*............................. - ld2 {v19.8H, v20.8H}, [x10], #32 // .............................................*............................ - smlal v5.4S, v22.4H, v15.4H // .................................................*........................ - smlal2 v21.4S, v22.8H, v15.8H // ..................................................*....................... - ld1 {v12.8H}, [x6], #16 // ...................................................*...................... - smlal v5.4S, v23.4H, v14.4H // .....................................................*.................... - smlal2 v21.4S, v23.8H, v14.8H // ......................................................*................... - smlal2 v28.4S, v30.8H, v12.8H // .......................................................*.................. - smlal v1.4S, v29.4H, v25.4H // ........................................................*................. - smlal v5.4S, v19.4H, v10.4H // .........................................................*................ - smlal2 v21.4S, v19.8H, v10.8H // ..........................................................*............... - smlal2 v28.4S, v22.8H, v14.8H // ...........................................................*.............. - smlal v1.4S, v30.4H, v12.4H // ............................................................*............. - smlal v5.4S, v20.4H, v9.4H // .............................................................*............ - smlal2 v21.4S, v20.8H, v9.8H // ..............................................................*........... - smlal2 v28.4S, v23.8H, v31.8H // ...............................................................*.......... - ld1 {v24.8H}, [x12], #16 // ................................................................*......... - uzp1 v12.8H, v5.8H, v21.8H // ..................................................................*....... - smlal2 v28.4S, v19.8H, v9.8H // ...................................................................*...... - mul v6.8H, v12.8H, v2.H[2] // ....................................................................*..... - smlal v1.4S, v22.4H, v14.4H // .....................................................................*.... - smlal2 v28.4S, v20.8H, v24.8H // .......................................................................*.. - smlal2 v21.4S, v6.8H, v0.8H // ........................................................................*. - ld2 {v7.8H, v8.8H}, [x5], #32 // .........................................................................* - - // --------------------------- cycle (expected) ----------------------------> - // 0 25 50 - // |------------------------|------------------------|----------------------- - // ld2 {v7.8H, v8.8H}, [x5], #32 // ......................*................................................... - // ld1 {v27.8H}, [x3], #16 // ........*................................................................. - // ld1 {v16.8H}, [x6], #16 // ...................................................*...................... - // ld1 {v31.8H}, [x9], #16 // ...........*.............................................................. - // ld2 {v3.8H, v4.8H}, [x1], #32 // ....*..................................................................... - // ld2 {v9.8H, v10.8H}, [x2], #32 // *......................................................................... - // ld1 {v24.8H}, [x12], #16 // ................................................................*......... - // smull2 v21.4S, v3.8H, v10.8H // ................*......................................................... - // smull v5.4S, v3.4H, v10.4H // ...............*.......................................................... - // smlal2 v21.4S, v4.8H, v9.8H // ...............................*.......................................... - // ld2 {v29.8H, v30.8H}, [x4], #32 // ..........................*............................................... - // ld2 {v22.8H, v23.8H}, [x7], #32 // .......................................*.................................. - // smull v1.4S, v3.4H, v9.4H // ..........*............................................................... - // smull2 v28.4S, v3.8H, v9.8H // .............*............................................................ - // smlal v5.4S, v4.4H, v9.4H // ..............................*........................................... - // smlal2 v21.4S, v29.8H, v8.8H // ......................................*................................... - // smlal v1.4S, v4.4H, v27.4H // ..............*........................................................... - // smlal2 v28.4S, v4.8H, v27.8H // .................*........................................................ - // smlal v5.4S, v29.4H, v8.4H // .....................................*.................................... - // smlal2 v21.4S, v30.8H, v7.8H // ............................................*............................. - // smlal v1.4S, v29.4H, v7.4H // ........................................................*................. - // smlal2 v28.4S, v29.8H, v7.8H // ................................*......................................... - // ld2 {v12.8H, v13.8H}, [x8], #32 // ..................*....................................................... - // smlal v1.4S, v30.4H, v16.4H // ............................................................*............. - // smlal2 v28.4S, v30.8H, v16.8H // .......................................................*.................. - // smlal v5.4S, v30.4H, v7.4H // ...........................................*.............................. - // smlal2 v21.4S, v22.8H, v13.8H // ..................................................*....................... - // ld2 {v9.8H, v10.8H}, [x11], #32 // .................................*........................................ - // smlal2 v21.4S, v23.8H, v12.8H // ......................................................*................... - // smlal v5.4S, v22.4H, v13.4H // .................................................*........................ - // ld2 {v19.8H, v20.8H}, [x10], #32 // .............................................*............................ - // smlal v5.4S, v23.4H, v12.4H // .....................................................*.................... - // smlal2 v28.4S, v22.8H, v12.8H // ...........................................................*.............. - // smlal2 v21.4S, v19.8H, v10.8H // ..........................................................*............... - // smlal v5.4S, v19.4H, v10.4H // .........................................................*................ - // smlal2 v28.4S, v23.8H, v31.8H // ...............................................................*.......... - // smlal2 v21.4S, v20.8H, v9.8H // ..............................................................*........... - // smlal v5.4S, v20.4H, v9.4H // .............................................................*............ - // smlal2 v28.4S, v19.8H, v9.8H // ...................................................................*...... - // smlal v1.4S, v22.4H, v12.4H // .....................................................................*.... - // uzp1 v12.8H, v5.8H, v21.8H // ..................................................................*....... - // smlal2 v28.4S, v20.8H, v24.8H // .......................................................................*.. - // mul v6.8H, v12.8H, v2.H[2] // ....................................................................*..... - // ld2 {v7.8H, v8.8H}, [x5], #32 // .........................................................................* - // smlal2 v21.4S, v6.8H, v0.8H // ........................................................................*. + // ----- cycle (expected) ------> + // 0 25 + // |------------------------|---- + ld2 {v3.8H, v4.8H}, [x1], #32 // *............................. + ld2 {v13.8H, v14.8H}, [x2], #32 // ..*........................... + ld1 {v31.8H}, [x3], #16 // ....*......................... + smull v9.4S, v3.4H, v14.4H // ......*....................... + smull2 v6.4S, v3.8H, v14.8H // .......*...................... + smull2 v29.4S, v3.8H, v13.8H // ........*..................... + smull v11.4S, v3.4H, v13.4H // .........*.................... + smlal v9.4S, v4.4H, v13.4H // ..........*................... + smlal2 v6.4S, v4.8H, v13.8H // ...........*.................. + smlal2 v29.4S, v4.8H, v31.8H // ............*................. + smlal v11.4S, v4.4H, v31.4H // .............*................ + ld2 {v27.8H, v28.8H}, [x7], #32 // ..............*............... + ld2 {v18.8H, v19.8H}, [x10], #32 // ................*............. + ld2 {v20.8H, v21.8H}, [x8], #32 // ..................*........... + ld2 {v25.8H, v26.8H}, [x11], #32 // ....................*......... + ld2 {v16.8H, v17.8H}, [x5], #32 // ......................*....... + ld2 {v7.8H, v8.8H}, [x1], #32 // ........................*..... + ld1 {v3.8H}, [x3], #16 // ..........................*... + + // ------ cycle (expected) ------> + // 0 25 + // |------------------------|----- + // ld2 {v7.8H, v8.8H}, [x1], #32 // *.............................. + // ld1 {v3.8H}, [x3], #16 // ....*.......................... + // ld2 {v4.8H, v5.8H}, [x2], #32 // ..*............................ + // ld2 {v27.8H, v28.8H}, [x7], #32 // ..............*................ + // ld2 {v18.8H, v19.8H}, [x10], #32 // ................*.............. + // smull v9.4S, v7.4H, v5.4H // ......*........................ + // ld2 {v20.8H, v21.8H}, [x8], #32 // ..................*............ + // smlal v9.4S, v8.4H, v4.4H // ..........*.................... + // smull2 v29.4S, v7.8H, v4.8H // ........*...................... + // smull2 v6.4S, v7.8H, v5.8H // .......*....................... + // ld2 {v25.8H, v26.8H}, [x11], #32 // ....................*.......... + // smull v11.4S, v7.4H, v4.4H // .........*..................... + // smlal2 v6.4S, v8.8H, v4.8H // ...........*................... + // smlal2 v29.4S, v8.8H, v3.8H // ............*.................. + // ld2 {v16.8H, v17.8H}, [x5], #32 // ......................*........ + // smlal v11.4S, v8.4H, v3.4H // .............*................. + // ld2 {v7.8H, v8.8H}, [x1], #32 // ........................*...... + // ld1 {v3.8H}, [x3], #16 // ..........................*.... sub count, count, #2 k4_loop_start: - // Instructions: 61 - // Expected cycles: 90 - // Expected IPC: 0.68 + // Instructions: 55 + // Expected cycles: 68 + // Expected IPC: 0.81 // - // Cycle bound: 89.0 - // IPC bound: 0.69 + // Cycle bound: 68.0 + // IPC bound: 0.81 // - // Wall time: 63.34s - // User time: 63.34s + // Wall time: 13.63s + // User time: 13.63s // - // ----------------------------------- cycle (expected) ------------------------------------> - // 0 25 50 75 - // |------------------------|------------------------|------------------------|-------------- - smlal v5.4S, v6.4H, v0.4H // .l........................................................................................ - smlal v1.4S, v23.4H, v31.4H // ..l....................................................................................... - ld1 {v27.8H}, [x3], #16 // ...*...................................................................................... - uzp2 v18.8H, v5.8H, v21.8H // .....l.................................................................................... - smlal v1.4S, v19.4H, v9.4H // ......l................................................................................... - sqdmulh v21.8H, v18.8H, v2.H[1] // .......l.................................................................................. - ld1 {v16.8H}, [x6], #16 // ........*................................................................................. - smlal v1.4S, v20.4H, v24.4H // ..........l............................................................................... - srshr v15.8H, v21.8H, #11 // ...........l.............................................................................. - ld1 {v31.8H}, [x9], #16 // ............*............................................................................. - mls v18.8H, v15.8H, v2.H[0] // ..............l........................................................................... - ld2 {v3.8H, v4.8H}, [x1], #32 // ...............*.......................................................................... - ld2 {v9.8H, v10.8H}, [x2], #32 // ...................*...................................................................... - ld1 {v24.8H}, [x12], #16 // .......................*.................................................................. - smull2 v21.4S, v3.8H, v10.8H // .........................*................................................................ - uzp1 v15.8H, v1.8H, v28.8H // ..........................l............................................................... - smull v5.4S, v3.4H, v10.4H // ...........................*.............................................................. - mul v12.8H, v15.8H, v2.H[2] // ............................l............................................................. - smlal2 v21.4S, v4.8H, v9.8H // .............................*............................................................ - ld2 {v29.8H, v30.8H}, [x4], #32 // ..............................*........................................................... - smlal v1.4S, v12.4H, v0.4H // ..................................l....................................................... - smlal2 v28.4S, v12.8H, v0.8H // ...................................l...................................................... - ld2 {v22.8H, v23.8H}, [x7], #32 // ....................................*..................................................... - uzp2 v17.8H, v1.8H, v28.8H // ........................................l................................................. - smull v1.4S, v3.4H, v9.4H // .........................................*................................................ - smull2 v28.4S, v3.8H, v9.8H // ..........................................*............................................... - smlal v5.4S, v4.4H, v9.4H // ...........................................*.............................................. - smlal2 v21.4S, v29.8H, v8.8H // ............................................*............................................. - smlal v1.4S, v4.4H, v27.4H // .............................................*............................................ - smlal2 v28.4S, v4.8H, v27.8H // ..............................................*........................................... - smlal v5.4S, v29.4H, v8.4H // ...............................................*.......................................... - smlal2 v21.4S, v30.8H, v7.8H // ................................................*......................................... - smlal v1.4S, v29.4H, v7.4H // .................................................*........................................ - smlal2 v28.4S, v29.8H, v7.8H // ..................................................*....................................... - ld2 {v12.8H, v13.8H}, [x8], #32 // ...................................................*...................................... - smlal v1.4S, v30.4H, v16.4H // .......................................................*.................................. - smlal2 v28.4S, v30.8H, v16.8H // ........................................................*................................. - smlal v5.4S, v30.4H, v7.4H // .........................................................*................................ - smlal2 v21.4S, v22.8H, v13.8H // ..........................................................*............................... - ld2 {v9.8H, v10.8H}, [x11], #32 // ...........................................................*.............................. - smlal2 v21.4S, v23.8H, v12.8H // ...............................................................*.......................... - smlal v5.4S, v22.4H, v13.4H // ................................................................*......................... - ld2 {v19.8H, v20.8H}, [x10], #32 // .................................................................*........................ - smlal v5.4S, v23.4H, v12.4H // .....................................................................*.................... - smlal2 v28.4S, v22.8H, v12.8H // ......................................................................*................... - smlal2 v21.4S, v19.8H, v10.8H // .......................................................................*.................. - sqdmulh v14.8H, v17.8H, v2.H[1] // ........................................................................l................. - smlal v5.4S, v19.4H, v10.4H // .........................................................................*................ - smlal2 v28.4S, v23.8H, v31.8H // ..........................................................................*............... - smlal2 v21.4S, v20.8H, v9.8H // ...........................................................................*.............. - srshr v6.8H, v14.8H, #11 // ............................................................................l............. - smlal v5.4S, v20.4H, v9.4H // .............................................................................*............ - smlal2 v28.4S, v19.8H, v9.8H // ..............................................................................*........... - smlal v1.4S, v22.4H, v12.4H // ...............................................................................*.......... - mls v17.8H, v6.8H, v2.H[0] // ................................................................................l......... - uzp1 v12.8H, v5.8H, v21.8H // .................................................................................*........ - smlal2 v28.4S, v20.8H, v24.8H // ..................................................................................*....... - mul v6.8H, v12.8H, v2.H[2] // ...................................................................................*...... - ld2 {v7.8H, v8.8H}, [x5], #32 // ....................................................................................e..... - smlal2 v21.4S, v6.8H, v0.8H // ........................................................................................*. - st2 {v17.8H, v18.8H}, [x0], #32 // .........................................................................................l - - // ----------------------------------------------------------------------------------- cycle (expected) ------------------------------------------------------------------------------------> - // 0 25 50 75 100 125 150 175 - // |------------------------|------------------------|------------------------|------------------------|------------------------|------------------------|------------------------|---------- - // ld2 {v3.8h, v4.8h}, [x1], #32 // ......'..............*..........................................................................'..............~.......................................................................... - // ld2 {v5.8h, v6.8h}, [x2], #32 // ......'..................*......................................................................'..................~...................................................................... - // ld1 {v7.8h}, [x3], #16 // ......'..*......................................................................................'..~...................................................................................... - // smull v8.4s, v3.4h, v5.4h // ......'........................................*................................................'........................................~................................................ - // smull2 v10.4s, v3.8h, v5.8h // ......'.........................................*...............................................'.........................................~............................................... - // smlal v8.4s, v4.4h, v7.4h // ......'............................................*............................................'............................................~............................................ - // smlal2 v10.4s, v4.8h, v7.8h // ......'.............................................*...........................................'.............................................~........................................... - // smull v9.4s, v3.4h, v6.4h // ......'..........................*..............................................................'..........................~.............................................................. - // smull2 v11.4s, v3.8h, v6.8h // ......'........................*................................................................'........................~................................................................ - // smlal v9.4s, v4.4h, v5.4h // ......'..........................................*..............................................'..........................................~.............................................. - // smlal2 v11.4s, v4.8h, v5.8h // ......'............................*............................................................'............................~............................................................ - // ld2 {v3.8h, v4.8h}, [x4], #32 // ......'.............................*...........................................................'.............................~........................................................... - // ld2 {v5.8h, v6.8h}, [x5], #32 // e.....'...................................................................................~.....'...................................................................................~..... - // ld1 {v7.8h}, [x6], #16 // ......'.......*.................................................................................'.......~................................................................................. - // smlal v8.4s, v3.4h, v5.4h // ......'................................................*........................................'................................................~........................................ - // smlal2 v10.4s, v3.8h, v5.8h // ......'.................................................*.......................................'.................................................~....................................... - // smlal v8.4s, v4.4h, v7.4h // ......'......................................................*..................................'......................................................~.................................. - // smlal2 v10.4s, v4.8h, v7.8h // ......'.......................................................*.................................'.......................................................~................................. - // smlal v9.4s, v3.4h, v6.4h // ......'..............................................*..........................................'..............................................~.......................................... - // smlal2 v11.4s, v3.8h, v6.8h // ......'...........................................*.............................................'...........................................~............................................. - // smlal v9.4s, v4.4h, v5.4h // ......'........................................................*................................'........................................................~................................ - // smlal2 v11.4s, v4.8h, v5.8h // ......'...............................................*.........................................'...............................................~......................................... - // ld2 {v3.8h, v4.8h}, [x7], #32 // ......'...................................*.....................................................'...................................~..................................................... - // ld2 {v5.8h, v6.8h}, [x8], #32 // ......'..................................................*......................................'..................................................~...................................... - // ld1 {v7.8h}, [x9], #16 // ......'...........*.............................................................................'...........~............................................................................. - // smlal v8.4s, v3.4h, v5.4h // ......'..............................................................................*..........'..............................................................................~.......... - // smlal2 v10.4s, v3.8h, v5.8h // ......'.....................................................................*...................'.....................................................................~................... - // smlal v8.4s, v4.4h, v7.4h // ......'.~.......................................................................................'.l....................................................................................... - // smlal2 v10.4s, v4.8h, v7.8h // ......'.........................................................................*...............'.........................................................................~............... - // smlal v9.4s, v3.4h, v6.4h // ......'...............................................................*.........................'...............................................................~......................... - // smlal2 v11.4s, v3.8h, v6.8h // ......'.........................................................*...............................'.........................................................~............................... - // smlal v9.4s, v4.4h, v5.4h // ......'....................................................................*....................'....................................................................~.................... - // smlal2 v11.4s, v4.8h, v5.8h // ......'..............................................................*..........................'..............................................................~.......................... - // ld2 {v3.8h, v4.8h}, [x10], #32 // ......'................................................................*........................'................................................................~........................ - // ld2 {v5.8h, v6.8h}, [x11], #32 // ......'..........................................................*..............................'..........................................................~.............................. - // ld1 {v7.8h}, [x12], #16 // ......'......................*..................................................................'......................~.................................................................. - // smlal v8.4s, v3.4h, v5.4h // ......'.....~...................................................................................'.....l................................................................................... - // smlal2 v10.4s, v3.8h, v5.8h // ......'.............................................................................*...........'.............................................................................~........... - // smlal v8.4s, v4.4h, v7.4h // ......'.........~...............................................................................'.........l............................................................................... - // smlal2 v10.4s, v4.8h, v7.8h // ......'.................................................................................*.......'.................................................................................~....... - // smlal v9.4s, v3.4h, v6.4h // ......'........................................................................*................'........................................................................~................ - // smlal2 v11.4s, v3.8h, v6.8h // ......'......................................................................*..................'......................................................................~.................. - // smlal v9.4s, v4.4h, v5.4h // ......'............................................................................*............'............................................................................~............ - // smlal2 v11.4s, v4.8h, v5.8h // ......'..........................................................................*..............'..........................................................................~.............. - // uzp1 v28.8h, v8.8h, v10.8h // ......'.........................~...............................................................'.........................l............................................................... - // mul v28.8h, v28.8h, v2.h[2] // ......'...........................~.............................................................'...........................l............................................................. - // smlal v8.4s, v28.4h, v0.4h // ......'.................................~.......................................................'.................................l....................................................... - // smlal2 v10.4s, v28.8h, v0.8h // ......'..................................~......................................................'..................................l...................................................... - // uzp2 v26.8h, v8.8h, v10.8h // ......'.......................................~.................................................'.......................................l................................................. - // uzp1 v28.8h, v9.8h, v11.8h // ......'................................................................................*........'................................................................................~........ - // mul v28.8h, v28.8h, v2.h[2] // ......'..................................................................................*......'..................................................................................~...... - // smlal v9.4s, v28.4h, v0.4h // ......'~........................................................................................'l........................................................................................ - // smlal2 v11.4s, v28.8h, v0.8h // ....~.'.......................................................................................*.'.......................................................................................~. - // uzp2 v27.8h, v9.8h, v11.8h // ......'....~....................................................................................'....l.................................................................................... - // sqdmulh v28.8h, v26.8h, v2.h[1] // ......'.......................................................................~.................'.......................................................................l................. - // srshr v28.8h, v28.8h, #11 // ......'...........................................................................~.............'...........................................................................l............. - // mls v26.8h, v28.8h, v2.h[0] // ......'...............................................................................~.........'...............................................................................l......... - // sqdmulh v28.8h, v27.8h, v2.h[1] // ......'......~..................................................................................'......l.................................................................................. - // srshr v28.8h, v28.8h, #11 // ......'..........~..............................................................................'..........l.............................................................................. - // mls v27.8h, v28.8h, v2.h[0] // ......'.............~...........................................................................'.............l........................................................................... - // st2 {v26.8h, v27.8h}, [x0], #32 // .....~'........................................................................................~'........................................................................................l + // ------------------------ cycle (expected) -------------------------> + // 0 25 50 + // |------------------------|------------------------|----------------- + ld2 {v13.8H, v14.8H}, [x4], #32 // l................................................................... + ld1 {v15.8H}, [x6], #16 // ..l................................................................. + smlal2 v29.4S, v13.8H, v16.8H // ....l............................................................... + smlal v9.4S, v13.4H, v17.4H // .....l.............................................................. + smlal2 v6.4S, v13.8H, v17.8H // ......l............................................................. + smlal v11.4S, v13.4H, v16.4H // .......l............................................................ + smlal2 v29.4S, v14.8H, v15.8H // ........l........................................................... + smlal v9.4S, v14.4H, v16.4H // .........l.......................................................... + smlal2 v6.4S, v14.8H, v16.8H // ..........l......................................................... + ld1 {v30.8H}, [x9], #16 // ...........l........................................................ + smlal v9.4S, v27.4H, v21.4H // .............l...................................................... + smlal2 v6.4S, v27.8H, v21.8H // ..............l..................................................... + smlal v11.4S, v14.4H, v15.4H // ...............l.................................................... + smlal2 v29.4S, v27.8H, v20.8H // ................l................................................... + smlal v9.4S, v28.4H, v20.4H // .................l.................................................. + smlal2 v6.4S, v28.8H, v20.8H // ..................l................................................. + smlal v11.4S, v27.4H, v20.4H // ...................l................................................ + smlal2 v29.4S, v28.8H, v30.8H // ....................l............................................... + smlal v9.4S, v18.4H, v26.4H // .....................l.............................................. + smlal2 v6.4S, v18.8H, v26.8H // ......................l............................................. + smlal v11.4S, v28.4H, v30.4H // .......................l............................................ + smlal2 v29.4S, v18.8H, v25.8H // ........................l........................................... + smlal v9.4S, v19.4H, v25.4H // .........................l.......................................... + smlal2 v6.4S, v19.8H, v25.8H // ..........................l......................................... + ld1 {v23.8H}, [x12], #16 // ...........................l........................................ + smlal v11.4S, v18.4H, v25.4H // .............................l...................................... + uzp1 v14.8H, v9.8H, v6.8H // ..............................l..................................... + smlal2 v29.4S, v19.8H, v23.8H // ...............................l.................................... + mul v27.8H, v14.8H, v2.H[2] // ................................l................................... + smlal v11.4S, v19.4H, v23.4H // .................................l.................................. + ld2 {v4.8H, v5.8H}, [x2], #32 // ..................................*................................. + smlal v9.4S, v27.4H, v0.4H // ....................................l............................... + smlal2 v6.4S, v27.8H, v0.8H // .....................................l.............................. + ld2 {v27.8H, v28.8H}, [x7], #32 // ......................................*............................. + uzp1 v13.8H, v11.8H, v29.8H // ........................................l........................... + uzp2 v15.8H, v9.8H, v6.8H // .........................................l.......................... + mul v13.8H, v13.8H, v2.H[2] // ..........................................l......................... + ld2 {v18.8H, v19.8H}, [x10], #32 // ...........................................*........................ + smull v9.4S, v7.4H, v5.4H // .............................................*...................... + smlal v11.4S, v13.4H, v0.4H // ..............................................l..................... + smlal2 v29.4S, v13.8H, v0.8H // ...............................................l.................... + ld2 {v20.8H, v21.8H}, [x8], #32 // ................................................*................... + smlal v9.4S, v8.4H, v4.4H // ..................................................*................. + uzp2 v14.8H, v11.8H, v29.8H // ...................................................l................ + smull2 v29.4S, v7.8H, v4.8H // ....................................................*............... + smull2 v6.4S, v7.8H, v5.8H // .....................................................*.............. + ld2 {v25.8H, v26.8H}, [x11], #32 // ......................................................*............. + smull v11.4S, v7.4H, v4.4H // ........................................................*........... + smlal2 v6.4S, v8.8H, v4.8H // .........................................................*.......... + smlal2 v29.4S, v8.8H, v3.8H // ..........................................................*......... + ld2 {v16.8H, v17.8H}, [x5], #32 // ...........................................................*........ + smlal v11.4S, v8.4H, v3.4H // .............................................................*...... + ld2 {v7.8H, v8.8H}, [x1], #32 // ..............................................................e..... + ld1 {v3.8H}, [x3], #16 // ................................................................e... + st2 {v14.8H, v15.8H}, [x0], #32 // ..................................................................l. + + // ------------------------------------------------------------- cycle (expected) -------------------------------------------------------------> + // 0 25 50 75 100 125 + // |------------------------|------------------------|------------------------|------------------------|------------------------|--------------- + // ld2 {v3.8h, v4.8h}, [x1], #32 // e.....'.............................................................~.....'.............................................................~.... + // ld2 {v5.8h, v6.8h}, [x2], #32 // ......'.................................*.................................'.................................~................................ + // ld1 {v7.8h}, [x3], #16 // ..e...'...............................................................~...'...............................................................~.. + // smull v8.4s, v3.4h, v5.4h // ......'.......................................................*...........'.......................................................~.......... + // smull2 v10.4s, v3.8h, v5.8h // ......'...................................................*...............'...................................................~.............. + // smlal v8.4s, v4.4h, v7.4h // ......'............................................................*......'............................................................~..... + // smlal2 v10.4s, v4.8h, v7.8h // ......'.........................................................*.........'.........................................................~........ + // smull v9.4s, v3.4h, v6.4h // ......'............................................*......................'............................................~..................... + // smull2 v11.4s, v3.8h, v6.8h // ......'....................................................*..............'....................................................~............. + // smlal v9.4s, v4.4h, v5.4h // ......'.................................................*.................'.................................................~................ + // smlal2 v11.4s, v4.8h, v5.8h // ......'........................................................*..........'........................................................~......... + // ld2 {v3.8h, v4.8h}, [x4], #32 // ......~...................................................................l.................................................................. + // ld2 {v5.8h, v6.8h}, [x5], #32 // ......'..........................................................*........'..........................................................~....... + // ld1 {v7.8h}, [x6], #16 // ......'.~.................................................................'.l................................................................ + // smlal v8.4s, v3.4h, v5.4h // ......'......~............................................................'......l........................................................... + // smlal2 v10.4s, v3.8h, v5.8h // ......'...~...............................................................'...l.............................................................. + // smlal v8.4s, v4.4h, v7.4h // ......'..............~....................................................'..............l................................................... + // smlal2 v10.4s, v4.8h, v7.8h // ......'.......~...........................................................'.......l.......................................................... + // smlal v9.4s, v3.4h, v6.4h // ......'....~..............................................................'....l............................................................. + // smlal2 v11.4s, v3.8h, v6.8h // ......'.....~.............................................................'.....l............................................................ + // smlal v9.4s, v4.4h, v5.4h // ......'........~..........................................................'........l......................................................... + // smlal2 v11.4s, v4.8h, v5.8h // ......'.........~.........................................................'.........l........................................................ + // ld2 {v3.8h, v4.8h}, [x7], #32 // ......'.....................................*.............................'.....................................~............................ + // ld2 {v5.8h, v6.8h}, [x8], #32 // ......'...............................................*...................'...............................................~.................. + // ld1 {v7.8h}, [x9], #16 // ......'..........~........................................................'..........l....................................................... + // smlal v8.4s, v3.4h, v5.4h // ......'..................~................................................'..................l............................................... + // smlal2 v10.4s, v3.8h, v5.8h // ......'...............~...................................................'...............l.................................................. + // smlal v8.4s, v4.4h, v7.4h // ......'......................~............................................'......................l........................................... + // smlal2 v10.4s, v4.8h, v7.8h // ......'...................~...............................................'...................l.............................................. + // smlal v9.4s, v3.4h, v6.4h // ......'............~......................................................'............l..................................................... + // smlal2 v11.4s, v3.8h, v6.8h // ......'.............~.....................................................'.............l.................................................... + // smlal v9.4s, v4.4h, v5.4h // ......'................~..................................................'................l................................................. + // smlal2 v11.4s, v4.8h, v5.8h // ......'.................~.................................................'.................l................................................ + // ld2 {v3.8h, v4.8h}, [x10], #32 // ......'..........................................*........................'..........................................~....................... + // ld2 {v5.8h, v6.8h}, [x11], #32 // ......'.....................................................*.............'.....................................................~............ + // ld1 {v7.8h}, [x12], #16 // ......'..........................~........................................'..........................l....................................... + // smlal v8.4s, v3.4h, v5.4h // ......'............................~......................................'............................l..................................... + // smlal2 v10.4s, v3.8h, v5.8h // ......'.......................~...........................................'.......................l.......................................... + // smlal v8.4s, v4.4h, v7.4h // ......'................................~..................................'................................l................................. + // smlal2 v10.4s, v4.8h, v7.8h // ......'..............................~....................................'..............................l................................... + // smlal v9.4s, v3.4h, v6.4h // ......'....................~..............................................'....................l............................................. + // smlal2 v11.4s, v3.8h, v6.8h // ......'.....................~.............................................'.....................l............................................ + // smlal v9.4s, v4.4h, v5.4h // ......'........................~..........................................'........................l......................................... + // smlal2 v11.4s, v4.8h, v5.8h // ......'.........................~.........................................'.........................l........................................ + // uzp1 v28.8h, v8.8h, v10.8h // ......'.......................................~...........................'.......................................l.......................... + // mul v28.8h, v28.8h, v2.h[2] // ......'.........................................~.........................'.........................................l........................ + // smlal v8.4s, v28.4h, v0.4h // ......'.............................................~.....................'.............................................l.................... + // smlal2 v10.4s, v28.8h, v0.8h // ......'..............................................~....................'..............................................l................... + // uzp2 v26.8h, v8.8h, v10.8h // ......'..................................................~................'..................................................l............... + // uzp1 v28.8h, v9.8h, v11.8h // ......'.............................~.....................................'.............................l.................................... + // mul v28.8h, v28.8h, v2.h[2] // ......'...............................~...................................'...............................l.................................. + // smlal v9.4s, v28.4h, v0.4h // ......'...................................~...............................'...................................l.............................. + // smlal2 v11.4s, v28.8h, v0.8h // ......'....................................~..............................'....................................l............................. + // uzp2 v27.8h, v9.8h, v11.8h // ......'........................................~..........................'........................................l......................... + // st2 {v26.8h, v27.8h}, [x0], #32 // ....~.'.................................................................~.'.................................................................l sub count, count, #1 cbnz count, k4_loop_start - // Instructions: 77 - // Expected cycles: 104 - // Expected IPC: 0.74 + // Instructions: 92 + // Expected cycles: 107 + // Expected IPC: 0.86 // - // Cycle bound: 104.0 - // IPC bound: 0.74 + // Cycle bound: 107.0 + // IPC bound: 0.86 // - // Wall time: 1.67s - // User time: 1.67s + // Wall time: 15.26s + // User time: 15.26s // - // ------------------------------------------ cycle (expected) -------------------------------------------> + // -------------------------------------------- cycle (expected) --------------------------------------------> // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|--- - smlal v5.4S, v6.4H, v0.4H // *....................................................................................................... - smlal v1.4S, v23.4H, v31.4H // .*...................................................................................................... - ld2 {v14.8H, v15.8H}, [x8], #32 // ..*..................................................................................................... - uzp2 v6.8H, v5.8H, v21.8H // ......*................................................................................................. - smlal v1.4S, v19.4H, v9.4H // .......*................................................................................................ - ld1 {v26.8H}, [x9], #16 // ........*............................................................................................... - sqdmulh v4.8H, v6.8H, v2.H[1] // ..........*............................................................................................. - smlal v1.4S, v20.4H, v24.4H // ...........*............................................................................................ - ld2 {v12.8H, v13.8H}, [x4], #32 // ............*........................................................................................... - ld2 {v10.8H, v11.8H}, [x2], #32 // ................*....................................................................................... - ld2 {v29.8H, v30.8H}, [x1], #32 // ....................*................................................................................... - ld1 {v18.8H}, [x3], #16 // ........................*............................................................................... - smull2 v17.4S, v29.8H, v10.8H // ..........................*............................................................................. - smull v9.4S, v29.4H, v10.4H // ...........................*............................................................................ - ld1 {v25.8H}, [x6], #16 // ............................*........................................................................... - smlal2 v17.4S, v30.8H, v18.8H // ..............................*......................................................................... - smull2 v27.4S, v29.8H, v11.8H // ...............................*........................................................................ - smull v21.4S, v29.4H, v11.4H // ................................*....................................................................... - smlal v9.4S, v30.4H, v18.4H // .................................*...................................................................... - smlal2 v17.4S, v12.8H, v7.8H // ..................................*..................................................................... - smlal2 v27.4S, v30.8H, v10.8H // ...................................*.................................................................... - smlal v21.4S, v30.4H, v10.4H // ....................................*................................................................... - ld2 {v10.8H, v11.8H}, [x11], #32 // .....................................*.................................................................. - smlal v21.4S, v12.4H, v8.4H // .........................................*.............................................................. - smlal2 v17.4S, v13.8H, v25.8H // ..........................................*............................................................. - ld2 {v29.8H, v30.8H}, [x10], #32 // ...........................................*............................................................ - smlal v21.4S, v13.4H, v7.4H // ...............................................*........................................................ - smlal v9.4S, v12.4H, v7.4H // ................................................*....................................................... - uzp1 v18.8H, v1.8H, v28.8H // .................................................*...................................................... - ld2 {v19.8H, v20.8H}, [x7], #32 // ..................................................*..................................................... - smlal2 v27.4S, v12.8H, v8.8H // ......................................................*................................................. - smlal v9.4S, v13.4H, v25.4H // .......................................................*................................................ - ld1 {v16.8H}, [x12], #16 // ........................................................*............................................... - smlal2 v27.4S, v13.8H, v7.8H // ..........................................................*............................................. - smlal v9.4S, v19.4H, v14.4H // ...........................................................*............................................ - smlal2 v17.4S, v19.8H, v14.8H // ............................................................*........................................... - smlal v21.4S, v19.4H, v15.4H // .............................................................*.......................................... - smlal2 v27.4S, v19.8H, v15.8H // ..............................................................*......................................... - smlal v9.4S, v20.4H, v26.4H // ...............................................................*........................................ - smlal2 v17.4S, v20.8H, v26.8H // ................................................................*....................................... - smlal v21.4S, v20.4H, v14.4H // .................................................................*...................................... - smlal2 v27.4S, v20.8H, v14.8H // ..................................................................*..................................... - smlal v9.4S, v29.4H, v10.4H // ...................................................................*.................................... - smlal2 v17.4S, v29.8H, v10.8H // ....................................................................*................................... - smlal v21.4S, v29.4H, v11.4H // .....................................................................*.................................. - smlal2 v27.4S, v29.8H, v11.8H // ......................................................................*................................. - smlal v9.4S, v30.4H, v16.4H // .......................................................................*................................ - smlal2 v17.4S, v30.8H, v16.8H // ........................................................................*............................... - smlal v21.4S, v30.4H, v10.4H // .........................................................................*.............................. - smlal2 v27.4S, v30.8H, v10.8H // ..........................................................................*............................. - srshr v26.8H, v4.8H, #11 // ...........................................................................*............................ - uzp1 v12.8H, v9.8H, v17.8H // ............................................................................*........................... - mul v14.8H, v18.8H, v2.H[2] // .............................................................................*.......................... - uzp1 v29.8H, v21.8H, v27.8H // ..............................................................................*......................... - mul v12.8H, v12.8H, v2.H[2] // ...............................................................................*........................ - mul v29.8H, v29.8H, v2.H[2] // ................................................................................*....................... - smlal v1.4S, v14.4H, v0.4H // .................................................................................*...................... - smlal2 v28.4S, v14.8H, v0.8H // ..................................................................................*..................... - smlal2 v17.4S, v12.8H, v0.8H // ...................................................................................*.................... - smlal v9.4S, v12.4H, v0.4H // ....................................................................................*................... - smlal v21.4S, v29.4H, v0.4H // .....................................................................................*.................. - smlal2 v27.4S, v29.8H, v0.8H // ......................................................................................*................. - uzp2 v5.8H, v1.8H, v28.8H // .......................................................................................*................ - uzp2 v3.8H, v9.8H, v17.8H // ........................................................................................*............... - sqdmulh v14.8H, v5.8H, v2.H[1] // .........................................................................................*.............. - uzp2 v4.8H, v21.8H, v27.8H // ..........................................................................................*............. - sqdmulh v12.8H, v3.8H, v2.H[1] // ...........................................................................................*............ - sqdmulh v29.8H, v4.8H, v2.H[1] // ............................................................................................*........... - mls v6.8H, v26.8H, v2.H[0] // .............................................................................................*.......... - srshr v14.8H, v14.8H, #11 // ..............................................................................................*......... - srshr v12.8H, v12.8H, #11 // ...............................................................................................*........ - srshr v29.8H, v29.8H, #11 // ................................................................................................*....... - mls v5.8H, v14.8H, v2.H[0] // .................................................................................................*...... - mls v3.8H, v12.8H, v2.H[0] // ..................................................................................................*..... - mls v4.8H, v29.8H, v2.H[0] // ...................................................................................................*.... - st2 {v5.8H, v6.8H}, [x0], #32 // .....................................................................................................*.. - st2 {v3.8H, v4.8H}, [x0], #32 // .......................................................................................................* - - // ------------------------------------------ cycle (expected) -------------------------------------------> + // |------------------------|------------------------|------------------------|------------------------|------ + ld2 {v14.8H, v15.8H}, [x4], #32 // *.......................................................................................................... + ld1 {v1.8H}, [x6], #16 // ..*........................................................................................................ + smlal2 v29.4S, v14.8H, v16.8H // ....*...................................................................................................... + smlal v11.4S, v14.4H, v16.4H // .....*..................................................................................................... + ld2 {v12.8H, v13.8H}, [x5], #32 // ......*.................................................................................................... + smlal2 v29.4S, v15.8H, v1.8H // ........*.................................................................................................. + smlal v11.4S, v15.4H, v1.4H // .........*................................................................................................. + ld1 {v10.8H}, [x9], #16 // ..........*................................................................................................ + smlal2 v29.4S, v27.8H, v20.8H // ............*.............................................................................................. + smlal v11.4S, v27.4H, v20.4H // .............*............................................................................................. + ld2 {v22.8H, v23.8H}, [x2], #32 // ..............*............................................................................................ + smlal2 v29.4S, v28.8H, v10.8H // ................*.......................................................................................... + smlal v11.4S, v28.4H, v10.4H // .................*......................................................................................... + ld1 {v31.8H}, [x12], #16 // ..................*........................................................................................ + smlal2 v29.4S, v18.8H, v25.8H // ....................*...................................................................................... + smlal v11.4S, v18.4H, v25.4H // .....................*..................................................................................... + smull2 v1.4S, v7.8H, v23.8H // ......................*.................................................................................... + smlal v9.4S, v14.4H, v17.4H // .......................*................................................................................... + smlal2 v29.4S, v19.8H, v31.8H // ........................*.................................................................................. + smlal v11.4S, v19.4H, v31.4H // .........................*................................................................................. + smull v31.4S, v7.4H, v23.4H // ..........................*................................................................................ + smlal v9.4S, v15.4H, v16.4H // ...........................*............................................................................... + smull v10.4S, v7.4H, v22.4H // ............................*.............................................................................. + smlal2 v1.4S, v8.8H, v22.8H // .............................*............................................................................. + smlal v31.4S, v8.4H, v22.4H // ..............................*............................................................................ + ld2 {v4.8H, v5.8H}, [x4], #32 // ...............................*........................................................................... + ld2 {v23.8H, v24.8H}, [x11], #32 // .................................*......................................................................... + smlal2 v1.4S, v4.8H, v13.8H // ...................................*....................................................................... + smlal v31.4S, v4.4H, v13.4H // ....................................*...................................................................... + ld1 {v30.8H}, [x6], #16 // .....................................*..................................................................... + smlal2 v1.4S, v5.8H, v12.8H // .......................................*................................................................... + smlal v10.4S, v8.4H, v3.4H // ........................................*.................................................................. + smull2 v7.4S, v7.8H, v22.8H // .........................................*................................................................. + uzp1 v22.8H, v11.8H, v29.8H // ..........................................*................................................................ + smlal2 v6.4S, v14.8H, v17.8H // ...........................................*............................................................... + smlal v10.4S, v4.4H, v12.4H // ............................................*.............................................................. + smlal2 v7.4S, v8.8H, v3.8H // .............................................*............................................................. + ld2 {v13.8H, v14.8H}, [x7], #32 // ..............................................*............................................................ + mul v17.8H, v22.8H, v2.H[2] // ................................................*.......................................................... + smlal2 v7.4S, v4.8H, v12.8H // .................................................*......................................................... + smlal v10.4S, v5.4H, v30.4H // ..................................................*........................................................ + smlal2 v6.4S, v15.8H, v16.8H // ...................................................*....................................................... + smlal v11.4S, v17.4H, v0.4H // ....................................................*...................................................... + ld2 {v3.8H, v4.8H}, [x8], #32 // .....................................................*..................................................... + smlal2 v7.4S, v5.8H, v30.8H // .......................................................*................................................... + ld1 {v30.8H}, [x9], #16 // ........................................................*.................................................. + smlal v10.4S, v13.4H, v3.4H // ..........................................................*................................................ + smlal2 v7.4S, v13.8H, v3.8H // ...........................................................*............................................... + ld2 {v15.8H, v16.8H}, [x10], #32 // ............................................................*.............................................. + smlal v10.4S, v14.4H, v30.4H // ..............................................................*............................................ + smlal v9.4S, v27.4H, v21.4H // ...............................................................*........................................... + smlal2 v7.4S, v14.8H, v30.8H // ................................................................*.......................................... + smlal2 v6.4S, v27.8H, v21.8H // .................................................................*......................................... + smlal v10.4S, v15.4H, v23.4H // ..................................................................*........................................ + ld1 {v27.8H}, [x12], #16 // ...................................................................*....................................... + smlal2 v7.4S, v15.8H, v23.8H // .....................................................................*..................................... + smlal v31.4S, v5.4H, v12.4H // ......................................................................*.................................... + smlal2 v6.4S, v28.8H, v20.8H // .......................................................................*................................... + smlal v10.4S, v16.4H, v27.4H // ........................................................................*.................................. + smlal2 v7.4S, v16.8H, v27.8H // .........................................................................*................................. + smlal v31.4S, v13.4H, v4.4H // ..........................................................................*................................ + smlal2 v6.4S, v18.8H, v26.8H // ...........................................................................*............................... + smlal2 v1.4S, v13.8H, v4.8H // ............................................................................*.............................. + smlal v9.4S, v28.4H, v20.4H // .............................................................................*............................. + smlal v31.4S, v14.4H, v3.4H // ..............................................................................*............................ + uzp1 v13.8H, v10.8H, v7.8H // ...............................................................................*........................... + smlal2 v1.4S, v14.8H, v3.8H // ................................................................................*.......................... + smlal v9.4S, v18.4H, v26.4H // .................................................................................*......................... + smlal v31.4S, v15.4H, v24.4H // ..................................................................................*........................ + smlal2 v6.4S, v19.8H, v25.8H // ...................................................................................*....................... + smlal2 v1.4S, v15.8H, v24.8H // ....................................................................................*...................... + smlal v9.4S, v19.4H, v25.4H // .....................................................................................*..................... + smlal v31.4S, v16.4H, v23.4H // ......................................................................................*.................... + mul v13.8H, v13.8H, v2.H[2] // .......................................................................................*................... + smlal2 v1.4S, v16.8H, v23.8H // ........................................................................................*.................. + uzp1 v23.8H, v9.8H, v6.8H // .........................................................................................*................. + smlal2 v29.4S, v17.8H, v0.8H // ..........................................................................................*................ + mul v12.8H, v23.8H, v2.H[2] // ...........................................................................................*............... + uzp1 v4.8H, v31.8H, v1.8H // ............................................................................................*.............. + smlal v10.4S, v13.4H, v0.4H // .............................................................................................*............. + mul v23.8H, v4.8H, v2.H[2] // ..............................................................................................*............ + smlal v9.4S, v12.4H, v0.4H // ...............................................................................................*........... + smlal2 v7.4S, v13.8H, v0.8H // ................................................................................................*.......... + smlal2 v6.4S, v12.8H, v0.8H // .................................................................................................*......... + smlal v31.4S, v23.4H, v0.4H // ..................................................................................................*........ + smlal2 v1.4S, v23.8H, v0.8H // ...................................................................................................*....... + uzp2 v12.8H, v10.8H, v7.8H // ....................................................................................................*...... + uzp2 v25.8H, v9.8H, v6.8H // .....................................................................................................*..... + uzp2 v24.8H, v11.8H, v29.8H // ......................................................................................................*.... + uzp2 v13.8H, v31.8H, v1.8H // .......................................................................................................*... + st2 {v24.8H, v25.8H}, [x0], #32 // ........................................................................................................*.. + st2 {v12.8H, v13.8H}, [x0], #32 // ..........................................................................................................* + + // -------------------------------------------- cycle (expected) --------------------------------------------> // 0 25 50 75 100 - // |------------------------|------------------------|------------------------|------------------------|--- - // smlal v5.4S, v6.4H, v0.4H // *....................................................................................................... - // smlal v1.4S, v23.4H, v31.4H // .*...................................................................................................... - // ld1 {v27.8H}, [x3], #16 // ........................*............................................................................... - // uzp2 v18.8H, v5.8H, v21.8H // ......*................................................................................................. - // smlal v1.4S, v19.4H, v9.4H // .......*................................................................................................ - // sqdmulh v21.8H, v18.8H, v2.H[1] // ..........*............................................................................................. - // ld1 {v16.8H}, [x6], #16 // ............................*........................................................................... - // smlal v1.4S, v20.4H, v24.4H // ...........*............................................................................................ - // srshr v15.8H, v21.8H, #11 // ...........................................................................*............................ - // ld1 {v31.8H}, [x9], #16 // ........*............................................................................................... - // mls v18.8H, v15.8H, v2.H[0] // .............................................................................................*.......... - // ld2 {v3.8H, v4.8H}, [x1], #32 // ....................*................................................................................... - // ld2 {v9.8H, v10.8H}, [x2], #32 // ................*....................................................................................... - // ld1 {v24.8H}, [x12], #16 // ........................................................*............................................... - // smull2 v21.4S, v3.8H, v10.8H // ...............................*........................................................................ - // uzp1 v15.8H, v1.8H, v28.8H // .................................................*...................................................... - // smull v5.4S, v3.4H, v10.4H // ................................*....................................................................... - // mul v12.8H, v15.8H, v2.H[2] // .............................................................................*.......................... - // smlal2 v21.4S, v4.8H, v9.8H // ...................................*.................................................................... - // ld2 {v29.8H, v30.8H}, [x4], #32 // ............*........................................................................................... - // smlal v1.4S, v12.4H, v0.4H // .................................................................................*...................... - // smlal2 v28.4S, v12.8H, v0.8H // ..................................................................................*..................... - // ld2 {v22.8H, v23.8H}, [x7], #32 // ..................................................*..................................................... - // uzp2 v17.8H, v1.8H, v28.8H // .......................................................................................*................ - // smull v1.4S, v3.4H, v9.4H // ...........................*............................................................................ - // smull2 v28.4S, v3.8H, v9.8H // ..........................*............................................................................. - // smlal v5.4S, v4.4H, v9.4H // ....................................*................................................................... - // smlal2 v21.4S, v29.8H, v8.8H // ......................................................*................................................. - // smlal v1.4S, v4.4H, v27.4H // .................................*...................................................................... - // smlal2 v28.4S, v4.8H, v27.8H // ..............................*......................................................................... - // smlal v5.4S, v29.4H, v8.4H // .........................................*.............................................................. - // smlal2 v21.4S, v30.8H, v7.8H // ..........................................................*............................................. - // smlal v1.4S, v29.4H, v7.4H // ................................................*....................................................... - // smlal2 v28.4S, v29.8H, v7.8H // ..................................*..................................................................... - // ld2 {v12.8H, v13.8H}, [x8], #32 // ..*..................................................................................................... - // smlal v1.4S, v30.4H, v16.4H // .......................................................*................................................ - // smlal2 v28.4S, v30.8H, v16.8H // ..........................................*............................................................. - // smlal v5.4S, v30.4H, v7.4H // ...............................................*........................................................ - // smlal2 v21.4S, v22.8H, v13.8H // ..............................................................*......................................... - // ld2 {v9.8H, v10.8H}, [x11], #32 // .....................................*.................................................................. - // smlal2 v21.4S, v23.8H, v12.8H // ..................................................................*..................................... - // smlal v5.4S, v22.4H, v13.4H // .............................................................*.......................................... - // ld2 {v19.8H, v20.8H}, [x10], #32 // ...........................................*............................................................ - // smlal v5.4S, v23.4H, v12.4H // .................................................................*...................................... - // smlal2 v28.4S, v22.8H, v12.8H // ............................................................*........................................... - // smlal2 v21.4S, v19.8H, v10.8H // ......................................................................*................................. - // sqdmulh v14.8H, v17.8H, v2.H[1] // .........................................................................................*.............. - // smlal v5.4S, v19.4H, v10.4H // .....................................................................*.................................. - // smlal2 v28.4S, v23.8H, v31.8H // ................................................................*....................................... - // smlal2 v21.4S, v20.8H, v9.8H // ..........................................................................*............................. - // srshr v6.8H, v14.8H, #11 // ..............................................................................................*......... - // smlal v5.4S, v20.4H, v9.4H // .........................................................................*.............................. - // smlal2 v28.4S, v19.8H, v9.8H // ....................................................................*................................... - // smlal v1.4S, v22.4H, v12.4H // ...........................................................*............................................ - // mls v17.8H, v6.8H, v2.H[0] // .................................................................................................*...... - // uzp1 v12.8H, v5.8H, v21.8H // ..............................................................................*......................... - // smlal2 v28.4S, v20.8H, v24.8H // ........................................................................*............................... - // mul v6.8H, v12.8H, v2.H[2] // ................................................................................*....................... - // smlal2 v21.4S, v6.8H, v0.8H // ......................................................................................*................. - // st2 {v17.8H, v18.8H}, [x0], #32 // .....................................................................................................*.. - // smlal v5.4S, v6.4H, v0.4H // .....................................................................................*.................. - // smlal v1.4S, v23.4H, v31.4H // ...............................................................*........................................ - // uzp2 v18.8H, v5.8H, v21.8H // ..........................................................................................*............. - // smlal v1.4S, v19.4H, v9.4H // ...................................................................*.................................... - // sqdmulh v21.8H, v18.8H, v2.H[1] // ............................................................................................*........... - // smlal v1.4S, v20.4H, v24.4H // .......................................................................*................................ - // srshr v15.8H, v21.8H, #11 // ................................................................................................*....... - // mls v18.8H, v15.8H, v2.H[0] // ...................................................................................................*.... - // uzp1 v15.8H, v1.8H, v28.8H // ............................................................................*........................... - // mul v12.8H, v15.8H, v2.H[2] // ...............................................................................*........................ - // smlal v1.4S, v12.4H, v0.4H // ....................................................................................*................... - // smlal2 v28.4S, v12.8H, v0.8H // ...................................................................................*.................... - // uzp2 v17.8H, v1.8H, v28.8H // ........................................................................................*............... - // sqdmulh v14.8H, v17.8H, v2.H[1] // ...........................................................................................*............ - // srshr v6.8H, v14.8H, #11 // ...............................................................................................*........ - // mls v17.8H, v6.8H, v2.H[0] // ..................................................................................................*..... - // st2 {v17.8H, v18.8H}, [x0], #32 // .......................................................................................................* + // |------------------------|------------------------|------------------------|------------------------|------ + // ld2 {v13.8H, v14.8H}, [x4], #32 // *.......................................................................................................... + // ld1 {v15.8H}, [x6], #16 // ..*........................................................................................................ + // smlal2 v29.4S, v13.8H, v16.8H // ....*...................................................................................................... + // smlal v9.4S, v13.4H, v17.4H // .......................*................................................................................... + // smlal2 v6.4S, v13.8H, v17.8H // ...........................................*............................................................... + // smlal v11.4S, v13.4H, v16.4H // .....*..................................................................................................... + // smlal2 v29.4S, v14.8H, v15.8H // ........*.................................................................................................. + // smlal v9.4S, v14.4H, v16.4H // ...........................*............................................................................... + // smlal2 v6.4S, v14.8H, v16.8H // ...................................................*....................................................... + // ld1 {v30.8H}, [x9], #16 // ..........*................................................................................................ + // smlal v9.4S, v27.4H, v21.4H // ...............................................................*........................................... + // smlal2 v6.4S, v27.8H, v21.8H // .................................................................*......................................... + // smlal v11.4S, v14.4H, v15.4H // .........*................................................................................................. + // smlal2 v29.4S, v27.8H, v20.8H // ............*.............................................................................................. + // smlal v9.4S, v28.4H, v20.4H // .............................................................................*............................. + // smlal2 v6.4S, v28.8H, v20.8H // .......................................................................*................................... + // smlal v11.4S, v27.4H, v20.4H // .............*............................................................................................. + // smlal2 v29.4S, v28.8H, v30.8H // ................*.......................................................................................... + // smlal v9.4S, v18.4H, v26.4H // .................................................................................*......................... + // smlal2 v6.4S, v18.8H, v26.8H // ...........................................................................*............................... + // smlal v11.4S, v28.4H, v30.4H // .................*......................................................................................... + // smlal2 v29.4S, v18.8H, v25.8H // ....................*...................................................................................... + // smlal v9.4S, v19.4H, v25.4H // .....................................................................................*..................... + // smlal2 v6.4S, v19.8H, v25.8H // ...................................................................................*....................... + // ld1 {v23.8H}, [x12], #16 // ..................*........................................................................................ + // smlal v11.4S, v18.4H, v25.4H // .....................*..................................................................................... + // uzp1 v14.8H, v9.8H, v6.8H // .........................................................................................*................. + // smlal2 v29.4S, v19.8H, v23.8H // ........................*.................................................................................. + // mul v27.8H, v14.8H, v2.H[2] // ...........................................................................................*............... + // smlal v11.4S, v19.4H, v23.4H // .........................*................................................................................. + // ld2 {v4.8H, v5.8H}, [x2], #32 // ..............*............................................................................................ + // smlal v9.4S, v27.4H, v0.4H // ...............................................................................................*........... + // smlal2 v6.4S, v27.8H, v0.8H // .................................................................................................*......... + // ld2 {v27.8H, v28.8H}, [x7], #32 // ..............................................*............................................................ + // uzp1 v13.8H, v11.8H, v29.8H // ..........................................*................................................................ + // uzp2 v15.8H, v9.8H, v6.8H // .....................................................................................................*..... + // mul v13.8H, v13.8H, v2.H[2] // ................................................*.......................................................... + // ld2 {v18.8H, v19.8H}, [x10], #32 // ............................................................*.............................................. + // smull v9.4S, v7.4H, v5.4H // ..........................*................................................................................ + // smlal v11.4S, v13.4H, v0.4H // ....................................................*...................................................... + // smlal2 v29.4S, v13.8H, v0.8H // ..........................................................................................*................ + // ld2 {v20.8H, v21.8H}, [x8], #32 // .....................................................*..................................................... + // smlal v9.4S, v8.4H, v4.4H // ..............................*............................................................................ + // uzp2 v14.8H, v11.8H, v29.8H // ......................................................................................................*.... + // smull2 v29.4S, v7.8H, v4.8H // .........................................*................................................................. + // smull2 v6.4S, v7.8H, v5.8H // ......................*.................................................................................... + // ld2 {v25.8H, v26.8H}, [x11], #32 // .................................*......................................................................... + // smull v11.4S, v7.4H, v4.4H // ............................*.............................................................................. + // smlal2 v6.4S, v8.8H, v4.8H // .............................*............................................................................. + // smlal2 v29.4S, v8.8H, v3.8H // .............................................*............................................................. + // ld2 {v16.8H, v17.8H}, [x5], #32 // ......*.................................................................................................... + // smlal v11.4S, v8.4H, v3.4H // ........................................*.................................................................. + // st2 {v14.8H, v15.8H}, [x0], #32 // ........................................................................................................*.. + // ld2 {v13.8H, v14.8H}, [x4], #32 // ...............................*........................................................................... + // ld1 {v15.8H}, [x6], #16 // .....................................*..................................................................... + // smlal2 v29.4S, v13.8H, v16.8H // .................................................*......................................................... + // smlal v9.4S, v13.4H, v17.4H // ....................................*...................................................................... + // smlal2 v6.4S, v13.8H, v17.8H // ...................................*....................................................................... + // smlal v11.4S, v13.4H, v16.4H // ............................................*.............................................................. + // smlal2 v29.4S, v14.8H, v15.8H // .......................................................*................................................... + // smlal v9.4S, v14.4H, v16.4H // ......................................................................*.................................... + // smlal2 v6.4S, v14.8H, v16.8H // .......................................*................................................................... + // ld1 {v30.8H}, [x9], #16 // ........................................................*.................................................. + // smlal v9.4S, v27.4H, v21.4H // ..........................................................................*................................ + // smlal2 v6.4S, v27.8H, v21.8H // ............................................................................*.............................. + // smlal v11.4S, v14.4H, v15.4H // ..................................................*........................................................ + // smlal2 v29.4S, v27.8H, v20.8H // ...........................................................*............................................... + // smlal v9.4S, v28.4H, v20.4H // ..............................................................................*............................ + // smlal2 v6.4S, v28.8H, v20.8H // ................................................................................*.......................... + // smlal v11.4S, v27.4H, v20.4H // ..........................................................*................................................ + // smlal2 v29.4S, v28.8H, v30.8H // ................................................................*.......................................... + // smlal v9.4S, v18.4H, v26.4H // ..................................................................................*........................ + // smlal2 v6.4S, v18.8H, v26.8H // ....................................................................................*...................... + // smlal v11.4S, v28.4H, v30.4H // ..............................................................*............................................ + // smlal2 v29.4S, v18.8H, v25.8H // .....................................................................*..................................... + // smlal v9.4S, v19.4H, v25.4H // ......................................................................................*.................... + // smlal2 v6.4S, v19.8H, v25.8H // ........................................................................................*.................. + // ld1 {v23.8H}, [x12], #16 // ...................................................................*....................................... + // smlal v11.4S, v18.4H, v25.4H // ..................................................................*........................................ + // uzp1 v14.8H, v9.8H, v6.8H // ............................................................................................*.............. + // smlal2 v29.4S, v19.8H, v23.8H // .........................................................................*................................. + // mul v27.8H, v14.8H, v2.H[2] // ..............................................................................................*............ + // smlal v11.4S, v19.4H, v23.4H // ........................................................................*.................................. + // smlal v9.4S, v27.4H, v0.4H // ..................................................................................................*........ + // smlal2 v6.4S, v27.8H, v0.8H // ...................................................................................................*....... + // uzp1 v13.8H, v11.8H, v29.8H // ...............................................................................*........................... + // uzp2 v15.8H, v9.8H, v6.8H // .......................................................................................................*... + // mul v13.8H, v13.8H, v2.H[2] // .......................................................................................*................... + // smlal v11.4S, v13.4H, v0.4H // .............................................................................................*............. + // smlal2 v29.4S, v13.8H, v0.8H // ................................................................................................*.......... + // uzp2 v14.8H, v11.8H, v29.8H // ....................................................................................................*...... + // st2 {v14.8H, v15.8H}, [x0], #32 // ..........................................................................................................* pop_stack diff --git a/mlkem/native/aarch64/profiles/clean.h b/mlkem/native/aarch64/profiles/clean.h index 596f478c3..c62efc562 100644 --- a/mlkem/native/aarch64/profiles/clean.h +++ b/mlkem/native/aarch64/profiles/clean.h @@ -20,8 +20,10 @@ #define MLKEM_USE_NATIVE_POLY_TOBYTES #define MLKEM_USE_NATIVE_REJ_UNIFORM +#define NTT_BOUND_NATIVE (6 * KYBER_Q) static inline void ntt_native(poly *data) { ntt_asm_clean(data->coeffs); } +#define INVNTT_BOUND_NATIVE (8 * KYBER_Q) static inline void intt_native(poly *data) { intt_asm_clean(data->coeffs); } static inline void poly_reduce_native(poly *data) { diff --git a/mlkem/native/aarch64/profiles/opt.h b/mlkem/native/aarch64/profiles/opt.h index fe75275f1..f90b5b298 100644 --- a/mlkem/native/aarch64/profiles/opt.h +++ b/mlkem/native/aarch64/profiles/opt.h @@ -20,8 +20,10 @@ #define MLKEM_USE_NATIVE_POLY_TOBYTES #define MLKEM_USE_NATIVE_REJ_UNIFORM +#define NTT_BOUND_NATIVE (6 * KYBER_Q) static inline void ntt_native(poly *data) { ntt_asm_opt(data->coeffs); } +#define INVNTT_BOUND_NATIVE (8 * KYBER_Q) static inline void intt_native(poly *data) { intt_asm_opt(data->coeffs); } static inline void poly_reduce_native(poly *data) { diff --git a/mlkem/native/x86_64/profiles/default.h b/mlkem/native/x86_64/profiles/default.h index 5c59e421e..a6669b0d9 100644 --- a/mlkem/native/x86_64/profiles/default.h +++ b/mlkem/native/x86_64/profiles/default.h @@ -17,6 +17,9 @@ #define MLKEM_USE_NATIVE_NTT #define MLKEM_USE_NATIVE_INTT +#define INVNTT_BOUND_NATIVE (KYBER_Q + 1) // poly_reduce() is in [0,..,KYBER_Q] +#define NTT_BOUND_NATIVE (KYBER_Q + 1) // poly_reduce() is in [0,..,KYBER_Q] + static inline int rej_uniform_native(int16_t *r, unsigned int len, const uint8_t *buf, unsigned int buflen) { // AVX2 implementation assumes specific buffer lengths @@ -31,12 +34,18 @@ static inline void ntt_native(poly *data) { ntt_avx2((__m256i *)data, qdata.vec); nttpack_avx2((__m256i *)(data->coeffs), qdata.vec); nttpack_avx2((__m256i *)(data->coeffs + KYBER_N / 2), qdata.vec); + + // TODO! Remove this after working out the bounds for + // the output of the AVX2 NTT poly_reduce(data); } static inline void intt_native(poly *data) { nttunpack_avx2((__m256i *)(data->coeffs), qdata.vec); invntt_avx2((__m256i *)data, qdata.vec); + + // TODO! Remove this after working out the bounds for + // the output of the AVX2 invNTT poly_reduce(data); } diff --git a/mlkem/ntt.c b/mlkem/ntt.c index 20b6dcbf4..a308fe4f1 100644 --- a/mlkem/ntt.c +++ b/mlkem/ntt.c @@ -5,6 +5,7 @@ #include "reduce.h" #include "arith_native.h" +#include "debug/debug.h" /* Code to generate zetas and zetas_inv used in the number-theoretic transform: @@ -57,21 +58,51 @@ const int16_t zetas[128] = { * Name: poly_ntt * * Description: Computes negacyclic number-theoretic transform (NTT) of - * a polynomial in place; - * inputs assumed to be in normal order, output in bitreversed - *order + * a polynomial in place. + * + * The input is assumed to be in normal order and + * coefficient-wise bound by KYBER_Q in absolute value. + * + * The output polynomial is in bitreversed order, and + * coefficient-wise bound by NTT_BOUND in absolute value. + * + * (NOTE: Sometimes the input to the NTT is actually smaller, + * which gives better bounds.) * * Arguments: - poly *p: pointer to in/output polynomial **************************************************/ #if !defined(MLKEM_USE_NATIVE_NTT) + +// Check that the specific bound for the reference NTT implies +// the bound required by the C<->Native interface. +#define NTT_BOUND_REF (5 * KYBER_Q) +STATIC_ASSERT(NTT_BOUND_REF <= NTT_BOUND, ntt_ref_bound) + // REF-CHANGE: Removed indirection poly_ntt -> ntt() // and integrated polynomial reduction into the NTT. void poly_ntt(poly *p) { + POLY_BOUND_MSG(p, KYBER_Q, "ref ntt input"); + unsigned int len, start, j, k; int16_t t, zeta; int16_t *r = p->coeffs; k = 1; + + // Bounds reasoning: + // - There are 7 layers + // - When passing from layer N to layer N+1, each layer-N value + // is modified through the addition/subtraction of a Montgomery + // product of a twiddle of absolute value < q/2 and a layer-N value. + // - Recalling that |fqmul(a,t)| < q * (0.0254*C + 1/2) for + // |a| < C*q and |t|= 2; len >>= 1) { for (start = 0; start < 256; start = j + len) { zeta = zetas[k++]; @@ -83,10 +114,19 @@ void poly_ntt(poly *p) { } } - poly_reduce(p); + // Check the stronger bound + POLY_BOUND_MSG(p, NTT_BOUND_REF, "ref ntt output"); } #else /* MLKEM_USE_NATIVE_NTT */ -void poly_ntt(poly *p) { ntt_native(p); } + +// Check that bound for native NTT implies contractual bound +STATIC_ASSERT(NTT_BOUND_NATIVE <= NTT_BOUND, invntt_bound) + +void poly_ntt(poly *p) { + POLY_BOUND_MSG(p, KYBER_Q, "native ntt input"); + ntt_native(p); + POLY_BOUND_MSG(p, NTT_BOUND_NATIVE, "native ntt output"); +} #endif /* MLKEM_USE_NATIVE_NTT */ /************************************************* @@ -95,37 +135,60 @@ void poly_ntt(poly *p) { ntt_native(p); } * Description: Computes inverse of negacyclic number-theoretic transform (NTT) * of a polynomial in place; * inputs assumed to be in bitreversed order, output in normal - *order + * order + * + * The input is assumed to be in bitreversed order, and can + * have arbitrary coefficients in int16_t. + * + * The output polynomial is in normal order, and + * coefficient-wise bound by INVNTT_BOUND in absolute value. * * Arguments: - uint16_t *a: pointer to in/output polynomial **************************************************/ #if !defined(MLKEM_USE_NATIVE_INTT) + +// Check that bound for reference invNTT implies contractual bound +#define INVNTT_BOUND_REF (3 * KYBER_Q / 4) +STATIC_ASSERT(INVNTT_BOUND_REF <= INVNTT_BOUND, invntt_bound) + // REF-CHANGE: Removed indirection poly_invntt_tomont -> invntt() +// REF-CHANGE: Moved scalar multiplication with f ahead of the core invNTT void poly_invntt_tomont(poly *p) { unsigned int start, len, j, k; int16_t t, zeta; const int16_t f = 1441; // mont^2/128 int16_t *r = p->coeffs; + for (j = 0; j < 256; j++) { + r[j] = fqmul(r[j], f); + } + + POLY_BOUND(p, (3 * KYBER_Q) / 4); + k = 127; for (len = 2; len <= 128; len <<= 1) { for (start = 0; start < 256; start = j + len) { zeta = zetas[k--]; for (j = start; j < start + len; j++) { t = r[j]; - r[j] = barrett_reduce(t + r[j + len]); + r[j] = barrett_reduce(t + r[j + len]); // abs < q/2 r[j + len] = r[j + len] - t; - r[j + len] = fqmul(zeta, r[j + len]); + r[j + len] = fqmul(zeta, r[j + len]); // abs < 3/4 q } } } - for (j = 0; j < 256; j++) { - r[j] = fqmul(r[j], f); - } + POLY_BOUND_MSG(p, INVNTT_BOUND_REF, "ref intt output"); } #else /* MLKEM_USE_NATIVE_INTT */ -void poly_invntt_tomont(poly *p) { intt_native(p); } + +// Check that bound for native invNTT implies contractual bound +STATIC_ASSERT(INVNTT_BOUND_NATIVE <= INVNTT_BOUND, invntt_bound) + +void poly_invntt_tomont(poly *p) { + intt_native(p); + POLY_BOUND_MSG(p, INVNTT_BOUND_NATIVE, "native intt output"); +} #endif /* MLKEM_USE_NATIVE_INTT */ /************************************************* @@ -134,6 +197,10 @@ void poly_invntt_tomont(poly *p) { intt_native(p); } * Description: Multiplication of polynomials in Zq[X]/(X^2-zeta) * used for multiplication of elements in Rq in NTT domain * + * Bounds: + * - a is assumed to be < q in absolute value. + * - Return value < 3/2 q in absolute value + * * Arguments: - int16_t r[2]: pointer to the output polynomial * - const int16_t a[2]: pointer to the first factor * - const int16_t b[2]: pointer to the second factor @@ -141,11 +208,19 @@ void poly_invntt_tomont(poly *p) { intt_native(p); } **************************************************/ void basemul_cached(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t b_cached) { + BOUND(a, 2, KYBER_Q, "basemul input bound"); + int32_t t0, t1; + t0 = (int32_t)a[1] * b_cached; t0 += (int32_t)a[0] * b[0]; t1 = (int32_t)a[0] * b[1]; t1 += (int32_t)a[1] * b[0]; + + // |ti| < 2 * q * 2^15 r[0] = montgomery_reduce(t0); r[1] = montgomery_reduce(t1); + + // |r[i]| < 3/2 q + BOUND(r, 2, 3 * KYBER_Q / 2, "basemul output bound"); } diff --git a/mlkem/ntt.h b/mlkem/ntt.h index 917e3a050..229e09385 100644 --- a/mlkem/ntt.h +++ b/mlkem/ntt.h @@ -6,6 +6,8 @@ #include "params.h" #include "poly.h" +#include "arith_native.h" + #define zetas KYBER_NAMESPACE(zetas) extern const int16_t zetas[128]; @@ -15,8 +17,15 @@ void poly_ntt(poly *r); #define invntt KYBER_NAMESPACE(invntt) void poly_invntt_tomont(poly *r); +// Absolute exclusive upper bound for the output of the inverse NTT +#define INVNTT_BOUND 8 * KYBER_Q + +// Absolute exclusive upper bound for the output of the forward NTT +#define NTT_BOUND 8 * KYBER_Q + #define basemul_cached KYBER_NAMESPACE(basemul_cached) void basemul_cached(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t b_cached); + #endif diff --git a/mlkem/poly.c b/mlkem/poly.c index 8fd979542..4de145532 100644 --- a/mlkem/poly.c +++ b/mlkem/poly.c @@ -12,6 +12,7 @@ #include "verify.h" #include "arith_native.h" +#include "debug/debug.h" /************************************************* * Name: poly_compress @@ -271,6 +272,8 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) { cmov_int16(r->coeffs + 8 * i + j, ((KYBER_Q + 1) / 2), (msg[i] >> j) & 1); } } + + POLY_BOUND_MSG(r, KYBER_Q, "poly_frommsg output"); } /************************************************* @@ -332,6 +335,11 @@ void poly_getnoise_eta1_4x(poly *r0, poly *r1, poly *r2, poly *r3, poly_cbd_eta1(r1, buf[1]); poly_cbd_eta1(r2, buf[2]); poly_cbd_eta1(r3, buf[3]); + + POLY_BOUND_MSG(r0, KYBER_ETA1 + 1, "poly_getnoise_eta1_4x output 0"); + POLY_BOUND_MSG(r1, KYBER_ETA1 + 1, "poly_getnoise_eta1_4x output 1"); + POLY_BOUND_MSG(r2, KYBER_ETA1 + 1, "poly_getnoise_eta1_4x output 2"); + POLY_BOUND_MSG(r3, KYBER_ETA1 + 1, "poly_getnoise_eta1_4x output 3"); } /************************************************* @@ -351,6 +359,8 @@ void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t buf[KYBER_ETA2 * KYBER_N / 4] ALIGN; prf(buf, sizeof(buf), seed, nonce); poly_cbd_eta2(r, buf); + + POLY_BOUND_MSG(r, KYBER_ETA1 + 1, "poly_getnoise_eta2 output"); } /************************************************* @@ -384,6 +394,11 @@ void poly_getnoise_eta2_4x(poly *r0, poly *r1, poly *r2, poly *r3, poly_cbd_eta2(r1, buf[1]); poly_cbd_eta2(r2, buf[2]); poly_cbd_eta2(r3, buf[3]); + + POLY_BOUND_MSG(r0, KYBER_ETA2 + 1, "poly_getnoise_eta2_4x output 0"); + POLY_BOUND_MSG(r1, KYBER_ETA2 + 1, "poly_getnoise_eta2_4x output 1"); + POLY_BOUND_MSG(r2, KYBER_ETA2 + 1, "poly_getnoise_eta2_4x output 2"); + POLY_BOUND_MSG(r3, KYBER_ETA2 + 1, "poly_getnoise_eta2_4x output 3"); } /************************************************* @@ -428,6 +443,11 @@ void poly_getnoise_eta1122_4x(poly *r0, poly *r1, poly *r2, poly *r3, poly_cbd_eta1(r1, buf1[1]); poly_cbd_eta2(r2, buf2[0]); poly_cbd_eta2(r3, buf2[1]); + + POLY_BOUND_MSG(r0, KYBER_ETA1 + 1, "poly_getnoise_eta1122_4x output 0"); + POLY_BOUND_MSG(r1, KYBER_ETA1 + 1, "poly_getnoise_eta1122_4x output 1"); + POLY_BOUND_MSG(r2, KYBER_ETA2 + 1, "poly_getnoise_eta1122_4x output 2"); + POLY_BOUND_MSG(r3, KYBER_ETA2 + 1, "poly_getnoise_eta1122_4x output 3"); } /************************************************* @@ -436,6 +456,14 @@ void poly_getnoise_eta1122_4x(poly *r0, poly *r1, poly *r2, poly *r3, * Description: Multiplication of two polynomials in NTT domain, * using mulcache for second operand. * + * Bounds: + * - a is assumed to be coefficient-wise < q in absolute value. + * - b is assumed to be the output of a forward NTT and + * thus coefficient-wise bound by C + * - b_cache is assumed to be coefficient-wise bound by D. + * + * The result is coefficient-wise bound by 3/2 q in absolute value. + * * Arguments: - poly *r: pointer to output polynomial * - const poly *a: pointer to first input polynomial * - const poly *b: pointer to second input polynomial @@ -460,18 +488,25 @@ void poly_basemul_montgomery_cached(poly *r, const poly *a, const poly *b, * Description: Inplace conversion of all coefficients of a polynomial * from normal domain to Montgomery domain * + * Bounds: Output < q in absolute value. + * * Arguments: - poly *r: pointer to input/output polynomial **************************************************/ #if !defined(MLKEM_USE_NATIVE_POLY_TOMONT) void poly_tomont(poly *r) { unsigned int i; - const int16_t f = (1ULL << 32) % KYBER_Q; + const int16_t f = (1ULL << 32) % KYBER_Q; // 1353 for (i = 0; i < KYBER_N; i++) { r->coeffs[i] = montgomery_reduce((int32_t)r->coeffs[i] * f); } + + POLY_BOUND(r, KYBER_Q); } #else /* MLKEM_USE_NATIVE_POLY_TOMONT */ -void poly_tomont(poly *r) { poly_tomont_native(r); } +void poly_tomont(poly *r) { + poly_tomont_native(r); + POLY_BOUND(r, KYBER_Q); +} #endif /* MLKEM_USE_NATIVE_POLY_TOMONT */ /************************************************* @@ -532,6 +567,9 @@ void poly_sub(poly *r, const poly *a, const poly *b) { * base multiplications of polynomials * in NTT domain. * + * The coefficients in the mulcache must be + * bound by KYBER_Q in absolute value. + * * Arguments: - poly_mulcache *x: pointer to output cache. * - const poly *a: pointer to input polynomial **************************************************/ @@ -542,9 +580,12 @@ void poly_mulcache_compute(poly_mulcache *x, const poly *a) { x->coeffs[2 * i + 0] = fqmul(a->coeffs[4 * i + 1], zetas[64 + i]); x->coeffs[2 * i + 1] = fqmul(a->coeffs[4 * i + 3], -zetas[64 + i]); } + + POLY_BOUND(x, KYBER_Q); } #else /* MLKEM_USE_NATIVE_POLY_MULCACHE_COMPUTE */ void poly_mulcache_compute(poly_mulcache *x, const poly *a) { poly_mulcache_compute_native(x, a); + POLY_BOUND(x, KYBER_Q); } #endif /* MLKEM_USE_NATIVE_POLY_MULCACHE_COMPUTE */ diff --git a/mlkem/polyvec.c b/mlkem/polyvec.c index 8ec5b5f25..97235902c 100644 --- a/mlkem/polyvec.c +++ b/mlkem/polyvec.c @@ -6,6 +6,8 @@ #include "ntt.h" #include "params.h" #include "poly.h" + +#include "debug/debug.h" /************************************************* * Name: polyvec_compress * @@ -204,14 +206,26 @@ void polyvec_invntt_tomont(polyvec *r) { * Description: Multiply elements of a and b in NTT domain, accumulate into r, * and multiply by 2^-16. * + * Bounds: + * - a is assumed to be coefficient-wise < q in absolute value. + * - b is assumed to be the output of a forward NTT and + * thus coefficient-wise bound by NTT_BOUND + * - b_cache is assumed to be coefficient-wise bound by + * KYBER_Q. + * * Arguments: - poly *r: pointer to output polynomial * - const polyvec *a: pointer to first input vector of polynomials * - const polyvec *b: pointer to second input vector of polynomials + * - const polyvec_mulcache *b_cache: mulcache for b **************************************************/ #if !defined(MLKEM_USE_NATIVE_POLYVEC_BASEMUL_ACC_MONTGOMERY_CACHED) void polyvec_basemul_acc_montgomery_cached(poly *r, const polyvec *a, const polyvec *b, const polyvec_mulcache *b_cache) { + POLYVEC_BOUND(a, KYBER_Q); + POLYVEC_BOUND(b, NTT_BOUND); + POLYVEC_BOUND(b_cache, KYBER_Q); + unsigned int i; poly t; @@ -220,14 +234,18 @@ void polyvec_basemul_acc_montgomery_cached(poly *r, const polyvec *a, poly_basemul_montgomery_cached(&t, &a->vec[i], &b->vec[i], &b_cache->vec[i]); poly_add(r, r, &t); + // abs bounds: < (i+1) * 3/2 * q } - poly_reduce(r); + // abs bounds: < KYBER_K * 3/2 * q <= 4 * 3/2 * q = 19974 } #else /* !MLKEM_USE_NATIVE_POLYVEC_BASEMUL_ACC_MONTGOMERY_CACHED */ void polyvec_basemul_acc_montgomery_cached(poly *r, const polyvec *a, const polyvec *b, const polyvec_mulcache *b_cache) { + POLYVEC_BOUND(a, KYBER_Q); + POLYVEC_BOUND(b, NTT_BOUND); + POLYVEC_BOUND(b_cache, KYBER_Q); polyvec_basemul_acc_montgomery_cached_native(r, a, b, b_cache); } #endif /* MLKEM_USE_NATIVE_POLYVEC_BASEMUL_ACC_MONTGOMERY_CACHED */ diff --git a/mlkem/reduce.c b/mlkem/reduce.c index 5e4129811..13b7bb3d7 100644 --- a/mlkem/reduce.c +++ b/mlkem/reduce.c @@ -9,15 +9,48 @@ * Description: Montgomery reduction; given a 32-bit integer a, computes * 16-bit integer congruent to a * R^-1 mod q, where R=2^16 * - * Arguments: - int32_t a: input integer to be reduced; - * has to be in {-q2^15,...,q2^15-1} + * Arguments: - int32_t a: input integer to be reduced * - * Returns: integer in {-q+1,...,q-1} congruent to a * R^-1 modulo q. + * Returns: integer congruent to a * R^-1 modulo q + * + * Bounds: For any C such that |a| < q * C, the return value + * has absolute value < q (C/2^16 + 1/2). + * + * Notable special cases: + * - The Montgomery multiplication of a value of absolute value + * < q * C with a signed-canonical value ( < q/2 ) has + * absolute value q * (0.0254 * C + 1/2). + * - The Montgomery multiplication of a value of absolute value + * < q * C with a value t of |t| < q has absolute value + * < q * (0.0508 * C + 1/2). + * - The Montgomery multiplication of a value of absolute value + * < C with a value of abs < q has absolute value + * < q (C/2^16 + 1/2). **************************************************/ int16_t montgomery_reduce(int32_t a) { - int16_t t; + // Bounds on paper + // + // - Case |a| < q * C, for some C + // + // |t| <= |a|/2^16 + |t|*q/2^16 + // < q * C / 2^16 + q/2 + // = q (C/2^16 + 1/2) + // + // - Case |a| < (q/2) * C * q, for some C + // + // Replace C -> C * q in the above and estimate + // q / 2^17 < 0.0254. - t = (int16_t)a * QINV; + uint16_t u; + int16_t t; + // Compute a*q^{-1} mod 2^16 in unsigned representatives + u = (uint16_t)a * QINV; + // Lift to signed canonical representative mod 2^16. + // PORTABILITY: This relies on uint16_t -> int16_t + // being implemented as the inverse of int16_t -> uint16_t, + // which is not mandated by the standard. + t = (int16_t)u; + // By construction, the LHS is divisible by 2^16 t = (a - (int32_t)t * KYBER_Q) >> 16; return t; } diff --git a/mlkem/reduce.h b/mlkem/reduce.h index 793e5dd5d..9700c5fb4 100644 --- a/mlkem/reduce.h +++ b/mlkem/reduce.h @@ -23,6 +23,11 @@ int16_t barrett_reduce(int16_t a); * - int16_t b: second factor * * Returns 16-bit integer congruent to a*b*R^{-1} mod q + * + * If one input is < |q|/2 in absolute value (which is given + * in the common case of multiplication with constants), the + * return value is < |q| in absolute value. + * **************************************************/ static inline int16_t fqmul(int16_t a, int16_t b) { return montgomery_reduce((int32_t)a * b); diff --git a/test/test_bounds.py b/test/test_bounds.py new file mode 100644 index 000000000..916089444 --- /dev/null +++ b/test/test_bounds.py @@ -0,0 +1,161 @@ +# SPDX-License-Identifier: Apache-2.0 + +# +# The purpose of this script is to provide either brute-force proof +# or empirical evidence to arithmetic bounds for the modular +# arithmetic primitives used in this repository. +# + +import random +from functools import lru_cache + +# Global constants +R = 2**16 +Q = 3329 +Qinv = pow(-Q, -1, R) + +# +# Barrett multiplication via doubling +# + +def round_even(x): + return 2*round(x/2) + +@lru_cache(maxsize=None) +def barrett_twiddle(b): + """Compute twiddle required for Barrett multiplications + via doubling-high-multiply.""" + return round_even(b * R / Q) // 2 + +def sqrdmulh_i16(a,b): + """Doubling multiply high with rouding""" + # We cannot use round() here because of its behaviour + # on multiples of 0.5: round(-.5) = round(0.5) = 0 + return ((2 * a * b + 2**15) // 2**16) + +def barmul(a, b): + """Compute doubling Barrett multiplication of a and b""" + b_twiddle = barrett_twiddle(b) + return a * b - Q * sqrdmulh_i16(a, b_twiddle) + +# +# Montgomery multiplication +# + +def lift_signed_i16(x): + """Returns signed canonical representative modulo R=2^16.""" + x = x % R + if x >= R//2: + x -= R + return x + +@lru_cache(maxsize=None) +def montmul_neg_twiddle(b): + return (b * Qinv) % R + +def montmul_neg(a, b): + b_twiddle = montmul_neg_twiddle(b) + return (a * b + Q * lift_signed_i16(a * b_twiddle)) // R + +# +# Generic test functions +# + +def test_all_i16(f): + for a in range(-R//2, R//2): + if a % 1000 == 0: + print(f"{a} ...") + for b in range(-Q//2,Q//2): + f(a,b) + f(-a,b) + +def test_random(f,num_tests=10000000, bound=2*R): + print(f"Randomly checking Barrett<->Montgomery relation ({num_tests} tests)...") + for i in range(num_tests): + if i % 100000 == 0: + print(f"... run {i} tests ({((i * 1000) // num_tests)/10}%)") + a = random.randrange(-bound, bound) + b = random.randrange(-bound, bound) + f(a,b) + +# +# Test relation between Barrett and Montgomery multiplication +# (Proposition 1 in https://eprint.iacr.org/2021/986.pdf) +# + +@lru_cache(maxsize=None) +def modq_even(a): + return a - Q * round_even(a/Q) + +def barmul_test(a,b): + bp = modq_even(b * R) + r0 = barmul(a,b) + r1 = montmul_neg(a, bp) + if r0 != r1: + print(f"barmul test failure for {a,b}!") + print(f"Barrett multiplication: {r0}") + print(f"Montgomery multiplication: {r1} (factor {bp})") + assert False + +def bar_mont_test_all_i16(): + test_all_i16(barmul_test) + +def bar_test_random(): + test_random(barmul_test) + +# +# Test bound on Barrett multiplication +# +# |barmul(a,b)| < Q*(0.0508*C + 1/2) if |a| < C*q +# +# where 0.0508 appears as a close upper boun for Q/2**16. +# + +def bar_bound_test(a,b, max_scale=[]): + if a == 0: + return + C = abs(a)/Q + ab = barmul(a,b) + Cp = abs(ab) / Q + scale_bound = 0.0508 # Upper bound to Q/2**16 + scale = (Cp - 1/2) / C + if len(max_scale) == 0 or scale > max_scale[-1]: + max_scale.append(scale) + print(f"New scale bound for {(a,b)}: {scale}") + if Cp >= scale_bound * C + 1/2: + print(f"bar bound test failure for (a,b)={(a,b)}") + print(f"barmul(a,b): {ab}") + print(f"C (=a/q): {C}") + print(f"Cp (=barmul(a,b)/q): {Cp}") + assert False + +def bar_bound_test_all_i16(): + test_all_i16(bar_bound_test) + +# +# NTT bounds progression +# + +def funciter(f,n,x): + """Compute f^n(x)""" + if n == 0: + return x + return funciter(f, n-1, f(x)) + +def ntt_layer_bound_growth(factor): + """If the inputs to a CT-based layer of the NTT are bound by C*Q, + the outputs are bound by C'*Q, where C' is the return value of this + function.""" + + # Each coefficient is replaced by a +- t*b where a,b are input coefficients, + # t is a suitable twiddle, and * is Barrett multiplication. a is thus bound + # by C*q, while t*b is bound by 0.0508*C + 1/2 (see above). + return (lambda C: C + factor * C + 1/2) + +def ntt_layer_bound(factor, layers=7, initial=Q): + """Returns a bound on the absolute value of coefficients after a fixed number + of layers, assuming an initial absolute bound `initial`.""" + return funciter(ntt_layer_bound_growth(factor),layers, initial/Q) + +barmul_ntt_layer_bound = ntt_layer_bound(0.0508) +montmul_ntt_layer_bound = ntt_layer_bound(0.0204)