blob: 17d7e85a8b03dcd4712c589ad451739eeb8b95b2 [file] [log] [blame]
// IREE VMLA (Virtual Machine-based Linear Algebra) runtime module imports.
//
// This is embedded in the compiler binary and inserted into any module
// containing VMLA dialect ops (vmla.*) that is lowered to the VM dialect.
//
// Element types are embedded in the function. The convention used:
// * 'x': don't-care, bit-depth only.
// * 'i': signed integer
// * 'u': unsigned integer
// * 'f': IREE float
//
// The native module does not need shapes in many cases and only ops that
// actually use the shape information take it as arguments.
//
// When adding methods try to first reuse existing ones. For example, unrolling
// a memcpy to a sequence of vmla.buffer.copy calls (or a loop of them) instead
// of adding a my_batch_copy method.
vm.module @vmla {
//===----------------------------------------------------------------------===//
// VMLA Ops: ABI
//===----------------------------------------------------------------------===//
vm.import @interface.const(
%interface : !vm.ref<!vmla.interface>,
%offset : i32
) -> i32
attributes {nosideeffects}
vm.import @interface.binding(
%interface : !vm.ref<!vmla.interface>,
%set : i32,
%binding : i32
) -> !vm.ref<!vmla.buffer>
attributes {nosideeffects}
//===----------------------------------------------------------------------===//
// VMLA Ops: buffer manipulation
//===----------------------------------------------------------------------===//
vm.import @buffer.const(
%value : !vm.ref<!iree.byte_buffer>
) -> !vm.ref<!vmla.buffer>
attributes {nosideeffects}
vm.import @buffer.alloc(
%byte_length : i32
) -> !vm.ref<!vmla.buffer>
attributes {nosideeffects}
vm.import @buffer.clone(
%src : !vm.ref<!vmla.buffer>
) -> !vm.ref<!vmla.buffer>
attributes {nosideeffects}
vm.import @buffer.byte_length(
%value : !vm.ref<!vmla.buffer>
) -> i32
attributes {nosideeffects}
vm.import @buffer.view(
%src : !vm.ref<!vmla.buffer>,
%byte_offset : i32,
%byte_length : i32
) -> !vm.ref<!vmla.buffer>
attributes {nosideeffects}
vm.import @buffer.copy(
%src : !vm.ref<!vmla.buffer>, %src_byte_offset : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_byte_offset : i32,
%byte_length : i32
)
vm.import @buffer.fill(
%value : !vm.ref<!vmla.buffer>,
%dst : !vm.ref<!vmla.buffer>
)
vm.import @buffer.load.i32(
%src : !vm.ref<!vmla.buffer>,
%byte_offset : i32
) -> i32
attributes {nosideeffects}
//===----------------------------------------------------------------------===//
// VMLA Ops: comparison
//===----------------------------------------------------------------------===//
vm.import @cmp.i8(%predicate : i32, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @cmp.i16(%predicate : i32, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @cmp.i32(%predicate : i32, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @cmp.f32(%predicate : i32, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @select.x8(%cond : !vm.ref<!vmla.buffer>, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @select.x16(%cond : !vm.ref<!vmla.buffer>, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @select.x32(%cond : !vm.ref<!vmla.buffer>, %lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @finite.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
//===----------------------------------------------------------------------===//
// VMLA Ops: shape/structure
//===----------------------------------------------------------------------===//
// TODO(benvanik): do the copies with buffer.copy instead and leave the offset
// calculations in the IR for the compiler to simplify.
vm.import @copy.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ..., %src_indices : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ..., %dst_indices : i32 ...,
%lengths : i32 ...
)
vm.import @copy.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ..., %src_indices : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ..., %dst_indices : i32 ...,
%lengths : i32 ...
)
vm.import @copy.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ..., %src_indices : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ..., %dst_indices : i32 ...,
%lengths : i32 ...
)
vm.import @transpose.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%permutation : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @transpose.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%permutation : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @transpose.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%permutation : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reverse.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dimensions : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reverse.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dimensions : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reverse.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dimensions : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @pad.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%value : !vm.ref<!vmla.buffer>, %value_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%edge_padding_low : i32 ...,
%edge_padding_high : i32 ...,
%interior_padding : i32 ...
)
vm.import @pad.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%value : !vm.ref<!vmla.buffer>, %value_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%edge_padding_low : i32 ..., %edge_padding_high : i32 ...,
%interior_padding : i32 ...
)
vm.import @pad.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%value : !vm.ref<!vmla.buffer>, %value_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%edge_padding_low : i32 ..., %edge_padding_high : i32 ...,
%interior_padding : i32 ...
)
vm.import @gather.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%dim : i32, %batch_dims : i32
)
vm.import @gather.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%dim : i32, %batch_dims : i32
)
vm.import @gather.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%dim : i32, %batch_dims : i32
)
vm.import @scatter.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @scatter.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @scatter.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%indices : !vm.ref<!vmla.buffer>, %indices_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @broadcast.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @broadcast.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @broadcast.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @iota.i8(%dst : !vm.ref<!vmla.buffer>)
vm.import @iota.i16(%dst : !vm.ref<!vmla.buffer>)
vm.import @iota.i32(%dst : !vm.ref<!vmla.buffer>)
vm.import @iota.f32(%dst : !vm.ref<!vmla.buffer>)
vm.import @tile.x8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @tile.x16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @tile.x32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
//===----------------------------------------------------------------------===//
// VMLA Ops: bit manipulation
//===----------------------------------------------------------------------===//
vm.import @not.x8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @not.x16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @not.x32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.broadcast.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.broadcast.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @and.broadcast.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @or.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @or.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @or.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.broadcast.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.broadcast.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @xor.broadcast.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : i32, %dst : !vm.ref<!vmla.buffer>)
vm.import @shl.x8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shl.x16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shl.x32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.u8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.u16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.u32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @shr.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
//===----------------------------------------------------------------------===//
// VMLA Ops: arithmetic
//===----------------------------------------------------------------------===//
vm.import @add.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @add.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @add.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @add.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sub.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sub.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sub.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sub.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @abs.i8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @abs.i16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @abs.i32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @abs.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @neg.i8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @neg.i16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @neg.i32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @neg.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @mul.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @mul.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @mul.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @mul.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.u8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.u16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.u32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @div.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.u8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.u16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.u32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rem.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @pow.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @exp.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @log.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @rsqrt.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sqrt.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @cos.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @sin.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @tanh.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @atan2.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @min.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @min.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @min.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @min.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @max.i8(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @max.i16(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @max.i32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @max.f32(%lhs : !vm.ref<!vmla.buffer>, %rhs : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @clamp.i8(%min : !vm.ref<!vmla.buffer>, %value : !vm.ref<!vmla.buffer>, %max : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @clamp.i16(%min : !vm.ref<!vmla.buffer>, %value : !vm.ref<!vmla.buffer>, %max : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @clamp.i32(%min : !vm.ref<!vmla.buffer>, %value : !vm.ref<!vmla.buffer>, %max : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @clamp.f32(%min : !vm.ref<!vmla.buffer>, %value : !vm.ref<!vmla.buffer>, %max : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @floor.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @ceil.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @round.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
//===----------------------------------------------------------------------===//
// VMLA Ops: conversion
//===----------------------------------------------------------------------===//
vm.import @convert.i8.i16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i8.i32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i8.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i16.i8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i16.i32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i16.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i32.i8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i32.i16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.i32.f32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.f32.i8(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.f32.i16(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
vm.import @convert.f32.i32(%src : !vm.ref<!vmla.buffer>, %dst : !vm.ref<!vmla.buffer>)
//===----------------------------------------------------------------------===//
// VMLA Ops: Convolution
//===----------------------------------------------------------------------===//
vm.import @conv.f32f32.f32(
%input: !vm.ref<!vmla.buffer>, %input_shape: i32 ...,
%filter: !vm.ref<!vmla.buffer>, %filter_shape: i32 ...,
%dst: !vm.ref<!vmla.buffer>, %dst_shape: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...,
%lhs_dilation: i32 ...,
%rhs_dilation: i32 ...,
%feature_group_count: i32,
%batch_group_count: i32
)
//===----------------------------------------------------------------------===//
// VMLA Ops: GEMM/GEMV
//===----------------------------------------------------------------------===//
vm.import @batch.matmul.f32f32.f32(
%lhs : !vm.ref<!vmla.buffer>, %lhs_shape : i32 ...,
%rhs : !vm.ref<!vmla.buffer>, %rhs_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
//===----------------------------------------------------------------------===//
// VMLA Ops: reduction
//===----------------------------------------------------------------------===//
vm.import @reduce.sum.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.sum.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.sum.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.sum.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.min.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.min.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.min.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.min.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.max.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.max.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.max.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @reduce.max.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dimension : i32,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...
)
vm.import @pooling.sum.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.sum.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.sum.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.sum.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.min.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.min.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.min.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.min.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.max.i8(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.max.i16(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.max.i32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
vm.import @pooling.max.f32(
%src : !vm.ref<!vmla.buffer>, %src_shape : i32 ...,
%init : !vm.ref<!vmla.buffer>, %init_shape : i32 ...,
%dst : !vm.ref<!vmla.buffer>, %dst_shape : i32 ...,
%window_dimensions: i32 ...,
%window_strides: i32 ...,
%padding: i32 ...
)
} // module