graviola 0.4.0

graviola is a modern, fast cryptography library
Documentation
// generated source. do not edit.
#![allow(non_upper_case_globals, unused_macros, unused_imports)]
use crate::low::macros::*;

// Copyright (c) 2024 The mlkem-native project authors
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT

// ----------------------------------------------------------------------------
// Unppack ML-KEM polynomial coefficients as 12-bit numbers
// Input a[384] (bytes); output r[256] (signed 16-bit words)
//
// This accepts an array of 384 bytes and unpcaks them into 256 16-bit numbers
// in the range 0 <= a[i] < 2^12 (typically they will be < 3329, the ML-KEM prime).
//
// extern void mlkem_frombytes(int16_t r[static 256],const uint8_t a[static 384]);

// Standard x86-64 ABI: RDI = r, RSI = a
// Microsoft x64 ABI:   RCX = r, RDX = a
// ----------------------------------------------------------------------------

/// Unppack ML-KEM polynomial coefficients as 12-bit numbers
///
/// Input a[384] (bytes); output r[256] (signed 16-bit words)
///
/// This accepts an array of 384 bytes and unpcaks them into 256 16-bit numbers
/// in the range 0 <= a[i] < 2^12 (typically they will be < 3329, the ML-KEM prime).
pub(crate) fn mlkem_frombytes(r: &mut [i16; 256], a: &[u8; 384]) {
    // SAFETY: inline assembly. see [crate::low::inline_assembly_safety] for safety info.
    unsafe {
        core::arch::asm!(

        Q!("    endbr64         " ),

        Q!("    mov             " "eax, 0xfff0fff"),
        Q!("    vmovd           " "xmm0, eax"),
        Q!("    vpbroadcastd    " "ymm0, xmm0"),
        Q!("    vmovdqu         " "ymm4, [rsi]"),
        Q!("    vmovdqu         " "ymm5, [32 + rsi]"),
        Q!("    vmovdqu         " "ymm6, [64 + rsi]"),
        Q!("    vmovdqu         " "ymm7, [96 + rsi]"),
        Q!("    vmovdqu         " "ymm8, [128 + rsi]"),
        Q!("    vmovdqu         " "ymm9, [160 + rsi]"),
        Q!("    vperm2i128      " "ymm3, ymm4, ymm7, 0x20"),
        Q!("    vperm2i128      " "ymm7, ymm4, ymm7, 0x31"),
        Q!("    vperm2i128      " "ymm4, ymm5, ymm8, 0x20"),
        Q!("    vperm2i128      " "ymm8, ymm5, ymm8, 0x31"),
        Q!("    vperm2i128      " "ymm5, ymm6, ymm9, 0x20"),
        Q!("    vperm2i128      " "ymm9, ymm6, ymm9, 0x31"),
        Q!("    vpunpcklqdq     " "ymm6, ymm3, ymm8"),
        Q!("    vpunpckhqdq     " "ymm8, ymm3, ymm8"),
        Q!("    vpunpcklqdq     " "ymm3, ymm7, ymm5"),
        Q!("    vpunpckhqdq     " "ymm5, ymm7, ymm5"),
        Q!("    vpunpcklqdq     " "ymm7, ymm4, ymm9"),
        Q!("    vpunpckhqdq     " "ymm9, ymm4, ymm9"),
        Q!("    vmovsldup       " "ymm4, ymm5"),
        Q!("    vpblendd        " "ymm4, ymm6, ymm4, 0xaa"),
        Q!("    vpsrlq          " "ymm6, ymm6, 0x20"),
        Q!("    vpblendd        " "ymm5, ymm6, ymm5, 0xaa"),
        Q!("    vmovsldup       " "ymm6, ymm7"),
        Q!("    vpblendd        " "ymm6, ymm8, ymm6, 0xaa"),
        Q!("    vpsrlq          " "ymm8, ymm8, 0x20"),
        Q!("    vpblendd        " "ymm7, ymm8, ymm7, 0xaa"),
        Q!("    vmovsldup       " "ymm8, ymm9"),
        Q!("    vpblendd        " "ymm8, ymm3, ymm8, 0xaa"),
        Q!("    vpsrlq          " "ymm3, ymm3, 0x20"),
        Q!("    vpblendd        " "ymm9, ymm3, ymm9, 0xaa"),
        Q!("    vpslld          " "ymm10, ymm7, 0x10"),
        Q!("    vpblendw        " "ymm10, ymm4, ymm10, 0xaa"),
        Q!("    vpsrld          " "ymm4, ymm4, 0x10"),
        Q!("    vpblendw        " "ymm7, ymm4, ymm7, 0xaa"),
        Q!("    vpslld          " "ymm4, ymm8, 0x10"),
        Q!("    vpblendw        " "ymm4, ymm5, ymm4, 0xaa"),
        Q!("    vpsrld          " "ymm5, ymm5, 0x10"),
        Q!("    vpblendw        " "ymm8, ymm5, ymm8, 0xaa"),
        Q!("    vpslld          " "ymm5, ymm9, 0x10"),
        Q!("    vpblendw        " "ymm5, ymm6, ymm5, 0xaa"),
        Q!("    vpsrld          " "ymm6, ymm6, 0x10"),
        Q!("    vpblendw        " "ymm9, ymm6, ymm9, 0xaa"),
        Q!("    vpsrlw          " "ymm11, ymm10, 0xc"),
        Q!("    vpsllw          " "ymm12, ymm7, 0x4"),
        Q!("    vpor            " "ymm11, ymm12, ymm11"),
        Q!("    vpand           " "ymm10, ymm10, ymm0"),
        Q!("    vpand           " "ymm11, ymm11, ymm0"),
        Q!("    vpsrlw          " "ymm12, ymm7, 0x8"),
        Q!("    vpsllw          " "ymm13, ymm4, 0x8"),
        Q!("    vpor            " "ymm12, ymm13, ymm12"),
        Q!("    vpand           " "ymm12, ymm12, ymm0"),
        Q!("    vpsrlw          " "ymm13, ymm4, 0x4"),
        Q!("    vpand           " "ymm13, ymm13, ymm0"),
        Q!("    vpsrlw          " "ymm14, ymm8, 0xc"),
        Q!("    vpsllw          " "ymm15, ymm5, 0x4"),
        Q!("    vpor            " "ymm14, ymm15, ymm14"),
        Q!("    vpand           " "ymm8, ymm8, ymm0"),
        Q!("    vpand           " "ymm14, ymm14, ymm0"),
        Q!("    vpsrlw          " "ymm15, ymm5, 0x8"),
        Q!("    vpsllw          " "ymm1, ymm9, 0x8"),
        Q!("    vpor            " "ymm15, ymm1, ymm15"),
        Q!("    vpand           " "ymm15, ymm15, ymm0"),
        Q!("    vpsrlw          " "ymm1, ymm9, 0x4"),
        Q!("    vpand           " "ymm1, ymm1, ymm0"),
        Q!("    vmovdqa         " "[rdi], ymm10"),
        Q!("    vmovdqa         " "[32 + rdi], ymm11"),
        Q!("    vmovdqa         " "[64 + rdi], ymm12"),
        Q!("    vmovdqa         " "[96 + rdi], ymm13"),
        Q!("    vmovdqa         " "[128 + rdi], ymm8"),
        Q!("    vmovdqa         " "[160 + rdi], ymm14"),
        Q!("    vmovdqa         " "[192 + rdi], ymm15"),
        Q!("    vmovdqa         " "[224 + rdi], ymm1"),
        Q!("    vmovdqu         " "ymm4, [192 + rsi]"),
        Q!("    vmovdqu         " "ymm5, [224 + rsi]"),
        Q!("    vmovdqu         " "ymm6, [256 + rsi]"),
        Q!("    vmovdqu         " "ymm7, [288 + rsi]"),
        Q!("    vmovdqu         " "ymm8, [320 + rsi]"),
        Q!("    vmovdqu         " "ymm9, [352 + rsi]"),
        Q!("    vperm2i128      " "ymm3, ymm4, ymm7, 0x20"),
        Q!("    vperm2i128      " "ymm7, ymm4, ymm7, 0x31"),
        Q!("    vperm2i128      " "ymm4, ymm5, ymm8, 0x20"),
        Q!("    vperm2i128      " "ymm8, ymm5, ymm8, 0x31"),
        Q!("    vperm2i128      " "ymm5, ymm6, ymm9, 0x20"),
        Q!("    vperm2i128      " "ymm9, ymm6, ymm9, 0x31"),
        Q!("    vpunpcklqdq     " "ymm6, ymm3, ymm8"),
        Q!("    vpunpckhqdq     " "ymm8, ymm3, ymm8"),
        Q!("    vpunpcklqdq     " "ymm3, ymm7, ymm5"),
        Q!("    vpunpckhqdq     " "ymm5, ymm7, ymm5"),
        Q!("    vpunpcklqdq     " "ymm7, ymm4, ymm9"),
        Q!("    vpunpckhqdq     " "ymm9, ymm4, ymm9"),
        Q!("    vmovsldup       " "ymm4, ymm5"),
        Q!("    vpblendd        " "ymm4, ymm6, ymm4, 0xaa"),
        Q!("    vpsrlq          " "ymm6, ymm6, 0x20"),
        Q!("    vpblendd        " "ymm5, ymm6, ymm5, 0xaa"),
        Q!("    vmovsldup       " "ymm6, ymm7"),
        Q!("    vpblendd        " "ymm6, ymm8, ymm6, 0xaa"),
        Q!("    vpsrlq          " "ymm8, ymm8, 0x20"),
        Q!("    vpblendd        " "ymm7, ymm8, ymm7, 0xaa"),
        Q!("    vmovsldup       " "ymm8, ymm9"),
        Q!("    vpblendd        " "ymm8, ymm3, ymm8, 0xaa"),
        Q!("    vpsrlq          " "ymm3, ymm3, 0x20"),
        Q!("    vpblendd        " "ymm9, ymm3, ymm9, 0xaa"),
        Q!("    vpslld          " "ymm10, ymm7, 0x10"),
        Q!("    vpblendw        " "ymm10, ymm4, ymm10, 0xaa"),
        Q!("    vpsrld          " "ymm4, ymm4, 0x10"),
        Q!("    vpblendw        " "ymm7, ymm4, ymm7, 0xaa"),
        Q!("    vpslld          " "ymm4, ymm8, 0x10"),
        Q!("    vpblendw        " "ymm4, ymm5, ymm4, 0xaa"),
        Q!("    vpsrld          " "ymm5, ymm5, 0x10"),
        Q!("    vpblendw        " "ymm8, ymm5, ymm8, 0xaa"),
        Q!("    vpslld          " "ymm5, ymm9, 0x10"),
        Q!("    vpblendw        " "ymm5, ymm6, ymm5, 0xaa"),
        Q!("    vpsrld          " "ymm6, ymm6, 0x10"),
        Q!("    vpblendw        " "ymm9, ymm6, ymm9, 0xaa"),
        Q!("    vpsrlw          " "ymm11, ymm10, 0xc"),
        Q!("    vpsllw          " "ymm12, ymm7, 0x4"),
        Q!("    vpor            " "ymm11, ymm12, ymm11"),
        Q!("    vpand           " "ymm10, ymm10, ymm0"),
        Q!("    vpand           " "ymm11, ymm11, ymm0"),
        Q!("    vpsrlw          " "ymm12, ymm7, 0x8"),
        Q!("    vpsllw          " "ymm13, ymm4, 0x8"),
        Q!("    vpor            " "ymm12, ymm13, ymm12"),
        Q!("    vpand           " "ymm12, ymm12, ymm0"),
        Q!("    vpsrlw          " "ymm13, ymm4, 0x4"),
        Q!("    vpand           " "ymm13, ymm13, ymm0"),
        Q!("    vpsrlw          " "ymm14, ymm8, 0xc"),
        Q!("    vpsllw          " "ymm15, ymm5, 0x4"),
        Q!("    vpor            " "ymm14, ymm15, ymm14"),
        Q!("    vpand           " "ymm8, ymm8, ymm0"),
        Q!("    vpand           " "ymm14, ymm14, ymm0"),
        Q!("    vpsrlw          " "ymm15, ymm5, 0x8"),
        Q!("    vpsllw          " "ymm1, ymm9, 0x8"),
        Q!("    vpor            " "ymm15, ymm1, ymm15"),
        Q!("    vpand           " "ymm15, ymm15, ymm0"),
        Q!("    vpsrlw          " "ymm1, ymm9, 0x4"),
        Q!("    vpand           " "ymm1, ymm1, ymm0"),
        Q!("    vmovdqa         " "[256 + rdi], ymm10"),
        Q!("    vmovdqa         " "[288 + rdi], ymm11"),
        Q!("    vmovdqa         " "[320 + rdi], ymm12"),
        Q!("    vmovdqa         " "[352 + rdi], ymm13"),
        Q!("    vmovdqa         " "[384 + rdi], ymm8"),
        Q!("    vmovdqa         " "[416 + rdi], ymm14"),
        Q!("    vmovdqa         " "[448 + rdi], ymm15"),
        Q!("    vmovdqa         " "[480 + rdi], ymm1"),

        inout("rdi") r.as_mut_ptr() => _,
        inout("rsi") a.as_ptr() => _,
        // clobbers
        out("rax") _,
        out("zmm0") _,
        out("zmm1") _,
        out("zmm10") _,
        out("zmm11") _,
        out("zmm12") _,
        out("zmm13") _,
        out("zmm14") _,
        out("zmm15") _,
        out("zmm3") _,
        out("zmm4") _,
        out("zmm5") _,
        out("zmm6") _,
        out("zmm7") _,
        out("zmm8") _,
        out("zmm9") _,
            )
    };
}