Intel® oneAPI DPC++/C++ Compiler Developer Guide and Reference

ID 767253
Date 3/22/2024
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

Rules for Operators

To use operators with the Ivec classes you must use one of the following three syntax conventions, where

  • [ operator ] represents an operator (for example, &, |, or ^ )
  • [ Ivec_Class ] represents an Ivec class
  • R, A, B variables are declared using the pertinent Ivec classes

Convention One

Syntax:

 [ Ivec_Class ] R = [ Ivec_Class ] A [ operator ][ Ivec_Class ] B

Example:

 I64vec1 R = I64vec1 A & I64vec1 B;

Convention Two

Syntax:

[ Ivec_Class ] R =[ operator ] ([ Ivec_Class ] A,[ Ivec_Class ] B)

Example:

 I64vec1 R = andnot(I64vec1 A, I64vec1 B);

Convention Three

Syntax:

[ Ivec_Class ] R [ operator ]= [ Ivec_Class ] A

Example:

 I64vec1 R &= I64vec1 A;

Summary of Rules for Major Operators

The following table lists automatic and explicit sign and size typecasting. Explicit means that it is illegal to mix different types without an explicit typecasting. Automatic means that you can mix types freely and the compiler will do the typecasting for you.

Operators

Sign Typecasting

Size Typecasting

Other Typecasting Requirements

Assignment

N/A

N/A

N/A

Logical

Automatic

Automatic
(to left)

Explicit typecasting is required for different types used in non-logical expressions on the right side of the assignment.

Addition and Subtraction

Automatic

Explicit

N/A

Multiplication

Automatic

Explicit

N/A

Shift

Automatic

Explicit

Casting Required to ensure arithmetic shift.

Data Declaration and Initialization

The following table lists literal examples of constructor declarations and data type initialization for all class sizes. All values are initialized with the most significant element on the left and the least significant to the right.

Operation

Class

Syntax

Declaration

M128

I128vec1 A; Iu8vec16 A;

Declaration

M64

I64vec1 A; Iu8vec8 A;

__m128 Initialization

M128

I128vec1 A(__m128 m); Iu16vec8(__m128 m);

__m64 Initialization

M64

I64vec1 A(__m64 m);Iu8vec8 A(__m64 m);

__int64 Initialization

M64

I64vec1 A = __int64 m; Iu8vec8 A =__int64 m;