// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.pqc.crypto.mayo;

import org.bouncycastle.util.GF16;

class GF16Utils
{
    static final long NIBBLE_MASK_MSB = 8608480567731124087L;
    static final long MASK_MSB = -8608480567731124088L;
    static final long MASK_LSB = 1229782938247303441L;
    static final long NIBBLE_MASK_LSB = -1229782938247303442L;
    
    static void mVecMulAdd(final int n, final long[] array, int n2, final int n3, final long[] array2, int n4) {
        final long n5 = (long)n3 & 0xFFFFFFFFL;
        final long n6 = n5 & 0x1L;
        final long n7 = n5 >>> 1 & 0x1L;
        final long n8 = n5 >>> 2 & 0x1L;
        final long n9 = n5 >>> 3 & 0x1L;
        for (int i = 0; i < n; ++i) {
            final long n10 = array[n2++];
            final long n11 = n10 & -n6;
            final long n12 = n10 & 0x8888888888888888L;
            final long n13 = n10 & 0x7777777777777777L;
            final long n14 = n12 >>> 3;
            final long n15 = n13 << 1 ^ n14 + (n14 << 1);
            final long n16 = n11 ^ (n15 & -n7);
            final long n17 = n15 & 0x8888888888888888L;
            final long n18 = n15 & 0x7777777777777777L;
            final long n19 = n17 >>> 3;
            final long n20 = n18 << 1 ^ n19 + (n19 << 1);
            final long n21 = n16 ^ (n20 & -n8);
            final long n22 = n20 & 0x8888888888888888L;
            final long n23 = n20 & 0x7777777777777777L;
            final long n24 = n22 >>> 3;
            final long n25 = n23 << 1 ^ n24 + (n24 << 1);
            final int n26 = n4++;
            array2[n26] ^= (n21 ^ (n25 & -n9));
        }
    }
    
    static void mulAddMUpperTriangularMatXMat(final int n, final long[] array, final byte[] array2, final long[] array3, final int n2, final int n3, final int n4) {
        int n5 = 0;
        for (int n6 = n4 * n, i = 0, n7 = 0, n8 = 0; i < n3; ++i, n7 += n4, n8 += n6) {
            for (int j = i, n9 = n7; j < n3; ++j, n9 += n4) {
                for (int k = 0, n10 = 0; k < n4; ++k, n10 += n) {
                    mVecMulAdd(n, array, n5, array2[n9 + k], array3, n2 + n8 + n10);
                }
                n5 += n;
            }
        }
    }
    
    static void mulAddMatTransXMMat(final int n, final byte[] array, final long[] array2, final int n2, final long[] array3, final int n3, final int n4) {
        for (int n5 = n4 * n, i = 0, n6 = 0; i < n4; ++i, n6 += n5) {
            for (int j = 0, n7 = 0, n8 = 0; j < n3; ++j, n7 += n4, n8 += n5) {
                final byte b = array[n7 + i];
                for (int k = 0, n9 = 0; k < n4; ++k, n9 += n) {
                    mVecMulAdd(n, array2, n2 + n8 + n9, b, array3, n6 + n9);
                }
            }
        }
    }
    
    static void mulAddMatXMMat(final int n, final byte[] array, final long[] array2, final long[] array3, final int n2, final int n3) {
        for (int n4 = n * n2, i = 0, n5 = 0, n6 = 0; i < n2; ++i, n5 += n3, n6 += n4) {
            for (int j = 0, n7 = 0; j < n3; ++j, n7 += n4) {
                final byte b = array[n5 + j];
                for (int k = 0, n8 = 0; k < n2; ++k, n8 += n) {
                    mVecMulAdd(n, array2, n7 + n8, b, array3, n6 + n8);
                }
            }
        }
    }
    
    static void mulAddMatXMMat(final int n, final byte[] array, final long[] array2, final int n2, final long[] array3, final int n3, final int n4, final int n5) {
        for (int n6 = n * n5, i = 0, n7 = 0, n8 = 0; i < n3; ++i, n7 += n6, n8 += n4) {
            for (int j = 0, n9 = 0; j < n4; ++j, n9 += n6) {
                final byte b = array[n8 + j];
                for (int k = 0, n10 = 0; k < n5; ++k, n10 += n) {
                    mVecMulAdd(n, array2, n9 + n10 + n2, b, array3, n7 + n10);
                }
            }
        }
    }
    
    static void mulAddMUpperTriangularMatXMatTrans(final int n, final long[] array, final byte[] array2, final long[] array3, final int n2, final int n3) {
        int n4 = 0;
        for (int n5 = n * n3, i = 0, n6 = 0; i < n2; ++i, n6 += n5) {
            for (int j = i; j < n2; ++j) {
                for (int k = 0, n7 = 0, n8 = 0; k < n3; ++k, n7 += n2, n8 += n) {
                    mVecMulAdd(n, array, n4, array2[n7 + j], array3, n6 + n8);
                }
                n4 += n;
            }
        }
    }
    
    static long mulFx8(final byte b, final long n) {
        final int n2 = b & 0xFF;
        final long n3 = ((long)(-(n2 & 0x1)) & n) ^ ((long)(-(n2 >> 1 & 0x1)) & n << 1) ^ ((long)(-(n2 >> 2 & 0x1)) & n << 2) ^ ((long)(-(n2 >> 3 & 0x1)) & n << 3);
        final long n4 = n3 & 0xF0F0F0F0F0F0F0F0L;
        return (n3 ^ n4 >>> 4 ^ n4 >>> 3) & 0xF0F0F0F0F0F0F0FL;
    }
    
    static void matMul(final byte[] array, final byte[] array2, final int n, final byte[] array3, final int n2, final int n3) {
        int i = 0;
        int n4 = 0;
        int n5 = 0;
        while (i < n3) {
            byte b = 0;
            for (int j = 0; j < n2; ++j) {
                b ^= GF16.mul(array[n4++], array2[n + j]);
            }
            array3[n5++] = b;
            ++i;
        }
    }
}
