blob: eae03f2c7bec47f5f5d6998e9386a9348395b384 [file]
// Copyright 2022 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_BUILTINS_UKERNEL_ELEMENTWISE_H_
#define IREE_BUILTINS_UKERNEL_ELEMENTWISE_H_
#include "iree/builtins/ukernel/api.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// Public API - Binary kernels.
//===----------------------------------------------------------------------===//
// Binary ukernel func 2d, x32.
// It takes lhs, rhs, out buffers and size, returning 0 on success and !0 on
// error.
typedef int (*iree_uk_x32b_2d_func_t)(
const iree_uk_uint32_t* lhs, iree_uk_index_t lhs_offset,
iree_uk_index_t lhs_stride0, iree_uk_index_t lhs_stride1,
const iree_uk_uint32_t* rhs, iree_uk_index_t rhs_offset,
iree_uk_index_t rhs_stride0, iree_uk_index_t rhs_stride1,
iree_uk_uint32_t* out, iree_uk_index_t out_offset,
iree_uk_index_t out_stride0, iree_uk_index_t out_stride1,
iree_uk_index_t size0, iree_uk_index_t size1);
// Declares a binary 2d microkernel with the following signature:
// int iree_uk_{category}_{opcode}_2d(...)
// of function type iree_uk_{category}_2d_func_t.
#define DECLARE_UKERNEL_BINARY_2D(opcode, dtype, category) \
IREE_UK_EXPORT int iree_uk_##category##_##opcode##_2d( \
const dtype* lhs, iree_uk_index_t lhs_offset, \
iree_uk_index_t lhs_stride0, iree_uk_index_t lhs_stride1, \
const dtype* rhs, iree_uk_index_t rhs_offset, \
iree_uk_index_t rhs_stride0, iree_uk_index_t rhs_stride1, \
dtype* IREE_UK_RESTRICT out, iree_uk_index_t out_offset, \
iree_uk_index_t out_stride0, iree_uk_index_t out_stride1, \
iree_uk_index_t size0, iree_uk_index_t size1)
DECLARE_UKERNEL_BINARY_2D(addf, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(addi, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(andi, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(divf, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(divsi, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(divui, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(mulf, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(muli, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(ori, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(shli, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(shrsi, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(shrui, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(subf, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(subi, iree_uk_uint32_t, x32b);
DECLARE_UKERNEL_BINARY_2D(xori, iree_uk_uint32_t, x32b);
//===----------------------------------------------------------------------===//
// Public API - Unary kernels.
//===----------------------------------------------------------------------===//
// Unary ukernel func 2d, x32.
// It takes in, out buffers and size, returning 0 on success and !0 on
// error.
typedef int (*iree_uk_x32u_2d_func_t)(
const iree_uk_uint32_t* in, iree_uk_index_t in_offset,
iree_uk_index_t in_stride0, iree_uk_index_t in_stride1,
iree_uk_uint32_t* out, iree_uk_index_t out_offset,
iree_uk_index_t out_stride0, iree_uk_index_t out_stride1,
iree_uk_index_t size0, iree_uk_index_t size1);
// Declares a binary 2d microkernel with the following signature:
// int iree_uk_{category}_{opcode}_2d(...)
// It takes lhs, rhs, out buffers and size, returning 0 on success and !0 on
// error.
#define DECLARE_UKERNEL_UNARY_2D(opcode, dtype, category) \
IREE_UK_EXPORT int iree_uk_##category##_##opcode##_2d( \
const dtype* in, iree_uk_index_t in_offset, iree_uk_index_t in_stride0, \
iree_uk_index_t in_stride1, dtype* IREE_UK_RESTRICT out, \
iree_uk_index_t out_offset, iree_uk_index_t out_stride0, \
iree_uk_index_t out_stride1, iree_uk_index_t size0, \
iree_uk_index_t size1)
DECLARE_UKERNEL_UNARY_2D(absf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(ceilf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(ctlz, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(expf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(floorf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(logf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(negf, iree_uk_uint32_t, x32u);
DECLARE_UKERNEL_UNARY_2D(rsqrtf, iree_uk_uint32_t, x32u);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_BUILTINS_UKERNEL_ELEMENTWISE_H_