83 lines
3.3 KiB
C
83 lines
3.3 KiB
C
#ifndef SN_INTRINSIC_CallCONV_STD
|
|
#define SN_INTRINSIC_CallCONV_STD
|
|
|
|
#include "sn_internal.h"
|
|
#include "sn_intrinsic.h"
|
|
|
|
#ifndef static_assert
|
|
#define static_assert _Static_assert
|
|
#endif
|
|
|
|
#define STD_MK_PROC_NAME(T_type, T_arch, T_feature, T_op) \
|
|
T_type##_mat_proc_##T_op##_##T_arch##_##T_feature
|
|
#define STD_MK_PROC_DECL(T_type, T_arch, T_feature, T_op) \
|
|
INTERNAL void SN_DECL STD_MK_PROC_NAME(T_type, T_arch, T_feature, \
|
|
T_op)(MAT_TASK(T_type) * task);
|
|
|
|
#pragma region param styles
|
|
|
|
#define _SN_MATPROC_LEFT_RIGHT_ANS 1
|
|
#define _SN_MATPROC_RIGHT_ANS 1
|
|
#define _SN_MATPROC_LEFT_RIGHT_ANS_SCALAR 1
|
|
#define _SN_MATPROC_RIGHT_ANS_SCALAR 1
|
|
#define _SN_MATPROC_ANS_SCALAR 1
|
|
|
|
#define _SN_MK_EXPAND_RA(T) \
|
|
MAT_KERNEL(T) const *right = (MAT_TASK(T) *)task->mat_1; \
|
|
MAT_KERNEL(T) *restrict ans = (MAT_TASK(T) *)task->mat_2;
|
|
|
|
#define _SN_MK_EXPAND_LRA(T) \
|
|
MAT_KERNEL(T) const *left = (MAT_TASK(T) *)task->mat_0; \
|
|
MAT_KERNEL(T) const *right = (MAT_TASK(T) *)task->mat_1; \
|
|
MAT_KERNEL(T) *restrict ans = (MAT_TASK(T) *)task->mat_2;
|
|
|
|
#define _SN_MK_EXPAND_RAS(T) \
|
|
MAT_KERNEL(T) const *right = (MAT_TASK(T) *)task->mat_1; \
|
|
MAT_KERNEL(T) *restrict ans = (MAT_TASK(T) *)task->mat_2; \
|
|
void *restrict scalar = (MAT_TASK(T) *)task->scalar;
|
|
|
|
#define _SN_MK_EXPAND_LRAS(T) \
|
|
MAT_KERNEL(T) const *left = (MAT_KERNEL(T) *)task->mat_0; \
|
|
MAT_KERNEL(T) const *right = (MAT_KERNEL(T) *)task->mat_1; \
|
|
MAT_KERNEL(T) *restrict ans = (MAT_KERNEL(T) *)task->mat_2; \
|
|
void *restrict scalar = (MAT_TASK(T) *)task->scalar;
|
|
|
|
#define _SN_MK_EXPAND_AS(T) \
|
|
MAT_KERNEL(T) *restrict ans = (MAT_KERNEL(T) *)task->mat_2; \
|
|
void *restrict scalar = (scalar_pack const *)task->scalar;
|
|
|
|
#define _SN_PARAM_STYLE(T) _SN_MATPROC_##T
|
|
|
|
#define _SN_MK_EXPAND_PARAM(style, T) _SN_MK_EXPAND_##style(T)
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region mem layout
|
|
|
|
#define _SN_MATPROC_LAYOUT_BUFFER 1
|
|
#define _SN_MATPROC_LAYOUT_TILE 1
|
|
#define _SN_MATPROC_LAYOUT_KERNEL 1
|
|
|
|
#define _MK_MKPROC_EXPAND_INDEX_BUFFER \
|
|
size_t offset = UNSAFE_AS(size_t, task->padding.data[0]); \
|
|
size_t count = UNSAFE_AS(size_t, task->padding[1]);
|
|
|
|
#define _MK_MKPROC_EXPAND_INDEX_KERNEL \
|
|
size_t common_i = UNSAFE_AS(size_t, task->common_i); \
|
|
size_t common_j = UNSAFE_AS(size_t, task->common_j); \
|
|
size_t common_k = UNSAFE_AS(size_t, task->common_k);
|
|
|
|
#define _SN_MK_EXPAND_MEM(mem) _SN_MK_EXPAND_##mem
|
|
#define _SN_MEM_LAYOUT(T) _SN_MATPROC_LAYOUT_##T
|
|
|
|
#pragma endregion
|
|
|
|
#define __mk_param(mem, param, T) \
|
|
static_assert((_SN_PARAM_STYLE(param)) - 1 == 0, \
|
|
"EXPAND_PARAM: invalid param style '" #param "'"); \
|
|
static_assert((_SN_MEM_LAYOUT(mem)) - 1 == 0, \
|
|
"EXPAND_PARAM: invalid mem layout '" #mem "'"); \
|
|
_SN_MK_EXPAND_PARAM(style, T) \
|
|
_SN_MK_EXPAND_MEM(layout)
|
|
#endif // !SN_INTRINSIC_PARAM_EXPAND
|