#![allow(unsafe_code)]
#![allow(clippy::indexing_slicing)]
use super::BLOCK_LEN;
#[inline(always)]
fn big_sigma0(x: u32) -> u32 {
let result: u32;
unsafe {
core::arch::asm!(
"mtvsrwz {tmp}, {x}",
"vshasigmaw {tmp}, {tmp}, 1, 0",
"mfvsrwz {out}, {tmp}",
x = in(reg) x,
out = lateout(reg) result,
tmp = out(vreg) _,
options(pure, nomem, nostack),
);
}
result
}
#[inline(always)]
fn big_sigma1(x: u32) -> u32 {
let result: u32;
unsafe {
core::arch::asm!(
"mtvsrwz {tmp}, {x}",
"vshasigmaw {tmp}, {tmp}, 1, 15",
"mfvsrwz {out}, {tmp}",
x = in(reg) x,
out = lateout(reg) result,
tmp = out(vreg) _,
options(pure, nomem, nostack),
);
}
result
}
#[inline(always)]
fn small_sigma0(x: u32) -> u32 {
let result: u32;
unsafe {
core::arch::asm!(
"mtvsrwz {tmp}, {x}",
"vshasigmaw {tmp}, {tmp}, 0, 0",
"mfvsrwz {out}, {tmp}",
x = in(reg) x,
out = lateout(reg) result,
tmp = out(vreg) _,
options(pure, nomem, nostack),
);
}
result
}
#[inline(always)]
fn small_sigma1(x: u32) -> u32 {
let result: u32;
unsafe {
core::arch::asm!(
"mtvsrwz {tmp}, {x}",
"vshasigmaw {tmp}, {tmp}, 0, 15",
"mfvsrwz {out}, {tmp}",
x = in(reg) x,
out = lateout(reg) result,
tmp = out(vreg) _,
options(pure, nomem, nostack),
);
}
result
}
#[target_feature(enable = "altivec,vsx,power8-vector,power8-crypto")]
pub(crate) unsafe fn compress_blocks_ppc64_crypto(state: &mut [u32; 8], blocks: &[u8]) {
debug_assert_eq!(blocks.len() % BLOCK_LEN, 0);
let mut chunks = blocks.chunks_exact(BLOCK_LEN);
for chunk in &mut chunks {
let block = unsafe { &*(chunk.as_ptr() as *const [u8; BLOCK_LEN]) };
super::compress_block_with(state, block, big_sigma0, big_sigma1, small_sigma0, small_sigma1);
}
debug_assert!(chunks.remainder().is_empty());
}