// Copyright 2026 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build goexperiment.simd package archsimd // CarrylessMultiplyEven computes the carryless // multiplications of selected even halves of the elements of x and y. // // A carryless multiplication uses bitwise XOR instead of // add-with-carry, for example (in base two): // // 11 * 11 = 11 * (10 ^ 1) = (11 * 10) ^ (11 * 1) = 110 ^ 11 = 101 // // This also models multiplication of polynomials with coefficients // from GF(2) -- 11 * 11 models (x+1)*(x+1) = x**2 + (1^1)x + 1 = // x**2 + 0x + 1 = x**2 + 1 modeled by 101. (Note that "+" adds // polynomial terms, but coefficients "add" with XOR.) // // Asm: PMULL, CPU Feature: PMULL func (x Uint64x2) CarrylessMultiplyEven(y Uint64x2) Uint64x2 { return x.carrylessMultiplyWidenLo(y) } // CarrylessMultiplyOdd computes the carryless // multiplications of selected odd halves of the elements of x and y. // // A carryless multiplication uses bitwise XOR instead of // add-with-carry, for example (in base two): // // 11 * 11 = 11 * (10 ^ 1) = (11 * 10) ^ (11 * 1) = 110 ^ 11 = 101 // // This also models multiplication of polynomials with coefficients // from GF(2) -- 11 * 11 models (x+1)*(x+1) = x**2 + (1^1)x + 1 = // x**2 + 0x + 1 = x**2 + 1 modeled by 101. (Note that "+" adds // polynomial terms, but coefficients "add" with XOR.) // // Asm: PMULL, CPU Feature: PMULL func (x Uint64x2) CarrylessMultiplyOdd(y Uint64x2) Uint64x2 { return x.HiToLo().carrylessMultiplyWidenLo(y.HiToLo()) } // CarrylessMultiplyOddEven computes the carryless // multiplications of selected odd half of x's elements and even half of y's elements. // // A carryless multiplication uses bitwise XOR instead of // add-with-carry, for example (in base two): // // 11 * 11 = 11 * (10 ^ 1) = (11 * 10) ^ (11 * 1) = 110 ^ 11 = 101 // // This also models multiplication of polynomials with coefficients // from GF(2) -- 11 * 11 models (x+1)*(x+1) = x**2 + (1^1)x + 1 = // x**2 + 0x + 1 = x**2 + 1 modeled by 101. (Note that "+" adds // polynomial terms, but coefficients "add" with XOR.) // // Asm: PMULL, CPU Feature: PMULL func (x Uint64x2) CarrylessMultiplyOddEven(y Uint64x2) Uint64x2 { return x.HiToLo().carrylessMultiplyWidenLo(y) } // CarrylessMultiplyEvenOdd computes the carryless // multiplications of selected even half of x's elements and odd half of y's elements. // // A carryless multiplication uses bitwise XOR instead of // add-with-carry, for example (in base two): // // 11 * 11 = 11 * (10 ^ 1) = (11 * 10) ^ (11 * 1) = 110 ^ 11 = 101 // // This also models multiplication of polynomials with coefficients // from GF(2) -- 11 * 11 models (x+1)*(x+1) = x**2 + (1^1)x + 1 = // x**2 + 0x + 1 = x**2 + 1 modeled by 101. (Note that "+" adds // polynomial terms, but coefficients "add" with XOR.) // // Asm: PMULL, CPU Feature: PMULL func (x Uint64x2) CarrylessMultiplyEvenOdd(y Uint64x2) Uint64x2 { return x.carrylessMultiplyWidenLo(y.HiToLo()) }