Beaver.MLIR.Dialect.Arith (beaver v0.4.8)

Copy Markdown

This module defines functions for Ops in Arith dialect.

Summary

Functions

Return op name arith.addf as a bitstring.

arith.addf - floating point addition operation

Return op name arith.addi as a bitstring.

arith.addi - integer addition operation

Return op name arith.addui_extended as a bitstring.

arith.addui_extended -

Return op name arith.andi as a bitstring.

arith.andi - integer binary and

Return op name arith.bitcast as a bitstring.

arith.bitcast - bitcast between values of equal bit width

Return op name arith.ceildivsi as a bitstring.

arith.ceildivsi - signed ceil integer division operation

Return op name arith.ceildivui as a bitstring.

arith.ceildivui - unsigned ceil integer division operation

Return op name arith.cmpf as a bitstring.

arith.cmpf - floating-point comparison operation

Return op name arith.cmpi as a bitstring.

arith.cmpi - integer comparison operation

Return op name arith.constant as a bitstring.

arith.constant - integer or floating point constant

Return op name arith.convertf as a bitstring.

arith.convertf - cast between floating-point types of the same bitwidth

Return op name arith.divf as a bitstring.

arith.divf - floating point division operation

Return op name arith.divsi as a bitstring.

arith.divsi - signed integer division operation

Return op name arith.divui as a bitstring.

arith.divui - unsigned integer division operation

Return op name arith.extf as a bitstring.

arith.extf - cast from floating-point to wider floating-point

Return op name arith.extsi as a bitstring.

arith.extsi - integer sign extension operation

Return op name arith.extui as a bitstring.

arith.extui - integer zero extension operation

Return op name arith.floordivsi as a bitstring.

arith.floordivsi - signed floor integer division operation

Return op name arith.flush_denormals as a bitstring.

arith.flush_denormals - flush denormal floating-point values to zero

Return op name arith.fptosi as a bitstring.

arith.fptosi - cast from floating-point type to integer type

Return op name arith.fptoui as a bitstring.

arith.fptoui - cast from floating-point type to integer type

Return op name arith.index_cast as a bitstring.

arith.index_cast - cast between index and integer types

Return op name arith.index_castui as a bitstring.

arith.index_castui - unsigned cast between index and integer types

Return op name arith.maximumf as a bitstring.

arith.maximumf - floating-point maximum operation

Return op name arith.maxnumf as a bitstring.

arith.maxnumf - floating-point maximum operation

Return op name arith.maxsi as a bitstring.

arith.maxsi - signed integer maximum operation

Return op name arith.maxui as a bitstring.

arith.maxui - unsigned integer maximum operation

Return op name arith.minimumf as a bitstring.

arith.minimumf - floating-point minimum operation

Return op name arith.minnumf as a bitstring.

arith.minnumf - floating-point minimum operation

Return op name arith.minsi as a bitstring.

arith.minsi - signed integer minimum operation

Return op name arith.minui as a bitstring.

arith.minui - unsigned integer minimum operation

Return op name arith.mulf as a bitstring.

arith.mulf - floating point multiplication operation

Return op name arith.muli as a bitstring.

arith.muli -

Return op name arith.mulsi_extended as a bitstring.

arith.mulsi_extended -

Return op name arith.mului_extended as a bitstring.

arith.mului_extended -

Return op name arith.negf as a bitstring.

arith.negf - floating point negation

Return op name arith.ori as a bitstring.

arith.ori - integer binary or

Return op name arith.remf as a bitstring.

arith.remf - floating point division remainder operation

Return op name arith.remsi as a bitstring.

arith.remsi - signed integer division remainder operation

Return op name arith.remui as a bitstring.

arith.remui - unsigned integer division remainder operation

Return op name arith.scaling_extf as a bitstring.

arith.scaling_extf - Upcasts input floats using provided scales values following OCP MXFP Spec

Return op name arith.scaling_truncf as a bitstring.

arith.scaling_truncf - Downcasts input floating point values using provided scales values following OCP MXFP Spec

Return op name arith.select as a bitstring.

arith.select - select operation

Return op name arith.shli as a bitstring.

arith.shli - integer left-shift

Return op name arith.shrsi as a bitstring.

arith.shrsi - signed integer right-shift

Return op name arith.shrui as a bitstring.

arith.shrui - unsigned integer right-shift

Return op name arith.sitofp as a bitstring.

arith.sitofp - cast from integer type to floating-point

Return op name arith.subf as a bitstring.

arith.subf - floating point subtraction operation

Return op name arith.subi as a bitstring.

arith.subi -

Return op name arith.subui_extended as a bitstring.

arith.subui_extended -

Return op name arith.truncf as a bitstring.

arith.truncf - cast from floating-point to narrower floating-point

Return op name arith.trunci as a bitstring.

arith.trunci - integer truncation operation

Return op name arith.uitofp as a bitstring.

arith.uitofp - cast from unsigned integer type to floating-point

Return op name arith.xori as a bitstring.

arith.xori - integer binary xor

Functions

addf()

Return op name arith.addf as a bitstring.

addf(ssa)

arith.addf - floating point addition operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags
  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The addf operation takes two operands and returns one result, each of these is required to be the same type. This type may be a floating point scalar type, a vector whose element type is a floating point type, or a floating point tensor.

Example:

// Scalar addition.
%a = arith.addf %b, %c : f64

// SIMD vector addition, e.g. for Intel SSE.
%f = arith.addf %g, %h : vector<4xf32>

// Tensor addition.
%x = arith.addf %y, %z : tensor<4x?xbf16>

// Scalar addition with rounding mode.
%a = arith.addf %b, %c to_nearest_even : f64

addi()

Return op name arith.addi as a bitstring.

addi(ssa)

arith.addi - integer addition operation

This op has support for result type inference.

Attributes

  • overflowFlags - Single, Arith_IntegerOverflowAttr, Integer overflow arith flags

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Performs N-bit addition on the operands. The operands are interpreted as unsigned bitvectors. The result is represented by a bitvector containing the mathematical value of the addition modulo 2^n, where n is the bitwidth. Because arith integers use a two's complement representation, this operation is applicable on both signed and unsigned integer operands.

