// Copyright 2021 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// --------

// See "SIMD Implementations" in README.md for a link to Gopal et al. "Fast CRC
// Computation for Generic Polynomials Using PCLMULQDQ Instruction".

pri func ieee_hasher.up_x86_sse42!(x: roslice base.u8),
        choose cpu_arch >= x86_sse42,
{
    var s : base.u32
    var p : roslice base.u8

    var util : base.x86_sse42_utility
    var k    : base.x86_m128i
    var x0   : base.x86_m128i
    var x1   : base.x86_m128i
    var x2   : base.x86_m128i
    var x3   : base.x86_m128i
    var y0   : base.x86_m128i
    var y1   : base.x86_m128i
    var y2   : base.x86_m128i
    var y3   : base.x86_m128i

    var tail_index : base.u64

    s = 0xFFFF_FFFF ^ this.state

    // Align to a 16-byte boundary.
    while (args.x.length() > 0) and ((15 & args.x.uintptr_low_12_bits()) <> 0) {
        s = IEEE_TABLE[0][((s & 0xFF) as base.u8) ^ args.x[0]] ^ (s >> 8)
        args.x = args.x[1 ..]
    } endwhile

    // For short inputs, just do a simple loop.
    if args.x.length() < 64 {
        iterate (p = args.x)(length: 1, advance: 1, unroll: 1) {
            s = IEEE_TABLE[0][((s & 0xFF) as base.u8) ^ p[0]] ^ (s >> 8)
        }
        this.state = 0xFFFF_FFFF ^ s
        return nothing
    }

    // Load 128×4 = 512 bits from the first 64-byte chunk.
    x0 = util.make_m128i_slice128(a: args.x[0x00 .. 0x10])
    x1 = util.make_m128i_slice128(a: args.x[0x10 .. 0x20])
    x2 = util.make_m128i_slice128(a: args.x[0x20 .. 0x30])
    x3 = util.make_m128i_slice128(a: args.x[0x30 .. 0x40])

    // Combine with the initial state.
    x0 = x0._mm_xor_si128(b: util.make_m128i_single_u32(a: s))

    // Process the remaining 64-byte chunks.
    k = util.make_m128i_slice128(a: IEEE_X86_SSE42_K1K2[.. 16])
    iterate (p = args.x[64 ..])(length: 64, advance: 64, unroll: 1) {
        y0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x00)
        y1 = x1._mm_clmulepi64_si128(b: k, imm8: 0x00)
        y2 = x2._mm_clmulepi64_si128(b: k, imm8: 0x00)
        y3 = x3._mm_clmulepi64_si128(b: k, imm8: 0x00)

        x0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x11)
        x1 = x1._mm_clmulepi64_si128(b: k, imm8: 0x11)
        x2 = x2._mm_clmulepi64_si128(b: k, imm8: 0x11)
        x3 = x3._mm_clmulepi64_si128(b: k, imm8: 0x11)

        x0 = x0._mm_xor_si128(b: y0)._mm_xor_si128(b: util.make_m128i_slice128(a: p[0x00 .. 0x10]))
        x1 = x1._mm_xor_si128(b: y1)._mm_xor_si128(b: util.make_m128i_slice128(a: p[0x10 .. 0x20]))
        x2 = x2._mm_xor_si128(b: y2)._mm_xor_si128(b: util.make_m128i_slice128(a: p[0x20 .. 0x30]))
        x3 = x3._mm_xor_si128(b: y3)._mm_xor_si128(b: util.make_m128i_slice128(a: p[0x30 .. 0x40]))
    }

    // Reduce 128×4 = 512 bits to 128 bits.
    k = util.make_m128i_slice128(a: IEEE_X86_SSE42_K3K4[.. 16])
    y0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x00)
    x0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x11)
    x0 = x0._mm_xor_si128(b: x1)
    x0 = x0._mm_xor_si128(b: y0)
    y0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x00)
    x0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x11)
    x0 = x0._mm_xor_si128(b: x2)
    x0 = x0._mm_xor_si128(b: y0)
    y0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x00)
    x0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x11)
    x0 = x0._mm_xor_si128(b: x3)
    x0 = x0._mm_xor_si128(b: y0)

    // Reduce 128 bits to 64 bits.
    x1 = x0._mm_clmulepi64_si128(b: k, imm8: 0x10)
    x2 = util.make_m128i_multiple_u32(
            a00: 0xFFFF_FFFF,
            a01: 0x0000_0000,
            a02: 0xFFFF_FFFF,
            a03: 0x0000_0000)
    x0 = x0._mm_srli_si128(imm8: 8)
    x0 = x0._mm_xor_si128(b: x1)
    k = util.make_m128i_slice128(a: IEEE_X86_SSE42_K5ZZ[.. 16])
    x1 = x0._mm_srli_si128(imm8: 4)
    x0 = x0._mm_and_si128(b: x2)
    x0 = x0._mm_clmulepi64_si128(b: k, imm8: 0x00)
    x0 = x0._mm_xor_si128(b: x1)

    // Reduce 64 bits to 32 bits (Barrett Reduction) and extract.
    //
    // Barrett Reduction is Algorithm 1 (page 14) of Gopal et al., after
    // adjusting for bit-reflection as per Figure 12 (page 21).
    k = util.make_m128i_slice128(a: IEEE_X86_SSE42_PXMU[.. 16])
    x1 = x0._mm_and_si128(b: x2)
    x1 = x1._mm_clmulepi64_si128(b: k, imm8: 0x10)
    x1 = x1._mm_and_si128(b: x2)
    x1 = x1._mm_clmulepi64_si128(b: k, imm8: 0x00)
    x0 = x0._mm_xor_si128(b: x1)
    s = x0._mm_extract_epi32(imm8: 1)

    // Handle the tail of args.x that wasn't a complete 64-byte chunk.
    tail_index = args.x.length() & 0xFFFF_FFFF_FFFF_FFC0  // And-not 64.
    if tail_index < args.x.length() {
        iterate (p = args.x[tail_index ..])(length: 1, advance: 1, unroll: 1) {
            s = IEEE_TABLE[0][((s & 0xFF) as base.u8) ^ p[0]] ^ (s >> 8)
        }
    }

    this.state = 0xFFFF_FFFF ^ s
}

