1//
2// m3_exec_defs.h
3//
4// Created by Steven Massey on 5/1/19.
5// Copyright © 2019 Steven Massey. All rights reserved.
6//
7
8#ifndef m3_exec_defs_h
9#define m3_exec_defs_h
10
11#include "m3_core.h"
12
13d_m3BeginExternC
14
15# define m3MemData(mem) (u8*)(((M3MemoryHeader*)(mem))+1)
16# define m3MemRuntime(mem) (((M3MemoryHeader*)(mem))->runtime)
17# define m3MemInfo(mem) (&(((M3MemoryHeader*)(mem))->runtime->memory))
18
19# define d_m3BaseOpSig pc_t _pc, m3stack_t _sp, M3MemoryHeader * _mem, m3reg_t _r0
20# define d_m3BaseOpArgs _sp, _mem, _r0
21# define d_m3BaseOpAllArgs _pc, _sp, _mem, _r0
22# define d_m3BaseOpDefaultArgs 0
23# define d_m3BaseClearRegisters _r0 = 0;
24
25# define d_m3ExpOpSig(...) d_m3BaseOpSig, __VA_ARGS__
26# define d_m3ExpOpArgs(...) d_m3BaseOpArgs, __VA_ARGS__
27# define d_m3ExpOpAllArgs(...) d_m3BaseOpAllArgs, __VA_ARGS__
28# define d_m3ExpOpDefaultArgs(...) d_m3BaseOpDefaultArgs, __VA_ARGS__
29# define d_m3ExpClearRegisters(...) d_m3BaseClearRegisters; __VA_ARGS__
30
31# if d_m3HasFloat
32# define d_m3OpSig d_m3ExpOpSig (f64 _fp0)
33# define d_m3OpArgs d_m3ExpOpArgs (_fp0)
34# define d_m3OpAllArgs d_m3ExpOpAllArgs (_fp0)
35# define d_m3OpDefaultArgs d_m3ExpOpDefaultArgs (0.)
36# define d_m3ClearRegisters d_m3ExpClearRegisters (_fp0 = 0.;)
37# else
38# define d_m3OpSig d_m3BaseOpSig
39# define d_m3OpArgs d_m3BaseOpArgs
40# define d_m3OpAllArgs d_m3BaseOpAllArgs
41# define d_m3OpDefaultArgs d_m3BaseOpDefaultArgs
42# define d_m3ClearRegisters d_m3BaseClearRegisters
43# endif
44
45typedef m3ret_t (vectorcall * IM3Operation) (d_m3OpSig);
46
47#define d_m3RetSig static inline m3ret_t vectorcall
48#define d_m3Op(NAME) M3_NO_UBSAN d_m3RetSig op_##NAME (d_m3OpSig)
49
50#define nextOpImpl() ((IM3Operation)(* _pc))(_pc + 1, d_m3OpArgs)
51#define jumpOpImpl(PC) ((IM3Operation)(* PC))( PC + 1, d_m3OpArgs)
52
53#define nextOpDirect() return nextOpImpl()
54#define jumpOpDirect(PC) return jumpOpImpl((pc_t)(PC))
55
56d_m3RetSig RunCode (d_m3OpSig)
57{
58 nextOpDirect();
59}
60
61d_m3EndExternC
62
63#endif // m3_exec_defs_h
64