The addi operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers.

This op supports nuw/nsw overflow flags which stands for "No Unsigned Wrap" and "No Signed Wrap", respectively. If the nuw and/or nsw flags are present, and an unsigned/signed overflow occurs (respectively), the result is poison.

Example:

// Scalar addition.
%a = arith.addi %b, %c : i64

// Scalar addition with overflow flags.
%a = arith.addi %b, %c overflow<nsw, nuw> : i64

// SIMD vector element-wise addition.
%f = arith.addi %g, %h : vector<4xi32>

// Tensor element-wise addition.
%x = arith.addi %y, %z : tensor<4x?xi8>

addui_extended()

Return op name arith.addui_extended as a bitstring.

addui_extended(ssa)

arith.addui_extended -

extended unsigned integer addition operation returning sum and overflow bit

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • sum - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • overflow - Single, BoolLike, bool-like

Description

Performs (N+1)-bit addition on zero-extended operands. Returns two results: the N-bit sum (same type as both operands), and the overflow bit (boolean-like), where 1 indicates unsigned addition overflow, while 0 indicates no overflow.

Example:

// Scalar addition.
%sum, %overflow = arith.addui_extended %b, %c : i64, i1

// Vector element-wise addition.
%d:2 = arith.addui_extended %e, %f : vector<4xi32>, vector<4xi1>

// Tensor element-wise addition.
%x:2 = arith.addui_extended %y, %z : tensor<4x?xi8>, tensor<4x?xi1>

andi()

Return op name arith.andi as a bitstring.

andi(ssa)

arith.andi - integer binary and

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The andi operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers. It has no standard attributes.

Example:

// Scalar integer bitwise and.
%a = arith.andi %b, %c : i64

// SIMD vector element-wise bitwise integer and.
%f = arith.andi %g, %h : vector<4xi32>

// Tensor element-wise bitwise integer and.
%x = arith.andi %y, %z : tensor<4x?xi8>

bitcast()

Return op name arith.bitcast as a bitstring.

bitcast(ssa)

arith.bitcast - bitcast between values of equal bit width

Operands

  • in - Single, BitcastTypeConstraint, non-zero-bitwidth-signless-integer-or-float-like or memref of non-zero-bitwidth signless integer or float

Results

  • out - Single, BitcastTypeConstraint, non-zero-bitwidth-signless-integer-or-float-like or memref of non-zero-bitwidth signless integer or float

Description

Bitcast an integer or floating point value to an integer or floating point value of equal bit width. When operating on vectors, casts elementwise.

