AVX Overloading Operation Class
This class is used to perform addition, subtraction, multiplication, and division of AVX instruction vectors of the same data type, as well as overloading operations such as 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 overloading operation functions.
- The language of AVX overloading operation functions is C++, and that of AVX instruction functions is C/C++.
Example
- 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; }
- Perform the compilation.
g++ testavx.cpp -o testavx -I/usr/local/ksl/include -L/usr/local/ksl/lib -lavx2ki
Output:1dst: 7 16