我要评分
获取效率
正确性
完整性
易理解

AVX Operator Overloading Class

AVX operator overloading performs overloaded operations between AVX instruction vectors and basic data types. These operations include addition, subtraction, multiplication, division, addition assignment, subtraction assignment, multiplication assignment, and division assignment.

Interface Definition

Addition:

__m128i operator + (const __m128i &a, const __m128i &b);

__m256i operator + (const __m256i &a, const __m256i &b);

__m256 operator + (const __m256 &a, const __m256 &b);

__m256d operator + (const __m256d &a, const __m256d &b);

__m512i operator + (const __m512i &a, const __m512i &b);

__m512 operator + (const __m512 &a, const __m512 &b);

__m512d operator + (const __m512d &a, const __m512d &b);

Subtraction:

__m128i operator - (const __m128i &a, const __m128i &b);

__m256i operator - (const __m256i &a, const __m256i &b);

__m256 operator - (const __m256 &a, const __m256 &b);

__m256d operator - (const __m256d &a, const __m256d &b);

__m512i operator - (const __m512i &a, const __m512i &b);

__m512 operator - (const __m512 &a, const __m512 &b);

__m512d operator - (const __m512d &a, const __m512d &b);

Multiplication:

__m128i operator * (const __m128i &a, const __m128i &b);

__m256i operator * (const __m256i &a, const __m256i &b);

__m256 operator * (const __m256 &a, const __m256 &b);

__m256d operator * (const __m256d &a, const __m256d &b);

__m512i operator * (const __m512i &a, const __m512i &b);

__m512 operator * (const __m512 &a, const __m512 &b);

__m512d operator * (const __m512d &a, const __m512d &b);

Division:

__m128i operator / (const __m128i &a, const __m128i &b);

__m256i operator / (const __m256i &a, const __m256i &b);

__m256 operator / (const __m256 &a, const __m256 &b);

__m256d operator / (const __m256d &a, const __m256d &b);

__m512i operator / (const __m512i &a, const __m512i &b);

__m512 operator / (const __m512 &a, const __m512 &b);

__m512d operator / (const __m512d &a, const __m512d &b);

AND:

__m128i operator & (const __m128i &a, const __m128i &b);

__m256i operator & (const __m256i &a, const __m256i &b);

__m256 operator & (const __m256 &a, const __m256 &b);

__m256d operator & (const __m256d &a, const __m256d &b);

__m512i operator & (const __m512i &a, const __m512i &b);

__m512 operator & (const __m512 &a, const __m512 &b);

__m512d operator & (const __m512d &a, const __m512d &b);

OR:

__m128i operator | (const __m128i &a, const __m128i &b);

__m256i operator | (const __m256i &a, const __m256i &b);

__m256 operator | (const __m256 &a, const __m256 &b);

__m256d operator | (const __m256d &a, const __m256d &b);

__m512i operator | (const __m512i &a, const __m512i &b);

__m512 operator | (const __m512 &a, const __m512 &b);

__m512d operator | (const __m512d &a, const __m512d &b);

XOR:

__m128i operator ^ (const __m128i &a, const __m128i &b);

__m256i operator ^ (const __m256i &a, const __m256i &b);

__m256 operator ^ (const __m256 &a, const __m256 &b);

__m256d operator ^ (const __m256d &a, const __m256d &b);

__m512i operator ^ (const __m512i &a, const __m512i &b);

__m512 operator ^ (const __m512 &a, const __m512 &b);

__m512d operator ^ (const __m512d &a, const __m512d &b);

Addition assignment:

__m128i &operator += (__m128i &a, const __m128i &b);

__m256i &operator += (__m256i &a, const __m256i &b);

__m256 &operator += (__m256 &a, const __m256 &b);

__m256d &operator += (__m256d &a, const __m256d &b);

__m512i &operator += (__m512i &a, const __m512i &b);

__m512 &operator += (__m512 &a, const __m512 &b);

__m512d &operator += (__m512d &a, const __m512d &b);

Subtraction assignment:

__m128i &operator -= (__m128i &a, const __m128i &b);