Note that this implements a logical bitcast independent of target endianness. This allows constant folding without target information and is consitent with the bitcast constant folders in LLVM (see https://github.com/llvm/llvm-project/blob/18c19414eb/llvm/lib/IR/ConstantFold.cpp#L168) For targets where the source and target type have the same endianness (which is the standard), this cast will also change no bits at runtime, but it may still require an operation, for example if the machine has different floating point and integer register files. For targets that have a different endianness for the source and target types (e.g. float is big-endian and integer is little-endian) a proper lowering would add operations to swap the order of words in addition to the bitcast.

ceildivsi()

Return op name arith.ceildivsi as a bitstring.

ceildivsi(ssa)

arith.ceildivsi - signed ceil integer division operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Signed integer division. Rounds towards positive infinity, i.e. 7 / -2 = -3.

Divison by zero, or signed division overflow (minimum value divided by -1) is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any of its elements are divided by zero or has a signed division overflow.

Example:

// Scalar signed integer division.
%a = arith.ceildivsi %b, %c : i64

ceildivui()

Return op name arith.ceildivui as a bitstring.

ceildivui(ssa)

arith.ceildivui - unsigned ceil integer division operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Unsigned integer division. Rounds towards positive infinity. Treats the leading bit as the most significant, i.e. for i16 given two's complement representation, 6 / -2 = 6 / (2^16 - 2) = 1.

Division by zero is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any elements are divided by zero.

Example:

// Scalar unsigned integer division.
%a = arith.ceildivui %b, %c : i64

cmp_f_predicate(type)

cmp_i_predicate(type)

cmpf()

Return op name arith.cmpf as a bitstring.

cmpf(ssa)

arith.cmpf - floating-point comparison operation

This op has support for result type inference.

Attributes

  • predicate - Single, Arith_CmpFPredicateAttr, allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, BoolLike, bool-like

Description

The cmpf operation compares its two operands according to the float comparison rules and the predicate specified by the respective attribute. The predicate defines the type of comparison: (un)orderedness, (in)equality and signed less/greater than (or equal to) as well as predicates that are always true or false. The operands must have the same type, and this type must be a float type, or a vector or tensor thereof. The result is an i1, or a vector/tensor thereof having the same shape as the inputs. Unlike cmpi, the operands are always treated as signed. The u prefix indicates unordered comparison, not unsigned comparison, so "une" means unordered or not equal. For the sake of readability by humans, custom assembly form for the operation uses a string-typed attribute for the predicate. The value of this attribute corresponds to lower-cased name of the predicate constant, e.g., "one" means "ordered not equal". The string representation of the attribute is merely a syntactic sugar and is converted to an integer attribute by the parser.

Example:

%r1 = arith.cmpf oeq, %0, %1 : f32
%r2 = arith.cmpf ult, %0, %1 : tensor<42x42xf64>
%r3 = "arith.cmpf"(%0, %1) {predicate: 0} : (f8, f8) -> i1

cmpi()

Return op name arith.cmpi as a bitstring.

cmpi(ssa)

arith.cmpi - integer comparison operation

This op has support for result type inference.

Attributes

  • predicate - Single, Arith_CmpIPredicateAttr, allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, BoolLike, bool-like

Description

The cmpi operation is a generic comparison for integer-like types. Its two arguments can be integers, vectors or tensors thereof as long as their types match. The operation produces an i1 for the former case, a vector or a tensor of i1 with the same shape as inputs in the other cases.

Its first argument is an attribute that defines which type of comparison is performed. The following comparisons are supported:

  • equal (mnemonic: "eq"; integer value: 0)
  • not equal (mnemonic: "ne"; integer value: 1)
  • signed less than (mnemonic: "slt"; integer value: 2)
  • signed less than or equal (mnemonic: "sle"; integer value: 3)
  • signed greater than (mnemonic: "sgt"; integer value: 4)
  • signed greater than or equal (mnemonic: "sge"; integer value: 5)
  • unsigned less than (mnemonic: "ult"; integer value: 6)
  • unsigned less than or equal (mnemonic: "ule"; integer value: 7)
  • unsigned greater than (mnemonic: "ugt"; integer value: 8)
  • unsigned greater than or equal (mnemonic: "uge"; integer value: 9)

The result is 1 if the comparison is true and 0 otherwise. For vector or tensor operands, the comparison is performed elementwise and the element of the result indicates whether the comparison is true for the operand elements with the same indices as those of the result.

Note: while the custom assembly form uses strings, the actual underlying attribute has integer type (or rather enum class in C++ code) as seen from the generic assembly form. String literals are used to improve readability of the IR by humans.

This operation only applies to integer-like operands, but not floats. The main reason being that comparison operations have diverging sets of attributes: integers require sign specification while floats require various floating point-related particularities, e.g., -ffast-math behavior, IEEE754 compliance, etc (rationale). The type of comparison is specified as attribute to avoid introducing ten similar operations, taking into account that they are often implemented using the same operation downstream (rationale). The separation between signed and unsigned order comparisons is necessary because of integers being signless. The comparison operation must know how to interpret values with the foremost bit being set: negatives in two's complement or large positives (rationale).

Example:

// Custom form of scalar "signed less than" comparison.
%x = arith.cmpi slt, %lhs, %rhs : i32

// Generic form of the same operation.
%x = "arith.cmpi"(%lhs, %rhs) {predicate = 2 : i64} : (i32, i32) -> i1

// Custom form of vector equality comparison.
%x = arith.cmpi eq, %lhs, %rhs : vector<4xi64>

// Generic form of the same operation.
%x = "arith.cmpi"(%lhs, %rhs) {predicate = 0 : i64}
    : (vector<4xi64>, vector<4xi64>) -> vector<4xi1>

constant()

Return op name arith.constant as a bitstring.

constant(ssa)

arith.constant - integer or floating point constant

This op has support for result type inference.

Attributes

  • value - Single, TypedAttrInterface, TypedAttr instance

Results

  • result - Single, AnyType, any non-token type

Description

The constant operation produces an SSA value equal to some integer or floating-point constant specified by an attribute. This is the way MLIR forms simple integer and floating point constants.

Example:

// Integer constant
%1 = arith.constant 42 : i32

// Equivalent generic form
%1 = "arith.constant"() {value = 42 : i32} : () -> i32

convertf()

Return op name arith.convertf as a bitstring.

convertf(ssa)

arith.convertf - cast between floating-point types of the same bitwidth

Attributes

  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode
  • fastmath - Optional, Arith_FastMathAttr, Floating point fast math flags

Operands

  • in - Single, FloatLike, floating-point-like

Results

  • out - Single, FloatLike, floating-point-like

Description

Cast a floating-point value to a different floating-point type of the same bitwidth. This operation handles conversions between types that have the same bitwidth but different semantics (e.g., f16 to bf16), which cannot be represented by arith.extf or arith.truncf.

The source and destination element types must be different and must have the same bitwidth. When operating on vectors, casts elementwise.

divf()

Return op name arith.divf as a bitstring.

divf(ssa)

arith.divf - floating point division operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags
  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The divf operation takes two operands and returns one result, each of these is required to be the same type. This type may be a floating point scalar type, a vector whose element type is a floating point type, or a floating point tensor.

Example:

// Scalar division.
%a = arith.divf %b, %c : f64

// Scalar division with rounding mode.
%a = arith.divf %b, %c toward_zero : f64

divsi()

Return op name arith.divsi as a bitstring.

divsi(ssa)

arith.divsi - signed integer division operation

This op has support for result type inference.

Attributes

  • isExact - Optional, UnitAttr, unit attribute

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Signed integer division. Rounds towards zero. Treats the leading bit as sign, i.e. 6 / -2 = -3.

Divison by zero, or signed division overflow (minimum value divided by -1) is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any of its elements are divided by zero or has a signed division overflow.

If the exact attribute is present, the result value is poison if lhs is not a multiple of rhs.

Example:

// Scalar signed integer division.
%a = arith.divsi %b, %c : i64

// Scalar signed integer division where %b is known to be a multiple of %c.
%a = arith.divsi %b, %c exact : i64

// SIMD vector element-wise division.
%f = arith.divsi %g, %h : vector<4xi32>

// Tensor element-wise integer division.
%x = arith.divsi %y, %z : tensor<4x?xi8>

divui()

Return op name arith.divui as a bitstring.

divui(ssa)

arith.divui - unsigned integer division operation

This op has support for result type inference.

Attributes

  • isExact - Optional, UnitAttr, unit attribute

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Unsigned integer division. Rounds towards zero. Treats the leading bit as the most significant, i.e. for i16 given two's complement representation, 6 / -2 = 6 / (2^16 - 2) = 0.

Division by zero is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any elements are divided by zero.

If the exact attribute is present, the result value is poison if lhs is not a multiple of rhs.

Example:

// Scalar unsigned integer division.
%a = arith.divui %b, %c : i64

// Scalar unsigned integer division where %b is known to be a multiple of %c.
%a = arith.divui %b, %c exact : i64

// SIMD vector element-wise division.
%f = arith.divui %g, %h : vector<4xi32>

// Tensor element-wise integer division.
%x = arith.divui %y, %z : tensor<4x?xi8>

extf()

Return op name arith.extf as a bitstring.

extf(ssa)

arith.extf - cast from floating-point to wider floating-point

Attributes

  • fastmath - Optional, Arith_FastMathAttr, Floating point fast math flags

Operands

  • in - Single, FloatLike, floating-point-like

Results

  • out - Single, FloatLike, floating-point-like

Description

Cast a floating-point value to a larger floating-point-typed value. The destination type must to be strictly wider than the source type. When operating on vectors, casts elementwise.

extsi()

Return op name arith.extsi as a bitstring.

extsi(ssa)

arith.extsi - integer sign extension operation

Operands

  • in - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Results

  • out - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Description

The integer sign extension operation takes an integer input of width M and an integer destination type of width N. The destination bit-width must be larger than the input bit-width (N > M). The top-most (N - M) bits of the output are filled with copies of the most-significant bit of the input.

Example:

%1 = arith.constant 5 : i3      // %1 is 0b101
%2 = arith.extsi %1 : i3 to i6  // %2 is 0b111101
%3 = arith.constant 2 : i3      // %3 is 0b010
%4 = arith.extsi %3 : i3 to i6  // %4 is 0b000010

%5 = arith.extsi %0 : vector<2 x i32> to vector<2 x i64>

extui()

Return op name arith.extui as a bitstring.

extui(ssa)

arith.extui - integer zero extension operation

Attributes

  • nonNeg - Optional, UnitAttr, unit attribute

Operands

  • in - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Results

  • out - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Description

The integer zero extension operation takes an integer input of width M and an integer destination type of width N. The destination bit-width must be larger than the input bit-width (N > M). The top-most (N - M) bits of the output are filled with zeros.

When the nneg flag is present, the operand is assumed to have the most significant bit set to 0. In this case, zero extension is equivalent to sign extension. When this assumption is violated, the result is poison.

Example:

  %1 = arith.constant 5 : i3      // %1 is 0b101
  %2 = arith.extui %1 : i3 to i6  // %2 is 0b000101
  %3 = arith.constant 2 : i3      // %3 is 0b010
  %4 = arith.extui %3 : i3 to i6  // %4 is 0b000010

  %5 = arith.extui %0 : vector<2 x i32> to vector<2 x i64>

  // Zero extension with nneg flag.
  %6 = arith.extui %3 nneg : i3 to i6

floordivsi()

Return op name arith.floordivsi as a bitstring.

floordivsi(ssa)

arith.floordivsi - signed floor integer division operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Signed integer division. Rounds towards negative infinity, i.e. 5 / -2 = -3.

Divison by zero, or signed division overflow (minimum value divided by -1) is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any of its elements are divided by zero or has a signed division overflow.

Example:

// Scalar signed integer division.
%a = arith.floordivsi %b, %c : i64

flush_denormals()

Return op name arith.flush_denormals as a bitstring.

flush_denormals(ssa)

arith.flush_denormals - flush denormal floating-point values to zero

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • operand - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The flush_denormals operation takes a floating-point value and returns the input value if it is a normal (or zero, infinity, or NaN) value, or a zero of the same type if the input is a denormal (subnormal) value. The sign of zero is preserved when flushing a denormal: negative denormals flush to -0.0, positive denormals flush to +0.0.

A denormal number ("subnormal number" in IEEE-754) is a non-zero floating point number that is smaller (closer to zero) than the smallest normal number. Denormals fill the underflow gap around zero in floating-point arithmetics, but may come at a runtime cost on some architectures.

The input and result are required to be the same type. This type may be a floating-point scalar type, a vector whose element type is a floating-point type, or a tensor of floats. When operating on vectors or tensors, the operation is applied elementwise.

Example:

// Scalar denormal flushing.
%a = arith.flush_denormals %b : f32

// SIMD vector element-wise denormal flushing.
%f = arith.flush_denormals %g : vector<4xf32>

// Tensor element-wise denormal flushing.
%x = arith.flush_denormals %y : tensor<4x?xbf16>

fptosi()

Return op name arith.fptosi as a bitstring.

fptosi(ssa)

arith.fptosi - cast from floating-point type to integer type

Operands

  • in - Single, FloatLike, floating-point-like

Results

  • out - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Description

Cast from a value interpreted as floating-point to the nearest (rounding towards zero) signed integer value. When operating on vectors, casts elementwise.

fptoui()

Return op name arith.fptoui as a bitstring.

fptoui(ssa)

arith.fptoui - cast from floating-point type to integer type

Operands

  • in - Single, FloatLike, floating-point-like

Results

  • out - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Description

Cast from a value interpreted as floating-point to the nearest (rounding towards zero) unsigned integer value. When operating on vectors, casts elementwise.

index_cast()

Return op name arith.index_cast as a bitstring.

index_cast(ssa)

arith.index_cast - cast between index and integer types

Operands

  • in - Single, IndexCastTypeConstraint, signless-non-zero-bitwidth-integer-like or memref of signless-integer

Results

  • out - Single, IndexCastTypeConstraint, signless-non-zero-bitwidth-integer-like or memref of signless-integer

Description

Casts between scalar or vector integers and corresponding 'index' scalar or vectors. Index is an integer of platform-specific bit width. If casting to a wider integer, the value is sign-extended. If casting to a narrower integer, the value is truncated.

index_castui()

Return op name arith.index_castui as a bitstring.

index_castui(ssa)

arith.index_castui - unsigned cast between index and integer types

Attributes

  • nonNeg - Optional, UnitAttr, unit attribute

Operands

  • in - Single, IndexCastTypeConstraint, signless-non-zero-bitwidth-integer-like or memref of signless-integer

Results

  • out - Single, IndexCastTypeConstraint, signless-non-zero-bitwidth-integer-like or memref of signless-integer

Description

Casts between scalar or vector integers and corresponding 'index' scalar or vectors. Index is an integer of platform-specific bit width. If casting to a wider integer, the value is zero-extended. If casting to a narrower integer, the value is truncated.

When the nneg flag is present, the operand is assumed to have the most significant bit set to 0. In this case, zero extension is equivalent to sign extension. When this assumption is violated, the result is poison.

Example:

  %0 = arith.index_castui %a : i32 to index
  %1 = arith.index_castui %a nneg : i32 to index
  %2 = arith.index_castui %b nneg : index to i64

maximumf()

Return op name arith.maximumf as a bitstring.

maximumf(ssa)

arith.maximumf - floating-point maximum operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

Returns the maximum of the two arguments, treating -0.0 as less than +0.0. If one of the arguments is NaN, then the result is also NaN.

Example:

// Scalar floating-point maximum.
%a = arith.maximumf %b, %c : f64

maxnumf()

Return op name arith.maxnumf as a bitstring.

maxnumf(ssa)

arith.maxnumf - floating-point maximum operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

Returns the maximum of the two arguments. If the arguments are -0.0 and +0.0, then the result is either of them. If one of the arguments is NaN, then the result is the other argument.

Example:

// Scalar floating-point maximum.
%a = arith.maxnumf %b, %c : f64

maxsi()

Return op name arith.maxsi as a bitstring.

maxsi(ssa)

arith.maxsi - signed integer maximum operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

maxui()

Return op name arith.maxui as a bitstring.

maxui(ssa)

arith.maxui - unsigned integer maximum operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

minimumf()

Return op name arith.minimumf as a bitstring.

minimumf(ssa)

arith.minimumf - floating-point minimum operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

Returns the minimum of the two arguments, treating -0.0 as less than +0.0. If one of the arguments is NaN, then the result is also NaN.

Example:

// Scalar floating-point minimum.
%a = arith.minimumf %b, %c : f64

minnumf()

Return op name arith.minnumf as a bitstring.

minnumf(ssa)

arith.minnumf - floating-point minimum operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

Returns the minimum of the two arguments. If the arguments are -0.0 and +0.0, then the result is either of them. If one of the arguments is NaN, then the result is the other argument.

Example:

// Scalar floating-point minimum.
%a = arith.minnumf %b, %c : f64

minsi()

Return op name arith.minsi as a bitstring.

minsi(ssa)

arith.minsi - signed integer minimum operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

minui()

Return op name arith.minui as a bitstring.

minui(ssa)

arith.minui - unsigned integer minimum operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

mulf()

Return op name arith.mulf as a bitstring.

mulf(ssa)

arith.mulf - floating point multiplication operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags
  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The mulf operation takes two operands and returns one result, each of these is required to be the same type. This type may be a floating point scalar type, a vector whose element type is a floating point type, or a floating point tensor.

Example:

// Scalar multiplication.
%a = arith.mulf %b, %c : f64

// SIMD pointwise vector multiplication, e.g. for Intel SSE.
%f = arith.mulf %g, %h : vector<4xf32>

// Tensor pointwise multiplication.
%x = arith.mulf %y, %z : tensor<4x?xbf16>

// Scalar multiplication with rounding mode.
%a = arith.mulf %b, %c upward : f64

muli()

Return op name arith.muli as a bitstring.

muli(ssa)

arith.muli -

Integer multiplication operation.

This op has support for result type inference.

Attributes

  • overflowFlags - Single, Arith_IntegerOverflowAttr, Integer overflow arith flags

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Performs N-bit multiplication on the operands. The operands are interpreted as unsigned bitvectors. The result is represented by a bitvector containing the mathematical value of the multiplication modulo 2^n, where n is the bitwidth. Because arith integers use a two's complement representation, this operation is applicable on both signed and unsigned integer operands.

The muli operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers.

This op supports nuw/nsw overflow flags which stands for "No Unsigned Wrap" and "No Signed Wrap", respectively. If the nuw and/or nsw flags are present, and an unsigned/signed overflow occurs (respectively), the result is poison.

Example:

// Scalar multiplication.
%a = arith.muli %b, %c : i64

// Scalar multiplication with overflow flags.
%a = arith.muli %b, %c overflow<nsw, nuw> : i64

// SIMD vector element-wise multiplication.
%f = arith.muli %g, %h : vector<4xi32>

// Tensor element-wise multiplication.
%x = arith.muli %y, %z : tensor<4x?xi8>

mulsi_extended()

Return op name arith.mulsi_extended as a bitstring.

mulsi_extended(ssa)

arith.mulsi_extended -

extended signed integer multiplication operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • low - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • high - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Performs (2*N)-bit multiplication on sign-extended operands. Returns two N-bit results: the low and the high halves of the product. The low half has the same value as the result of regular multiplication arith.muli with the same operands.

Example:

// Scalar multiplication.
%low, %high = arith.mulsi_extended %a, %b : i32

// Vector element-wise multiplication.
%c:2 = arith.mulsi_extended %d, %e : vector<4xi32>

// Tensor element-wise multiplication.
%x:2 = arith.mulsi_extended %y, %z : tensor<4x?xi8>

mului_extended()

Return op name arith.mului_extended as a bitstring.

mului_extended(ssa)

arith.mului_extended -

extended unsigned integer multiplication operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • low - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • high - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Performs (2*N)-bit multiplication on zero-extended operands. Returns two N-bit results: the low and the high halves of the product. The low half has the same value as the result of regular multiplication arith.muli with the same operands.

Example:

// Scalar multiplication.
%low, %high = arith.mului_extended %a, %b : i32

// Vector element-wise multiplication.
%c:2 = arith.mului_extended %d, %e : vector<4xi32>

// Tensor element-wise multiplication.
%x:2 = arith.mului_extended %y, %z : tensor<4x?xi8>

negf()

Return op name arith.negf as a bitstring.

negf(ssa)

arith.negf - floating point negation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • operand - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The negf operation computes the negation of a given value. It takes one operand and returns one result of the same type. This type may be a float scalar type, a vector whose element type is float, or a tensor of floats. It has no standard attributes.

Example:

// Scalar negation value.
%a = arith.negf %b : f64

// SIMD vector element-wise negation value.
%f = arith.negf %g : vector<4xf32>

// Tensor element-wise negation value.
%x = arith.negf %y : tensor<4x?xf8>

operator_to_predicate(operator, signed \\ true)

ori()

Return op name arith.ori as a bitstring.

ori(ssa)

arith.ori - integer binary or

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The ori operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers. It has no standard attributes.

Example:

// Scalar integer bitwise or.
%a = arith.ori %b, %c : i64

// SIMD vector element-wise bitwise integer or.
%f = arith.ori %g, %h : vector<4xi32>

// Tensor element-wise bitwise integer or.
%x = arith.ori %y, %z : tensor<4x?xi8>

remf()

Return op name arith.remf as a bitstring.

remf(ssa)

arith.remf - floating point division remainder operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

Returns the floating point division remainder. The remainder has the same sign as the dividend (lhs operand).

TODO: Add support for rounding modes.

remsi()

Return op name arith.remsi as a bitstring.

remsi(ssa)

arith.remsi - signed integer division remainder operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Signed integer division remainder. Treats the leading bit as sign, i.e. 6 % -2 = 0.

Division by zero is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any elements are divided by zero.

Example:

// Scalar signed integer division remainder.
%a = arith.remsi %b, %c : i64

// SIMD vector element-wise division remainder.
%f = arith.remsi %g, %h : vector<4xi32>

// Tensor element-wise integer division remainder.
%x = arith.remsi %y, %z : tensor<4x?xi8>

remui()

Return op name arith.remui as a bitstring.

remui(ssa)

arith.remui - unsigned integer division remainder operation

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Unsigned integer division remainder. Treats the leading bit as the most significant, i.e. for i16, 6 % -2 = 6 % (2^16 - 2) = 6.

Division by zero is undefined behavior. When applied to vector and tensor values, the behavior is undefined if any elements are divided by zero.

Example:

// Scalar unsigned integer division remainder.
%a = arith.remui %b, %c : i64

// SIMD vector element-wise division remainder.
%f = arith.remui %g, %h : vector<4xi32>

// Tensor element-wise integer division remainder.
%x = arith.remui %y, %z : tensor<4x?xi8>

scaling_extf()

Return op name arith.scaling_extf as a bitstring.

scaling_extf(ssa)

arith.scaling_extf - Upcasts input floats using provided scales values following OCP MXFP Spec

Attributes

  • fastmath - Optional, Arith_FastMathAttr, Floating point fast math flags

Operands

  • in - Single, FloatLike, floating-point-like
  • scale - Single, FloatLike, floating-point-like

Results

  • out - Single, FloatLike, floating-point-like

Description

This operation upcasts input floating-point values using provided scale values. It expects both scales and the input operand to be of the same shape, making the operation elementwise. Scales are usually calculated per block following the OCP MXFP spec as described in https://arxiv.org/abs/2310.10537.

If scales are calculated per block where blockSize != 1, then scales may require broadcasting to make this operation elementwise. For example, let's say the input is of shape <dim1 x dim2 x ... dimN>. Given blockSize != 1 and assuming quantization happens on the last axis, the input can be reshaped to <dim1 x dim2 x ... (dimN/blockSize) x blockSize>. Scales will be calculated per block on the last axis. Therefore, scales will be of shape <dim1 x dim2 x ... (dimN/blockSize) x 1>. Scales could also be of some other shape as long as it is broadcast compatible with the input, e.g., <1 x 1 x ... (dimN/blockSize) x 1>.

In this example, before calling into arith.scaling_extf, scales must be broadcasted to <dim1 x dim2 x dim3 ... (dimN/blockSize) x blockSize>. Note that there could be multiple quantization axes. Internally, arith.scaling_extf would perform the following:

// Cast scale to result type.
%0 = arith.truncf %1 : f32 to f8E8M0FNU
%1 = arith.extf %0 : f8E8M0FNU to f16

// Cast input to result type.
%2 = arith.extf %3 : f4E2M1FN to f16

// Perform scaling
%3 = arith.mulf %2, %1 : f16

It propagates NaN values. Therefore, if either scale or the input element contains NaN, then the output element value will also be a NaN.

Example:

// Upcast from f4E2M1FN to f32.
%a = arith.scaling_extf %b, %c : f4E2M1FN, f8E8M0FNU to f32

// Element-wise upcast with broadcast (blockSize = 32).
%f = vector.broadcast %g : vector<1xf8E8M0FNU> to vector<32xf8E8M0FNU>
%h = arith.scaling_extf %i, %f : vector<32xf4E2M1FN>, vector<32xf8E8M0FNU> to vector<32xbf16>

scaling_truncf()

Return op name arith.scaling_truncf as a bitstring.

scaling_truncf(ssa)

arith.scaling_truncf - Downcasts input floating point values using provided scales values following OCP MXFP Spec

Attributes

  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode
  • fastmath - Optional, Arith_FastMathAttr, Floating point fast math flags

Operands

  • in - Single, FloatLike, floating-point-like
  • scale - Single, FloatLike, floating-point-like

Results

  • out - Single, FloatLike, floating-point-like

Description

This operation downcasts input using the provided scale values. It expects both scales and the input operand to be of the same shape and, therefore, makes the operation elementwise. Scales are usually calculated per block following the OCP MXFP spec as described in https://arxiv.org/abs/2310.10537. Users are required to normalize and clamp the scales as necessary before calling passing them to this operation. OCP MXFP spec also does the flushing of denorms on the input operand, which should be handled during lowering by passing appropriate fastMath flag to this operation.

If scales are calculated per block where blockSize != 1, scales may require broadcasting to make this operation elementwise. For example, let's say the input is of shape <dim1 x dim2 x ... dimN>. Given blockSize != 1 and assuming quantization happens on the last axis, the input can be reshaped to <dim1 x dim2 x ... (dimN/blockSize) x blockSize>. Scales will be calculated per block on the last axis. Therefore, scales will be of shape <dim1 x dim2 x ... (dimN/blockSize) x 1>. Scales could also be of some other shape as long as it is broadcast compatible with the input, e.g., <1 x 1 x ... (dimN/blockSize) x 1>.

In this example, before calling into arith.scaling_truncf, scales must be broadcasted to <dim1 x dim2 x dim3 ... (dimN/blockSize) x blockSize>. Note that there could be multiple quantization axes. Internally, arith.scaling_truncf would perform the following:

// Cast scale to input type.
%0 = arith.truncf %1 : f32 to f8E8M0FNU
%1 = arith.extf %0 : f8E8M0FNU to f16

// Perform scaling.
%3 = arith.divf %2, %1 : f16

// Cast to result type.
%4 = arith.truncf %3 : f16 to f4E2M1FN

Example:

// Downcast from f32 to f4E2M1FN.
%a = arith.scaling_truncf %b, %c : f32, f8E8M0FNU to f4E2M1FN

// Element-wise downcast with broadcast (blockSize = 32).
%f = vector.broadcast %g : vector<1xf8E8M0FNU> to vector<32xf8E8M0FNU>
%h = arith.scaling_truncf %i, %f : vector<32xbf16>, vector<32xf8E8M0FNU> to vector<32xf4E2M1FN>

select()

Return op name arith.select as a bitstring.

select(ssa)

arith.select - select operation

This op has support for result type inference.

Operands

  • condition - Single, BoolLike, bool-like
  • true_value - Single, AnyType, any non-token type
  • false_value - Single, AnyType, any non-token type

Results

  • result - Single, AnyType, any non-token type

Description

The arith.select operation chooses one value based on a binary condition supplied as its first operand.

If the value of the first operand (the condition) is 1, then the second operand is returned, and the third operand is ignored, even if it was poison.

If the value of the first operand (the condition) is 0, then the third operand is returned, and the second operand is ignored, even if it was poison.

If the value of the first operand (the condition) is poison, then the operation returns poison.

The operation applies to vectors and tensors elementwise given the shape of all operands is identical. The choice is made for each element individually based on the value at the same position as the element in the condition operand. If an i1 is provided as the condition, the entire vector or tensor is chosen.

Example:

// Custom form of scalar selection.
%x = arith.select %cond, %true, %false : i32

// Generic form of the same operation.
%x = "arith.select"(%cond, %true, %false) : (i1, i32, i32) -> i32

// Element-wise vector selection.
%vx = arith.select %vcond, %vtrue, %vfalse : vector<42xi1>, vector<42xf32>

// Full vector selection.
%vx = arith.select %cond, %vtrue, %vfalse : vector<42xf32>

shli()

Return op name arith.shli as a bitstring.

shli(ssa)

arith.shli - integer left-shift

This op has support for result type inference.

Attributes

  • overflowFlags - Single, Arith_IntegerOverflowAttr, Integer overflow arith flags

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The shli operation shifts the integer value of the first operand to the left by the integer value of the second operand. The second operand is interpreted as unsigned. The low order bits are filled with zeros. If the value of the second operand is greater or equal than the bitwidth of the first operand, then the operation returns poison.

This op supports nuw/nsw overflow flags which stands for "No Unsigned Wrap" and "No Signed Wrap", respectively. If the nuw and/or nsw flags are present, and an unsigned/signed overflow occurs (respectively), the result is poison.

Example:

%1 = arith.constant 5 : i8  // %1 is 0b00000101
%2 = arith.constant 3 : i8
%3 = arith.shli %1, %2 : i8 // %3 is 0b00101000
%4 = arith.shli %1, %2 overflow<nsw, nuw> : i8

shrsi()

Return op name arith.shrsi as a bitstring.

shrsi(ssa)

arith.shrsi - signed integer right-shift

This op has support for result type inference.

Attributes

  • isExact - Optional, UnitAttr, unit attribute

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The shrsi operation shifts an integer value of the first operand to the right by the value of the second operand. The first operand is interpreted as signed, and the second operand is interpreter as unsigned. The high order bits in the output are filled with copies of the most-significant bit of the shifted value (which means that the sign of the value is preserved). If the value of the second operand is greater or equal than bitwidth of the first operand, then the operation returns poison.

If the exact attribute is present, the result value of shrsi is a poison value if any of the bits shifted out are non-zero.

Example:

%1 = arith.constant 160 : i8         // %1 is 0b10100000
%2 = arith.constant 3 : i8
%3 = arith.shrsi %1, %2 exact : i8   // %3 is 0b11110100
%4 = arith.constant 98 : i8          // %4 is 0b01100010
%5 = arith.shrsi %4, %2 : i8         // %5 is 0b00001100

shrui()

Return op name arith.shrui as a bitstring.

shrui(ssa)

arith.shrui - unsigned integer right-shift

This op has support for result type inference.

Attributes

  • isExact - Optional, UnitAttr, unit attribute

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The shrui operation shifts an integer value of the first operand to the right by the value of the second operand. The first operand is interpreted as unsigned, and the second operand is interpreted as unsigned. The high order bits are always filled with zeros. If the value of the second operand is greater or equal than the bitwidth of the first operand, then the operation returns poison.

If the exact attribute is present, the result value of shrui is a poison value if any of the bits shifted out are non-zero.

Example:

%1 = arith.constant 160 : i8        // %1 is 0b10100000
%2 = arith.constant 3 : i8
%3 = arith.constant 6 : i8
%4 = arith.shrui %1, %2 exact : i8  // %4 is 0b00010100
%5 = arith.shrui %1, %3 : i8        // %3 is 0b00000010

sitofp()

Return op name arith.sitofp as a bitstring.

sitofp(ssa)

arith.sitofp - cast from integer type to floating-point

Operands

  • in - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Results

  • out - Single, FloatLike, floating-point-like

Description

Cast from a value interpreted as a signed integer to the corresponding floating-point value. When operating on vectors, casts elementwise.

subf()

Return op name arith.subf as a bitstring.

subf(ssa)

arith.subf - floating point subtraction operation

This op has support for result type inference.

Attributes

  • fastmath - Single, Arith_FastMathAttr, Floating point fast math flags
  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode

Operands

  • lhs - Single, FloatLike, floating-point-like
  • rhs - Single, FloatLike, floating-point-like

Results

  • result - Single, FloatLike, floating-point-like

Description

The subf operation takes two operands and returns one result, each of these is required to be the same type. This type may be a floating point scalar type, a vector whose element type is a floating point type, or a floating point tensor.

Example:

// Scalar subtraction.
%a = arith.subf %b, %c : f64

// SIMD vector subtraction, e.g. for Intel SSE.
%f = arith.subf %g, %h : vector<4xf32>

// Tensor subtraction.
%x = arith.subf %y, %z : tensor<4x?xbf16>

// Scalar subtraction with rounding mode.
%a = arith.subf %b, %c downward : f64

subi()

Return op name arith.subi as a bitstring.

subi(ssa)

arith.subi -

Integer subtraction operation.

This op has support for result type inference.

Attributes

  • overflowFlags - Single, Arith_IntegerOverflowAttr, Integer overflow arith flags

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

Performs N-bit subtraction on the operands. The operands are interpreted as unsigned bitvectors. The result is represented by a bitvector containing the mathematical value of the subtraction modulo 2^n, where n is the bitwidth. Because arith integers use a two's complement representation, this operation is applicable on both signed and unsigned integer operands.

The subi operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers.

This op supports nuw/nsw overflow flags which stands for "No Unsigned Wrap" and "No Signed Wrap", respectively. If the nuw and/or nsw flags are present, and an unsigned/signed overflow occurs (respectively), the result is poison.

Example:

// Scalar subtraction.
%a = arith.subi %b, %c : i64

// Scalar subtraction with overflow flags.
%a = arith.subi %b, %c overflow<nsw, nuw> : i64

// SIMD vector element-wise subtraction.
%f = arith.subi %g, %h : vector<4xi32>

// Tensor element-wise subtraction.
%x = arith.subi %y, %z : tensor<4x?xi8>

subui_extended()

Return op name arith.subui_extended as a bitstring.

subui_extended(ssa)

arith.subui_extended -

extended unsigned integer subtraction operation returning difference and
borrow bit

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • diff - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • borrow - Single, BoolLike, bool-like

Description

Performs (N+1)-bit subtraction on zero-extended operands. Returns two results: the N-bit difference (same type as both operands), and the borrow bit (boolean-like), where 1 indicates unsigned subtraction underflow (i.e. lhs < rhs when interpreted as unsigned), while 0 indicates no underflow.

Example:

// Scalar subtraction.
%diff, %borrow = arith.subui_extended %b, %c : i64, i1

// Vector element-wise subtraction.
%d:2 = arith.subui_extended %e, %f : vector<4xi32>, vector<4xi1>

// Tensor element-wise subtraction.
%x:2 = arith.subui_extended %y, %z : tensor<4x?xi8>, tensor<4x?xi1>

truncf()

Return op name arith.truncf as a bitstring.

truncf(ssa)

arith.truncf - cast from floating-point to narrower floating-point

Attributes

  • roundingmode - Optional, Arith_RoundingModeAttr, Floating point rounding mode
  • fastmath - Optional, Arith_FastMathAttr, Floating point fast math flags

Operands

  • in - Single, FloatLike, floating-point-like

Results

  • out - Single, FloatLike, floating-point-like

Description

Truncate a floating-point value to a smaller floating-point-typed value. The destination type must be strictly narrower than the source type. When operating on vectors, casts elementwise.

trunci()

Return op name arith.trunci as a bitstring.

trunci(ssa)

arith.trunci - integer truncation operation

Attributes

  • overflowFlags - Single, Arith_IntegerOverflowAttr, Integer overflow arith flags

Operands

  • in - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Results

  • out - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Description

The integer truncation operation takes an integer input of width M and an integer destination type of width N. The destination bit-width must be smaller than the input bit-width (N < M). The top-most (N - M) bits of the input are discarded.

This op supports nuw/nsw overflow flags which stands for "No Unsigned Wrap" and "No Signed Wrap", respectively. If the nuw keyword is present, and any of the truncated bits are non-zero, the result is a poison value. If the nsw keyword is present, and any of the truncated bits are not the same as the top bit of the truncation result, the result is a poison value.

Example:

  // Scalar truncation.
  %1 = arith.constant 21 : i5     // %1 is 0b10101
  %2 = arith.trunci %1 : i5 to i4 // %2 is 0b0101
  %3 = arith.trunci %1 : i5 to i3 // %3 is 0b101

  // Vector truncation.
  %4 = arith.trunci %0 : vector<2 x i32> to vector<2 x i16>

  // Scalar truncation with overflow flags.
  %5 = arith.trunci %a overflow<nsw, nuw> : i32 to i16

uitofp()

Return op name arith.uitofp as a bitstring.

uitofp(ssa)

arith.uitofp - cast from unsigned integer type to floating-point

Attributes

  • nonNeg - Optional, UnitAttr, unit attribute

Operands

  • in - Single, SignlessFixedWidthIntegerLike, signless-fixed-width-integer-like

Results

  • out - Single, FloatLike, floating-point-like

Description

Cast from a value interpreted as unsigned integer to the corresponding floating-point value. When operating on vectors, casts elementwise.

When the nneg flag is present, the operand is assumed to have the most significant bit set to 0. In this case, zero extension is equivalent to sign extension. When this assumption is violated, the result is poison.

Example:

  // Without nneg flag.
  %0 = arith.uitofp %a : i32 to f64

  // With nneg flag.
  %1 = arith.uitofp %a nneg : i32 to f64

xori()

Return op name arith.xori as a bitstring.

xori(ssa)

arith.xori - integer binary xor

This op has support for result type inference.

Operands

  • lhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like
  • rhs - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Results

  • result - Single, Arith_SignlessIntegerOrIndexLike, signless-non-zero-bitwidth-integer-like

Description

The xori operation takes two operands and returns one result, each of these is required to be the same type. This type may be an integer scalar type, a vector whose element type is integer, or a tensor of integers. It has no standard attributes.

Example:

// Scalar integer bitwise xor.
%a = arith.xori %b, %c : i64

// SIMD vector element-wise bitwise integer xor.
%f = arith.xori %g, %h : vector<4xi32>

// Tensor element-wise bitwise integer xor.
%x = arith.xori %y, %z : tensor<4x?xi8>