| // 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()) |
| } |