pto.tshls

pto.tshls is part of the Tile Scalar And Immediate instruction set.

Summary

Elementwise shift-left a tile by a scalar.

Mechanism

Elementwise shift-left of a tile, shift bits given by scalar. It operates on tile payloads rather than scalar control state, and its legality is constrained by tile shape, layout, valid-region, and target-profile support.

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

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

Syntax

Textual spelling is defined by the PTO ISA syntax-and-operands pages.

Synchronous form:

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

AS Level 1 (SSA)

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

AS Level 2 (DPS)

pto.tshls 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... WaitEvents>
PTO_INST RecordEvent TSHLS(TileDataDst &dst, TileDataSrc &src, typename TileDataDst::DType scalar, WaitEvents &... events);

Inputs

  • src is the source tile.
  • scalar is the unsigned integer shift count.
  • dst names the destination tile.
  • The operation iterates over dst's valid region.

Expected Outputs

dst carries the result tile or updated tile payload produced by the operation.

Side Effects

No architectural side effects beyond producing the destination tile. Does not implicitly fence unrelated traffic.

Constraints

Constraints

  • Valid region:
    • The op uses dst.GetValidRow() / dst.GetValidCol() as the iteration domain.

Exceptions

Exceptions

  • Illegal operand tuples, unsupported types, invalid layout combinations, or unsupported target-profile modes are rejected by the verifier or by the selected backend instruction set.
  • Programs must not rely on behavior outside the documented legal domain of this operation, even if one backend currently accepts it.

Target-Profile Restrictions

Target-Profile Restrictions
  • Implementation checks (A2A3):

    • Supported element types are int32_t, int, int16_t, uint32_t, unsigned int, and uint16_t.
    • dst and src must use the same element type.
    • dst and src must be vector tiles.
    • Runtime: src.GetValidRow() == dst.GetValidRow() and src.GetValidCol() == dst.GetValidCol().
    • Scalar only supports zero and positive values.
  • Implementation checks (A5):

    • Supported element types are int32_t, int16_t, int8_t, uint32_t, uint16_t, and uint8_t.
    • dst and src must use the same element type.
    • dst and src must be vector tiles.
    • Static valid bounds must satisfy ValidRow <= Rows and ValidCol <= Cols for both tiles.
    • Runtime: src.GetValidRow() == dst.GetValidRow() and src.GetValidCol() == dst.GetValidCol().
    • Scalar only supports zero and positive values.

Examples

#include <pto/pto-inst.hpp>

using namespace pto;

void example() {
  using TileDst = Tile<TileType::Vec, uint16_t, 16, 16>;
  using TileSrc = Tile<TileType::Vec, uint16_t, 16, 16>;
  TileDst dst;
  TileSrc src;
  TSHLS(dst, src, 0x2);
}

Auto Mode

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

Manual Mode

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

PTO Assembly Form

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