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)