TXORS

Tile Operation Diagram

TXORS tile operation

Introduction

Elementwise bitwise XOR of a tile and a scalar.

Math Interpretation

For each element (i, j) in the valid region:

\[ \mathrm{dst}_{i,j} = \mathrm{src}_{i,j} \oplus \mathrm{scalar} \]

Assembly Syntax

Synchronous form:

%dst = txors %src, %scalar : !pto.tile<...>, i32

AS Level 1 (SSA)

%dst = pto.txors %src, %scalar : (!pto.tile<...>, dtype) -> !pto.tile<...>

AS Level 2 (DPS)

pto.txors ins(%src, %scalar : !pto.tile_buf<...>, dtype) outs(%dst : !pto.tile_buf<...>)

C++ Intrinsic

Declared in include/pto/common/pto_instr.hpp:

template <typename TileDataDst, typename TileDataSrc, typename TileDataTmp, typename... WaitEvents>
PTO_INST RecordEvent TXORS(TileDataDst &dst, TileDataSrc &src0, typename TileDataSrc::DType scalar, TileDataTmp &tmp, WaitEvents &... events);

Constraints

  • Implementation checks (A2A3):
    • Supported element types are uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t.
    • dst, src, and tmp must use the same element type.
    • In manual mode, source, destination, and temporary storage must not overlap in memory.
  • Implementation checks (A5):
    • Supported element types are uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t.
    • dst and src element types must match.
    • src.GetValidRow()/GetValidCol() must match dst.
  • Valid region:
    • The op uses dst.GetValidRow() / dst.GetValidCol() as the iteration domain.

Temporary Space

A2A3

tmp is used as intermediate scratch storage for the scalar XOR decomposition. tmp must have the same element type and valid shape as dst.

A5

tmp is accepted by the interface but not used by the A5 implementation. The A5 backend uses the vxor vector instruction with a broadcast scalar register and does not require scratch tile storage. tmp is retained in the C++ intrinsic signature solely for API compatibility with A2A3.

Examples

#include <pto/pto-inst.hpp>

using namespace pto;

void example() {
  using TileDst = Tile<TileType::Vec, uint32_t, 16, 16>;
  using TileSrc = Tile<TileType::Vec, uint32_t, 16, 16>;
  using TileTmp = Tile<TileType::Vec, uint32_t, 16, 16>;
  TileDst dst;
  TileSrc src;
  TileTmp tmp;
  TXORS(dst, src, 0x1u, tmp);
}

ASM Form Examples

Auto Mode

# Auto mode: compiler/runtime-managed placement and scheduling.
%dst = pto.txors %src, %scalar : (!pto.tile<...>, dtype) -> !pto.tile<...>

Manual Mode

# Manual mode: resources must be bound explicitly before issuing the instruction.
# Optional for tile operands:
# pto.tassign %arg0, @tile(0x1000)
# pto.tassign %arg1, @tile(0x2000)
%dst = pto.txors %src, %scalar : (!pto.tile<...>, dtype) -> !pto.tile<...>

PTO Assembly Form

%dst = txors %src, %scalar : !pto.tile<...>, i32
# AS Level 2 (DPS)
pto.txors ins(%src, %scalar : !pto.tile_buf<...>, dtype) outs(%dst : !pto.tile_buf<...>)