#![forbid(unsafe_code)]
use crate::Schedule;
use crate::ubc_check::*;
use crate::mem::load_u32x4;
use core::arch::aarch64::*;
#[inline]
#[target_feature(enable = "neon")]
fn load<const I: usize>(w: &Schedule) -> uint32x4_t {
load_u32x4(w.window::<I, 4>())
}
#[inline]
#[target_feature(enable = "neon")]
fn splat(bits: [u32; 4]) -> uint32x4_t {
load_u32x4(&bits)
}
#[inline]
#[target_feature(enable = "neon")]
pub(super) fn check(w: &Schedule) -> u32 {
let mask = prefix(w);
if mask == 0 {
return 0;
}
tail(w, mask)
}
#[inline]
#[target_feature(enable = "neon")]
fn prefix(w: &Schedule) -> u32 {
let mut acc0 = vdupq_n_u32(0);
let mut acc1 = vdupq_n_u32(0);
{
let near = load::<35>(w);
let far = load::<36>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 5));
let set = vtstq_u32(x, splat([1 << 1, 1 << 1, 1 << 1, 1 << 0]));
let bits = splat([
DV_I_46_2_BIT | DV_I_49_2_BIT,
DV_I_47_2_BIT | DV_I_50_2_BIT | DV_II_46_2_BIT,
DV_I_48_2_BIT | DV_I_51_2_BIT,
DV_II_51_2_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<36>(w);
let far = load::<37>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 5));
let set = vtstq_u32(x, splat([1 << 0, 1 << 0, 1 << 1, 1 << 1]));
let bits = splat([
DV_II_49_2_BIT,
DV_II_50_2_BIT,
DV_I_49_2_BIT,
DV_I_46_2_BIT | DV_I_50_2_BIT | DV_II_49_2_BIT,
]);
acc1 = vorrq_u32(acc1, vqsubq_u32(bits, set));
}
{
let near = load::<36>(w);
let far = load::<38>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, splat([1 << 4, 1 << 4, 1 << 1, 1 << 4]));
let bits = splat([
DV_II_52_0_BIT | DV_II_54_0_BIT,
DV_I_43_0_BIT | DV_II_53_0_BIT | DV_II_55_0_BIT,
DV_I_49_2_BIT,
DV_I_43_0_BIT | DV_I_45_0_BIT | DV_II_55_0_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<36>(w);
let far = load::<40>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 25));
let set = vtstq_u32(x, splat([1 << 4, 1 << 5, 1 << 5, 1 << 5]));
let bits = splat([
DV_I_46_0_BIT | DV_I_49_0_BIT | DV_II_45_0_BIT | DV_II_48_0_BIT,
DV_II_49_2_BIT,
DV_II_50_2_BIT,
DV_II_51_2_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<38>(w);
let far = load::<40>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, splat([1 << 4, 1 << 1, 1 << 1, 1 << 1]));
let bits = splat([
DV_I_44_0_BIT | DV_II_54_0_BIT | DV_II_56_0_BIT,
DV_I_50_2_BIT | DV_II_49_2_BIT,
DV_I_51_2_BIT | DV_II_50_2_BIT,
DV_II_46_2_BIT | DV_II_51_2_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<37>(w);
let far = load::<40>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 25));
let set = vtstq_u32(x, vdupq_n_u32(1 << 4));
let bits = splat([
DV_I_43_0_BIT | DV_I_47_0_BIT | DV_II_46_0_BIT | DV_II_53_0_BIT | DV_II_55_0_BIT,
DV_I_44_0_BIT | DV_I_48_0_BIT | DV_II_47_0_BIT | DV_II_54_0_BIT | DV_II_56_0_BIT,
DV_I_43_0_BIT | DV_I_45_0_BIT | DV_I_49_0_BIT | DV_II_48_0_BIT | DV_II_55_0_BIT,
DV_I_44_0_BIT | DV_I_46_0_BIT | DV_I_50_0_BIT | DV_II_49_0_BIT | DV_II_56_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<40>(w);
let far = load::<41>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 5));
let set = vtstq_u32(x, vdupq_n_u32(1 << 1));
let bits = splat([
DV_I_47_2_BIT | DV_I_51_2_BIT | DV_II_50_2_BIT,
DV_I_48_2_BIT | DV_II_46_2_BIT | DV_II_51_2_BIT,
DV_I_49_2_BIT,
DV_I_50_2_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<40>(w);
let far = load::<41>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 29));
let bits = splat([
DV_I_44_0_BIT
| DV_I_47_0_BIT
| DV_I_48_0_BIT
| DV_II_46_0_BIT
| DV_II_47_0_BIT
| DV_II_56_0_BIT,
DV_I_45_0_BIT | DV_I_48_0_BIT | DV_I_49_0_BIT | DV_II_47_0_BIT | DV_II_48_0_BIT,
DV_I_46_0_BIT | DV_I_49_0_BIT | DV_I_50_0_BIT | DV_II_48_0_BIT | DV_II_49_0_BIT,
DV_I_47_0_BIT
| DV_I_50_0_BIT
| DV_I_51_0_BIT
| DV_II_45_0_BIT
| DV_II_49_0_BIT
| DV_II_50_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<41>(w);
let far = load::<43>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 6));
let bits = splat([
DV_I_47_2_BIT,
DV_I_46_2_BIT | DV_I_48_2_BIT,
DV_I_47_2_BIT | DV_I_49_2_BIT,
DV_I_46_2_BIT | DV_I_48_2_BIT | DV_I_50_2_BIT,
]);
acc0 = vorrq_u32(acc0, vminq_u32(set, bits));
}
{
let near = load::<41>(w);
let far = load::<44>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 25));
let set = vtstq_u32(x, vdupq_n_u32(1 << 4));
let bits = splat([
DV_I_43_0_BIT
| DV_I_45_0_BIT
| DV_I_47_0_BIT
| DV_I_51_0_BIT
| DV_II_45_0_BIT
| DV_II_50_0_BIT,
DV_I_44_0_BIT
| DV_I_46_0_BIT
| DV_I_48_0_BIT
| DV_I_52_0_BIT
| DV_II_46_0_BIT
| DV_II_51_0_BIT,
DV_I_43_0_BIT
| DV_I_45_0_BIT
| DV_I_47_0_BIT
| DV_I_49_0_BIT
| DV_II_47_0_BIT
| DV_II_52_0_BIT,
DV_I_44_0_BIT
| DV_I_46_0_BIT
| DV_I_48_0_BIT
| DV_I_50_0_BIT
| DV_II_48_0_BIT
| DV_II_53_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<44>(w);
let far = load::<45>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 5));
let set = vtstq_u32(x, vdupq_n_u32(1 << 1));
let bits = splat([
DV_I_51_2_BIT | DV_II_49_2_BIT,
DV_II_50_2_BIT,
DV_II_51_2_BIT,
DV_II_46_2_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<44>(w);
let far = load::<45>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 29));
let bits = splat([
DV_I_48_0_BIT
| DV_I_51_0_BIT
| DV_I_52_0_BIT
| DV_II_45_0_BIT
| DV_II_46_0_BIT
| DV_II_50_0_BIT
| DV_II_51_0_BIT,
DV_I_49_0_BIT
| DV_I_52_0_BIT
| DV_II_46_0_BIT
| DV_II_47_0_BIT
| DV_II_51_0_BIT
| DV_II_52_0_BIT,
DV_I_43_0_BIT
| DV_I_50_0_BIT
| DV_II_47_0_BIT
| DV_II_48_0_BIT
| DV_II_52_0_BIT
| DV_II_53_0_BIT,
DV_I_44_0_BIT
| DV_I_51_0_BIT
| DV_II_48_0_BIT
| DV_II_49_0_BIT
| DV_II_53_0_BIT
| DV_II_54_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<45>(w);
let far = load::<46>(w);
let x = veorq_u32(vshrq_n_u32(near, 5), far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 1));
let bits = splat([
DV_II_49_2_BIT,
DV_I_46_2_BIT | DV_II_50_2_BIT,
DV_I_47_2_BIT | DV_II_51_2_BIT,
DV_I_48_2_BIT,
]);
acc0 = vorrq_u32(acc0, vminq_u32(set, bits));
}
{
let near = load::<45>(w);
let far = load::<47>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 6));
let bits = splat([
DV_I_47_2_BIT | DV_I_49_2_BIT | DV_I_51_2_BIT,
DV_I_48_2_BIT | DV_I_50_2_BIT,
DV_I_49_2_BIT | DV_I_51_2_BIT,
DV_I_50_2_BIT | DV_II_46_2_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<45>(w);
let far = load::<47>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, splat([1 << 29, 1 << 29, 1 << 4, 1 << 4]));
let bits = splat([
DV_I_44_0_BIT | DV_I_46_0_BIT | DV_I_48_0_BIT,
DV_I_45_0_BIT | DV_I_47_0_BIT | DV_I_49_0_BIT,
DV_I_49_0_BIT | DV_I_51_0_BIT | DV_II_45_0_BIT,
DV_I_50_0_BIT | DV_I_52_0_BIT | DV_II_46_0_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<45>(w);
let far = load::<48>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 25));
let set = vtstq_u32(x, vdupq_n_u32(1 << 4));
let bits = splat([
DV_I_45_0_BIT
| DV_I_47_0_BIT
| DV_I_49_0_BIT
| DV_I_51_0_BIT
| DV_II_49_0_BIT
| DV_II_54_0_BIT,
DV_I_46_0_BIT
| DV_I_48_0_BIT
| DV_I_50_0_BIT
| DV_I_52_0_BIT
| DV_II_50_0_BIT
| DV_II_55_0_BIT,
DV_I_47_0_BIT
| DV_I_49_0_BIT
| DV_I_51_0_BIT
| DV_II_45_0_BIT
| DV_II_51_0_BIT
| DV_II_56_0_BIT,
DV_I_48_0_BIT | DV_I_50_0_BIT | DV_I_52_0_BIT | DV_II_46_0_BIT | DV_II_52_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<48>(w);
let far = load::<49>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 29));
let bits = splat([
DV_I_45_0_BIT
| DV_I_52_0_BIT
| DV_II_49_0_BIT
| DV_II_50_0_BIT
| DV_II_54_0_BIT
| DV_II_55_0_BIT,
DV_I_46_0_BIT
| DV_II_45_0_BIT
| DV_II_50_0_BIT
| DV_II_51_0_BIT
| DV_II_55_0_BIT
| DV_II_56_0_BIT,
DV_I_47_0_BIT | DV_II_46_0_BIT | DV_II_51_0_BIT | DV_II_52_0_BIT | DV_II_56_0_BIT,
DV_I_48_0_BIT | DV_II_47_0_BIT | DV_II_52_0_BIT | DV_II_53_0_BIT,
]);
acc0 = vorrq_u32(acc0, vminq_u32(set, bits));
}
{
let near = load::<52>(w);
let far = load::<53>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 29));
let bits = splat([
DV_I_49_0_BIT | DV_II_45_0_BIT | DV_II_48_0_BIT | DV_II_53_0_BIT | DV_II_54_0_BIT,
DV_I_50_0_BIT | DV_II_46_0_BIT | DV_II_49_0_BIT | DV_II_54_0_BIT | DV_II_55_0_BIT,
DV_I_51_0_BIT | DV_II_47_0_BIT | DV_II_50_0_BIT | DV_II_55_0_BIT | DV_II_56_0_BIT,
DV_I_52_0_BIT | DV_II_48_0_BIT | DV_II_51_0_BIT | DV_II_56_0_BIT,
]);
acc1 = vorrq_u32(acc1, vminq_u32(set, bits));
}
{
let near = load::<52>(w);
let far = load::<55>(w);
let x = veorq_u32(near, far);
let set = vtstq_u32(x, vdupq_n_u32(1 << 29));
let bits = splat([
DV_I_51_0_BIT | DV_II_47_0_BIT | DV_II_48_0_BIT,
DV_I_52_0_BIT | DV_II_48_0_BIT | DV_II_49_0_BIT,
DV_II_49_0_BIT | DV_II_50_0_BIT,
DV_II_50_0_BIT | DV_II_51_0_BIT,
]);
acc0 = vorrq_u32(acc0, vqsubq_u32(bits, set));
}
{
let near = load::<60>(w);
let far = load::<61>(w);
let x = veorq_u32(near, vshrq_n_u32(far, 5));
let set = vtstq_u32(x, splat([1 << 0, 1 << 2, 1 << 2, 1 << 2]));
let bits = splat([
DV_I_45_0_BIT | DV_II_45_0_BIT,
DV_I_46_2_BIT | DV_II_46_2_BIT,
DV_I_47_2_BIT,
DV_I_48_2_BIT,
]);
acc1 = vorrq_u32(acc1, vqsubq_u32(bits, set));
}
let acc = vorrq_u32(acc0, acc1);
let folded = vorr_u32(vget_low_u32(acc), vget_high_u32(acc));
let cleared = vget_lane_u32(vorr_u32(folded, vdup_lane_u32(folded, 1)), 0);
!cleared
}
#[cold]
#[inline(never)]
fn tail(w: &Schedule, mask: u32) -> u32 {
let mut out = mask;
if mask & DV_I_46_2_BIT != 0 {
let fail = ((w[39] >> 1) ^ (w[42] >> 6) ^ 1) & 1;
out &= !(fail << 4);
}
if mask & DV_I_51_2_BIT != 0 {
let fail = (((w[44] >> 1) ^ (w[51] >> 6) ^ 1)
| ((w[44] >> 1) ^ (w[52] >> 1) ^ 1)
| ((w[35] >> 5) ^ (w[39] >> 30))
| ((w[37] >> 1) ^ (w[37] >> 6)))
& 1;
out &= !(fail << 14);
}
if mask & DV_II_46_2_BIT != 0 {
let fail = ((w[48] >> 6) ^ (w[51] >> 1)) & 1;
out &= !(fail << 18);
}
if mask & DV_II_49_2_BIT != 0 {
let fail = (((w[50] >> 1) ^ (w[51] >> 6) ^ 1)
| ((w[50] >> 1) ^ (w[53] >> 6) ^ 1)
| ((w[50] >> 1) ^ (w[54] >> 1) ^ 1))
& 1;
out &= !(fail << 22);
}
if mask & DV_II_50_2_BIT != 0 {
let fail = (((w[51] >> 1) ^ (w[52] >> 6) ^ 1)
| ((w[51] >> 1) ^ (w[54] >> 6) ^ 1)
| ((w[51] >> 1) ^ (w[55] >> 1) ^ 1))
& 1;
out &= !(fail << 24);
}
if mask & DV_II_51_2_BIT != 0 {
let fail = (((w[52] >> 1) ^ (w[53] >> 6) ^ 1)
| ((w[52] >> 1) ^ (w[55] >> 6) ^ 1)
| ((w[52] >> 1) ^ (w[56] >> 1) ^ 1))
& 1;
out &= !(fail << 26);
}
if mask & DV_I_43_0_BIT != 0 {
let fail = (((w[41] >> 4) ^ (w[43] >> 4) ^ 1)
| (w[58] ^ (w[59] >> 5) ^ 1)
| (w[58] ^ (w[63] >> 30) ^ 1)
| ((w[61] >> 1) ^ (w[62] >> 6) ^ 1)
| ((w[43] >> 4) ^ (w[47] >> 29)))
& 1;
out &= !fail;
}
if mask & DV_I_49_2_BIT != 0 {
let fail = ((w[42] >> 1) ^ (w[50] >> 1) ^ 1) & 1;
out &= !(fail << 10);
}
if mask & DV_I_50_2_BIT != 0 {
let fail = ((w[48] >> 6) ^ (w[51] >> 1)) & 1;
out &= !(fail << 12);
}
if mask & DV_II_52_0_BIT != 0 {
let fail = (((w[39] >> 30) ^ (w[40] >> 3) ^ 1)
| ((w[39] >> 30) ^ (w[44] >> 28) ^ 1)
| ((w[54] >> 4) ^ (w[56] >> 4) ^ 1)
| ((w[54] >> 4) ^ (w[60] >> 29) ^ 1)
| ((w[56] >> 29) ^ (w[59] >> 29) ^ 1)
| ((w[40] >> 4) ^ (w[44] >> 29))
| ((w[43] >> 4) ^ (w[47] >> 29))
| ((w[54] >> 4) ^ (w[57] >> 29))
| ((w[56] >> 4) ^ (w[59] >> 29)))
& 1;
out &= !(fail << 27);
}
if mask & DV_II_53_0_BIT != 0 {
let fail = (((w[55] >> 4) ^ (w[57] >> 4) ^ 1)
| ((w[55] >> 4) ^ (w[61] >> 29) ^ 1)
| ((w[41] >> 3) ^ (w[45] >> 28))
| ((w[41] >> 4) ^ (w[45] >> 29))
| ((w[44] >> 4) ^ (w[48] >> 29))
| ((w[49] >> 4) ^ (w[52] >> 29))
| ((w[55] >> 4) ^ (w[58] >> 29))
| ((w[55] >> 4) ^ (w[57] >> 29)))
& 1;
out &= !(fail << 28);
}
if mask
& (DV_I_44_0_BIT
| DV_I_45_0_BIT
| DV_I_46_0_BIT
| DV_I_47_0_BIT
| DV_I_48_0_BIT
| DV_I_49_0_BIT
| DV_I_50_0_BIT
| DV_I_51_0_BIT
| DV_I_52_0_BIT
| DV_II_45_0_BIT
| DV_II_46_0_BIT
| DV_II_47_0_BIT
| DV_II_48_0_BIT
| DV_II_49_0_BIT
| DV_II_50_0_BIT
| DV_II_51_0_BIT
| DV_II_54_0_BIT
| DV_II_55_0_BIT
| DV_II_56_0_BIT)
!= 0
{
if mask & DV_I_44_0_BIT != 0 {
let fail = (((w[40] >> 4) ^ (w[42] >> 4) ^ 1)
| (w[59] ^ (w[60] >> 5) ^ 1)
| (w[59] ^ (w[64] >> 30) ^ 1)
| ((w[62] >> 1) ^ (w[63] >> 6) ^ 1)
| ((w[44] >> 4) ^ (w[48] >> 29)))
& 1;
out &= !(fail << 1);
}
if mask & DV_I_46_0_BIT != 0 {
let fail = (((w[40] >> 4) ^ (w[42] >> 4) ^ 1)
| ((w[44] >> 4) ^ (w[46] >> 4) ^ 1)
| (w[61] ^ (w[62] >> 5) ^ 1))
& 1;
out &= !(fail << 3);
}
if mask & DV_II_51_0_BIT != 0 {
let fail = (((w[38] >> 30) ^ (w[39] >> 3) ^ 1)
| ((w[38] >> 30) ^ (w[43] >> 28) ^ 1)
| ((w[56] >> 29) ^ (w[59] >> 29) ^ 1)
| ((w[39] >> 4) ^ (w[43] >> 29))
| ((w[42] >> 4) ^ (w[46] >> 29))
| ((w[53] >> 4) ^ (w[56] >> 29))
| ((w[55] >> 4) ^ (w[58] >> 29)))
& 1;
out &= !(fail << 25);
}
if mask & DV_II_54_0_BIT != 0 {
let fail = (((w[42] >> 3) ^ (w[46] >> 28))
| ((w[42] >> 4) ^ (w[46] >> 29))
| ((w[50] >> 4) ^ (w[53] >> 29))
| ((w[56] >> 4) ^ (w[59] >> 29))
| ((w[56] >> 4) ^ (w[58] >> 29))
| ((w[58] >> 4) ^ (w[62] >> 29)))
& 1;
out &= !(fail << 29);
}
if mask & DV_I_45_0_BIT != 0 {
let fail = (((w[41] >> 4) ^ (w[43] >> 4) ^ 1)
| ((w[63] >> 1) ^ (w[64] >> 6) ^ 1)
| ((w[35] >> 4) ^ (w[39] >> 29)))
& 1;
out &= !(fail << 2);
}
if mask & DV_I_47_0_BIT != 0 {
let fail = (((w[41] >> 4) ^ (w[43] >> 4) ^ 1)
| ((w[45] >> 4) ^ (w[47] >> 4) ^ 1)
| (w[62] ^ (w[63] >> 5) ^ 1)
| ((w[37] >> 4) ^ (w[41] >> 29)))
& 1;
out &= !(fail << 5);
}
if mask & DV_I_50_0_BIT != 0 {
let fail = (((w[36] >> 4) ^ (w[37] >> 4) ^ 1)
| ((w[44] >> 4) ^ (w[46] >> 4) ^ 1)
| ((w[46] >> 4) ^ (w[48] >> 4) ^ 1)
| ((w[37] >> 4) ^ (w[41] >> 29))
| ((w[40] >> 4) ^ (w[44] >> 29))
| ((w[50] >> 4) ^ (w[53] >> 29)))
& 1;
out &= !(fail << 11);
}
if mask & DV_I_51_0_BIT != 0 {
let fail = (((w[37] >> 4) ^ (w[38] >> 4) ^ 1)
| ((w[45] >> 4) ^ (w[47] >> 4) ^ 1)
| ((w[35] >> 3) ^ (w[39] >> 28))
| ((w[38] >> 4) ^ (w[42] >> 29))
| ((w[41] >> 4) ^ (w[45] >> 29))
| ((w[49] >> 4) ^ (w[52] >> 29))
| ((w[51] >> 4) ^ (w[54] >> 29)))
& 1;
out &= !(fail << 13);
}
if mask & DV_I_52_0_BIT != 0 {
let fail = (((w[38] >> 4) ^ (w[39] >> 4) ^ 1)
| ((w[46] >> 4) ^ (w[48] >> 4) ^ 1)
| ((w[39] >> 4) ^ (w[43] >> 29))
| ((w[42] >> 4) ^ (w[46] >> 29))
| ((w[50] >> 4) ^ (w[53] >> 29))
| ((w[52] >> 4) ^ (w[55] >> 29)))
& 1;
out &= !(fail << 15);
}
if mask & DV_II_45_0_BIT != 0 {
let fail = (((w[63] >> 1) ^ (w[64] >> 6) ^ 1)
| ((w[41] >> 4) ^ (w[45] >> 29))
| ((w[49] >> 4) ^ (w[52] >> 29)))
& 1;
out &= !(fail << 16);
}
if mask & DV_II_46_0_BIT != 0 {
let fail = ((w[61] ^ (w[62] >> 5) ^ 1)
| ((w[37] >> 4) ^ (w[41] >> 29))
| ((w[42] >> 4) ^ (w[46] >> 29))
| ((w[50] >> 4) ^ (w[53] >> 29)))
& 1;
out &= !(fail << 17);
}
if mask & DV_II_47_0_BIT != 0 {
let fail = ((w[62] ^ (w[63] >> 5) ^ 1)
| ((w[35] >> 3) ^ (w[39] >> 28))
| ((w[35] >> 4) ^ (w[39] >> 29))
| ((w[38] >> 4) ^ (w[42] >> 29))
| ((w[43] >> 4) ^ (w[47] >> 29))
| ((w[49] >> 4) ^ (w[52] >> 29))
| ((w[51] >> 4) ^ (w[54] >> 29)))
& 1;
out &= !(fail << 19);
}
if mask & DV_II_49_0_BIT != 0 {
let fail = (((w[36] >> 30) ^ (w[37] >> 3) ^ 1)
| ((w[36] >> 30) ^ (w[41] >> 28) ^ 1)
| ((w[37] >> 4) ^ (w[41] >> 29))
| ((w[40] >> 4) ^ (w[44] >> 29))
| ((w[51] >> 4) ^ (w[54] >> 29))
| ((w[53] >> 4) ^ (w[56] >> 29)))
& 1;
out &= !(fail << 21);
}
if mask & DV_II_50_0_BIT != 0 {
let fail = (((w[37] >> 30) ^ (w[38] >> 3) ^ 1)
| ((w[37] >> 30) ^ (w[42] >> 28) ^ 1)
| ((w[38] >> 4) ^ (w[42] >> 29))
| ((w[41] >> 4) ^ (w[45] >> 29))
| ((w[52] >> 4) ^ (w[55] >> 29))
| ((w[54] >> 4) ^ (w[57] >> 29)))
& 1;
out &= !(fail << 23);
}
if mask & DV_II_55_0_BIT != 0 {
let fail = (((w[43] >> 3) ^ (w[47] >> 28))
| ((w[43] >> 4) ^ (w[47] >> 29))
| ((w[51] >> 4) ^ (w[54] >> 29))
| ((w[57] >> 4) ^ (w[59] >> 29))
| ((w[59] >> 4) ^ (w[63] >> 29)))
& 1;
out &= !(fail << 30);
}
if mask & DV_II_56_0_BIT != 0 {
let fail = (((w[40] >> 4) ^ (w[42] >> 4) ^ 1)
| ((w[44] >> 3) ^ (w[48] >> 28))
| ((w[44] >> 4) ^ (w[48] >> 29))
| ((w[52] >> 4) ^ (w[55] >> 29))
| ((w[60] >> 4) ^ (w[64] >> 29)))
& 1;
out &= !(fail << 31);
}
if mask & DV_I_48_0_BIT != 0 {
let fail = (((w[44] >> 4) ^ (w[46] >> 4) ^ 1)
| ((w[46] >> 4) ^ (w[48] >> 4) ^ 1)
| (w[63] ^ (w[64] >> 5) ^ 1)
| ((w[35] >> 4) ^ (w[39] >> 29))
| ((w[38] >> 4) ^ (w[42] >> 29)))
& 1;
out &= !(fail << 7);
}
if mask & DV_II_48_0_BIT != 0 {
let fail = (((w[35] >> 30) ^ (w[36] >> 3) ^ 1)
| ((w[35] >> 30) ^ (w[40] >> 28) ^ 1)
| (w[63] ^ (w[64] >> 5) ^ 1)
| ((w[39] >> 4) ^ (w[43] >> 29))
| ((w[44] >> 4) ^ (w[48] >> 29))
| ((w[50] >> 4) ^ (w[53] >> 29))
| ((w[52] >> 4) ^ (w[55] >> 29)))
& 1;
out &= !(fail << 20);
}
if mask & DV_I_49_0_BIT != 0 {
let fail = (((w[45] >> 4) ^ (w[47] >> 4) ^ 1)
| ((w[39] >> 4) ^ (w[43] >> 29))
| ((w[49] >> 4) ^ (w[52] >> 29)))
& 1;
out &= !(fail << 9);
}
}
out
}