57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
#ifndef __SPL_INTRIN_H__
|
|
#define __SPL_INTRIN_H__
|
|
|
|
#include "../stage0/include/utils.h"
|
|
#include "spl_type.h"
|
|
|
|
typedef enum {
|
|
SPL_INTRIN_NONE = 0,
|
|
SPL_INTRIN_SIZEOF,
|
|
SPL_INTRIN_ALIGNOF,
|
|
SPL_INTRIN_ASSERT,
|
|
SPL_INTRIN_BREAKPOINT,
|
|
SPL_INTRIN_LEN,
|
|
SPL_INTRIN_INT_CAST,
|
|
SPL_INTRIN_TRUNCATE,
|
|
SPL_INTRIN_BIT_CAST,
|
|
SPL_INTRIN_FLOAT_CAST,
|
|
SPL_INTRIN_INT_FROM_FLOAT,
|
|
SPL_INTRIN_FLOAT_FROM_INT,
|
|
SPL_INTRIN_INT_FROM_BOOL,
|
|
SPL_INTRIN_INT_FROM_PTR,
|
|
SPL_INTRIN_PTR_FROM_INT,
|
|
SPL_INTRIN_PTR_CAST,
|
|
} spl_intrin_t;
|
|
|
|
typedef enum {
|
|
SPL_INTRIN_FORM_CALL = 1, /* @sizeof(...) @assert(...) */
|
|
SPL_INTRIN_FORM_FIELD = 2, /* recv.len */
|
|
} spl_intrin_form_t;
|
|
|
|
typedef enum {
|
|
SPL_INTRIN_RESULT_UNIT,
|
|
SPL_INTRIN_RESULT_BOOL,
|
|
SPL_INTRIN_RESULT_USIZE,
|
|
} spl_intrin_result_t;
|
|
|
|
typedef struct {
|
|
const char *name;
|
|
spl_intrin_t kind;
|
|
spl_intrin_form_t form;
|
|
int min_args; /* FIELD 形态忽略 */
|
|
int max_args; /* -1 = variadic */
|
|
spl_intrin_result_t result;
|
|
} spl_intrin_info_t;
|
|
|
|
spl_intrin_t spl_intrin_lookup_call(const char *name);
|
|
spl_intrin_t spl_intrin_lookup_field(spl_lang_type_kind_t recv_kind, const char *field);
|
|
spl_intrin_t spl_intrin_lookup_cast(spl_type_t *type, spl_type_id_t ft, spl_type_id_t tt);
|
|
|
|
const spl_intrin_info_t *spl_intrin_info(spl_intrin_t kind);
|
|
|
|
/* ---- 与 IR 侧共享的类型布局约定 ---- */
|
|
#define SPL_SLICE_PTR_FIELD_IDX 0
|
|
#define SPL_SLICE_LEN_FIELD_IDX 1
|
|
|
|
#endif /* __SPL_INTRIN_H__ */
|