__m256i &operator -= (__m256i &a, const __m256i &b);

__m256 &operator -= (__m256 &a, const __m256 &b);

__m256d &operator -= (__m256d &a, const __m256d &b);

__m512i &operator -= (__m512i &a, const __m512i &b);

__m512 &operator -= (__m512 &a, const __m512 &b);

__m512d &operator -= (__m512d &a, const __m512d &b);

Multiplication assignment:

__m128i &operator *= (__m128i &a, const __m128i &b);

__m256i &operator *= (__m256i &a, const __m256i &b);

__m256 &operator *= (__m256 &a, const __m256 &b);

__m256d &operator *= (__m256d &a, const __m256d &b);

__m512i &operator *= (__m512i &a, const __m512i &b);

__m512 &operator *= (__m512 &a, const __m512 &b);

__m512d &operator *= (__m512d &a, const __m512d &b);

Division assignment:

__m128i &operator /= (__m128i &a, const __m128i &b);

__m256i &operator /= (__m256i &a, const __m256i &b);

__m256 &operator /= (__m256 &a, const __m256 &b);

__m256d &operator /= (__m256d &a, const __m256d &b);

__m512i &operator /= (__m512i &a, const __m512i &b);

__m512 &operator /= (__m512 &a, const __m512 &b);

__m512d &operator /= (__m512d &a, const __m512d &b);

AND assignment:

__m128i &operator &= (__m128i &a, const __m128i &b);

__m256i &operator &= (__m256i &a, const __m256i &b);

__m256 &operator &= (__m256 &a, const __m256 &b);

__m256d &operator &= (__m256d &a, const __m256d &b);

__m512i &operator &= (__m512i &a, const __m512i &b);

__m512 &operator &= (__m512 &a, const __m512 &b);

__m512d &operator &= (__m512d &a, const __m512d &b);

OR assignment:

__m128i &operator |= (__m128i &a, const __m128i &b);

__m256i &operator |= (__m256i &a, const __m256i &b);

__m256 &operator |= (__m256 &a, const __m256 &b);

__m256d &operator |= (__m256d &a, const __m256d &b);

__m512i &operator |= (__m512i &a, const __m512i &b);

__m512 &operator |= (__m512 &a, const __m512 &b);

__m512d &operator |= (__m512d &a, const __m512d &b);

XOR assignment:

__m128i &operator ^= (__m128i &a, const __m128i &b);

__m256i &operator ^= (__m256i &a, const __m256i &b);

__m256 &operator ^= (__m256 &a, const __m256 &b);

__m256d &operator ^= (__m256d &a, const __m256d &b);

__m512i &operator ^= (__m512i &a, const __m512i &b);

__m512 &operator ^= (__m512 &a, const __m512 &b);

__m512d &operator ^= (__m512d &a, const __m512d &b);

Parameters

Parameter

Description

Value Range

Input/Output

a

Reference to the instruction vector data type.

Unlimited

Input/Output

b

Reference to the instruction vector data type.

Unlimited

Input

Return Value

Instruction vector data of the same type as the input parameters.

  • The header file operatoroverload.h must be included separately to use the operator overloading functions.
  • The language of operator overloading functions is C++, and that of instruction functions is C/C++.

Example

  1. Create a testavx.cpp file with the following content.
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include "avx2ki.h"
    #include "operatoroverload.h"
    
    void OperatorExample()
    {
        int64_t a[2] = {-5, 13};
        int64_t b[2] = {12, 3};
        int64_t c[2] = {0};
        __m128i t1 = _mm_load_epi64(a);
        __m128i t2 = _mm_load_epi64(b);
        __m128i dst = t1 + t2;
        _mm_store_epi64(c, dst);
        printf("dst: %ld %ld\n", c[0], c[1]);
    }
    
    int main(void) {
        OperatorExample();
        return 0;
    }
    
  2. Perform the compilation.
    g++ testavx.cpp -o testavx -I/usr/local/ksl/include -L/usr/local/ksl/lib -lavx2ki
    Output:
    1
    dst: 7 16