TXORS¶
Tile Operation Diagram¶
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, andtmpmust use the same element type.- In manual mode, source, destination, and temporary storage must not overlap in memory.
- Supported element types are
- Implementation checks (A5):
- Supported element types are
uint8_t,int8_t,uint16_t,int16_t,uint32_t,int32_t. dstandsrcelement types must match.src.GetValidRow()/GetValidCol()must matchdst.
- Supported element types are
- Valid region:
- The op uses
dst.GetValidRow()/dst.GetValidCol()as the iteration domain.
- The op uses
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<...>)