// These constants come from page 22 of Gopal et al. They are also reproduced
// by script/print-crc32-x86-sse42-magic-numbers.go which is runnable online at
// https://play.golang.org/p/wH1q6GfhKOE
//
// The k6' constant from the Gopal paper is unused.

pri const IEEE_X86_SSE42_K1K2 : roarray[16] base.u8 = [
        0xD4, 0x2B, 0x44, 0x54, 0x01, 0x00, 0x00, 0x00,  // k1' = 0x1_5444_2BD4
        0x96, 0x15, 0xE4, 0xC6, 0x01, 0x00, 0x00, 0x00,  // k2' = 0x1_C6E4_1596
]

pri const IEEE_X86_SSE42_K3K4 : roarray[16] base.u8 = [
        0xD0, 0x97, 0x19, 0x75, 0x01, 0x00, 0x00, 0x00,  // k3' = 0x1_7519_97D0
        0x9E, 0x00, 0xAA, 0xCC, 0x00, 0x00, 0x00, 0x00,  // k4' = 0x0_CCAA_009E
]

pri const IEEE_X86_SSE42_K5ZZ : roarray[16] base.u8 = [
        0x24, 0x61, 0xCD, 0x63, 0x01, 0x00, 0x00, 0x00,  // k5' = 0x1_63CD_6124
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Unused
]

pri const IEEE_X86_SSE42_PXMU : roarray[16] base.u8 = [
        0x41, 0x06, 0x71, 0xDB, 0x01, 0x00, 0x00, 0x00,  // Px' = 0x1_DB71_0641
        0x41, 0x16, 0x01, 0xF7, 0x01, 0x00, 0x00, 0x00,  // μ'  = 0x1_F701_1641
]
