2 * jit.h - General definitions for JIT back-ends.
4 * Copyright (C) 2004 Southern Storm Software, Pty Ltd.
5 * Copyright (C) 2016 Ketmar Dark
7 * The libjit library is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * as published by the Free Software Foundation, either version 2.1 of
10 * the License, or (at your option) any later version.
12 * The libjit library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with the libjit library. If not, see
19 * <http://www.gnu.org/licenses/>.
31 {$Z4} // Force four-byte enums
38 //LIBJIT_LIBNAME = 'libjit.dll';
39 {$IF not DEFINED(MSWINDOWS)}
40 (*const*) var jit_opcodes
: packed array [0..JIT_OP_NUM_OPCODES
-1] of jit_opcode_info_t
; cvar
; external LIBJIT_LIBNAME
;
43 * Pre-defined type descriptors.
45 (*const*) var jit_type_void
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
46 (*const*) var jit_type_sbyte
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
47 (*const*) var jit_type_ubyte
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
48 (*const*) var jit_type_short
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
49 (*const*) var jit_type_ushort
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
50 (*const*) var jit_type_int
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
51 (*const*) var jit_type_uint
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
52 (*const*) var jit_type_nint
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
53 (*const*) var jit_type_nuint
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
54 (*const*) var jit_type_long
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
55 (*const*) var jit_type_ulong
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
56 (*const*) var jit_type_float32
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
57 (*const*) var jit_type_float64
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
58 (*const*) var jit_type_nfloat
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
59 (*const*) var jit_type_void_ptr
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
62 * Type descriptors for the system "char", "int", "long", etc types.
63 * These are defined to one of the above values.
65 (*const*) var jit_type_sys_bool
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
66 (*const*) var jit_type_sys_char
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
67 (*const*) var jit_type_sys_schar
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
68 (*const*) var jit_type_sys_uchar
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
69 (*const*) var jit_type_sys_short
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
70 (*const*) var jit_type_sys_ushort
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
71 (*const*) var jit_type_sys_int
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
72 (*const*) var jit_type_sys_uint
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
73 (*const*) var jit_type_sys_long
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
74 (*const*) var jit_type_sys_ulong
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
75 (*const*) var jit_type_sys_longlong
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
76 (*const*) var jit_type_sys_ulonglong
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
77 (*const*) var jit_type_sys_float
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
78 (*const*) var jit_type_sys_double
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
79 (*const*) var jit_type_sys_long_double
: jit_type_t
; cvar
; external LIBJIT_LIBNAME
;
82 function jit_type_void (): jit_type_t
;
83 function jit_type_sbyte (): jit_type_t
;
84 function jit_type_ubyte (): jit_type_t
;
85 function jit_type_short (): jit_type_t
;
86 function jit_type_ushort (): jit_type_t
;
87 function jit_type_int (): jit_type_t
;
88 function jit_type_uint (): jit_type_t
;
89 function jit_type_nint (): jit_type_t
;
90 function jit_type_nuint (): jit_type_t
;
91 function jit_type_long (): jit_type_t
;
92 function jit_type_ulong (): jit_type_t
;
93 function jit_type_float32 (): jit_type_t
;
94 function jit_type_float64 (): jit_type_t
;
95 function jit_type_nfloat (): jit_type_t
;
96 function jit_type_void_ptr (): jit_type_t
;
98 function jit_type_sys_bool (): jit_type_t
;
99 function jit_type_sys_char (): jit_type_t
;
100 function jit_type_sys_schar (): jit_type_t
;
101 function jit_type_sys_uchar (): jit_type_t
;
102 function jit_type_sys_short (): jit_type_t
;
103 function jit_type_sys_ushort (): jit_type_t
;
104 function jit_type_sys_int (): jit_type_t
;
105 function jit_type_sys_uint (): jit_type_t
;
106 function jit_type_sys_long (): jit_type_t
;
107 function jit_type_sys_ulong (): jit_type_t
;
108 function jit_type_sys_longlong (): jit_type_t
;
109 function jit_type_sys_ulonglong (): jit_type_t
;
110 function jit_type_sys_float (): jit_type_t
;
111 function jit_type_sys_double (): jit_type_t
;
112 function jit_type_sys_long_double (): jit_type_t
;
118 {$IF DEFINED(MSWINDOWS)}
123 libjitH
: HModule
= 0;
126 function libjitImport (const name
: AnsiString): Pointer;
128 if (libjitH
= 0) then
130 libjitH
:= LoadLibrary(LIBJIT_LIBNAME
);
131 if (libjitH
= 0) then raise Exception
.Create('cannot load '+LIBJIT_LIBNAME
);
133 result
:= GetProcAddress(libjitH
, PAnsiChar(name
));
134 if (result
= nil) then raise Exception
.Create('cannot load '''+name
+''' from '+LIBJIT_LIBNAME
);
139 imp_jit_type_void
: Pointer = nil;
140 imp_jit_type_sbyte
: Pointer = nil;
141 imp_jit_type_ubyte
: Pointer = nil;
142 imp_jit_type_short
: Pointer = nil;
143 imp_jit_type_ushort
: Pointer = nil;
144 imp_jit_type_int
: Pointer = nil;
145 imp_jit_type_uint
: Pointer = nil;
146 imp_jit_type_nint
: Pointer = nil;
147 imp_jit_type_nuint
: Pointer = nil;
148 imp_jit_type_long
: Pointer = nil;
149 imp_jit_type_ulong
: Pointer = nil;
150 imp_jit_type_float32
: Pointer = nil;
151 imp_jit_type_float64
: Pointer = nil;
152 imp_jit_type_nfloat
: Pointer = nil;
153 imp_jit_type_void_ptr
: Pointer = nil;
155 imp_jit_type_sys_bool
: Pointer = nil;
156 imp_jit_type_sys_char
: Pointer = nil;
157 imp_jit_type_sys_schar
: Pointer = nil;
158 imp_jit_type_sys_uchar
: Pointer = nil;
159 imp_jit_type_sys_short
: Pointer = nil;
160 imp_jit_type_sys_ushort
: Pointer = nil;
161 imp_jit_type_sys_int
: Pointer = nil;
162 imp_jit_type_sys_uint
: Pointer = nil;
163 imp_jit_type_sys_long
: Pointer = nil;
164 imp_jit_type_sys_ulong
: Pointer = nil;
165 imp_jit_type_sys_longlong
: Pointer = nil;
166 imp_jit_type_sys_ulonglong
: Pointer = nil;
167 imp_jit_type_sys_float
: Pointer = nil;
168 imp_jit_type_sys_double
: Pointer = nil;
169 imp_jit_type_sys_long_double
: Pointer = nil;
172 function jit_type_void (): jit_type_t
; begin if (imp_jit_type_void
= nil) then imp_jit_type_void
:= jit_type_t(libjitImport('jit_type_void')); result
:= imp_jit_type_void
; end;
173 function jit_type_sbyte (): jit_type_t
; begin if (imp_jit_type_sbyte
= nil) then imp_jit_type_sbyte
:= jit_type_t(libjitImport('jit_type_sbyte')); result
:= imp_jit_type_sbyte
; end;
174 function jit_type_ubyte (): jit_type_t
; begin if (imp_jit_type_ubyte
= nil) then imp_jit_type_ubyte
:= jit_type_t(libjitImport('jit_type_ubyte')); result
:= imp_jit_type_ubyte
; end;
175 function jit_type_short (): jit_type_t
; begin if (imp_jit_type_short
= nil) then imp_jit_type_short
:= jit_type_t(libjitImport('jit_type_short')); result
:= imp_jit_type_short
; end;
176 function jit_type_ushort (): jit_type_t
; begin if (imp_jit_type_ushort
= nil) then imp_jit_type_ushort
:= jit_type_t(libjitImport('jit_type_ushort')); result
:= imp_jit_type_ushort
; end;
177 function jit_type_int (): jit_type_t
; begin if (imp_jit_type_int
= nil) then imp_jit_type_int
:= jit_type_t(libjitImport('jit_type_int')); result
:= imp_jit_type_int
; end;
178 function jit_type_uint (): jit_type_t
; begin if (imp_jit_type_uint
= nil) then imp_jit_type_uint
:= jit_type_t(libjitImport('jit_type_uint')); result
:= imp_jit_type_uint
; end;
179 function jit_type_nint (): jit_type_t
; begin if (imp_jit_type_nint
= nil) then imp_jit_type_nint
:= jit_type_t(libjitImport('jit_type_nint')); result
:= imp_jit_type_nint
; end;
180 function jit_type_nuint (): jit_type_t
; begin if (imp_jit_type_nuint
= nil) then imp_jit_type_nuint
:= jit_type_t(libjitImport('jit_type_nuint')); result
:= imp_jit_type_nuint
; end;
181 function jit_type_long (): jit_type_t
; begin if (imp_jit_type_long
= nil) then imp_jit_type_long
:= jit_type_t(libjitImport('jit_type_long')); result
:= imp_jit_type_long
; end;
182 function jit_type_ulong (): jit_type_t
; begin if (imp_jit_type_ulong
= nil) then imp_jit_type_ulong
:= jit_type_t(libjitImport('jit_type_ulong')); result
:= imp_jit_type_ulong
; end;
183 function jit_type_float32 (): jit_type_t
; begin if (imp_jit_type_float32
= nil) then imp_jit_type_float32
:= jit_type_t(libjitImport('jit_type_float32')); result
:= imp_jit_type_float32
; end;
184 function jit_type_float64 (): jit_type_t
; begin if (imp_jit_type_float64
= nil) then imp_jit_type_float64
:= jit_type_t(libjitImport('jit_type_float64')); result
:= imp_jit_type_float64
; end;
185 function jit_type_nfloat (): jit_type_t
; begin if (imp_jit_type_nfloat
= nil) then imp_jit_type_nfloat
:= jit_type_t(libjitImport('jit_type_nfloat')); result
:= imp_jit_type_nfloat
; end;
186 function jit_type_void_ptr (): jit_type_t
; begin if (imp_jit_type_void_ptr
= nil) then imp_jit_type_void_ptr
:= jit_type_t(libjitImport('jit_type_void_ptr')); result
:= imp_jit_type_void_ptr
; end;
188 function jit_type_sys_bool (): jit_type_t
; begin if (imp_jit_type_sys_bool
= nil) then imp_jit_type_sys_bool
:= jit_type_t(libjitImport('jit_type_sys_bool')); result
:= imp_jit_type_sys_bool
; end;
189 function jit_type_sys_char (): jit_type_t
; begin if (imp_jit_type_sys_char
= nil) then imp_jit_type_sys_char
:= jit_type_t(libjitImport('jit_type_sys_char')); result
:= imp_jit_type_sys_char
; end;
190 function jit_type_sys_schar (): jit_type_t
; begin if (imp_jit_type_sys_schar
= nil) then imp_jit_type_sys_schar
:= jit_type_t(libjitImport('jit_type_sys_schar')); result
:= imp_jit_type_sys_schar
; end;
191 function jit_type_sys_uchar (): jit_type_t
; begin if (imp_jit_type_sys_uchar
= nil) then imp_jit_type_sys_uchar
:= jit_type_t(libjitImport('jit_type_sys_uchar')); result
:= imp_jit_type_sys_uchar
; end;
192 function jit_type_sys_short (): jit_type_t
; begin if (imp_jit_type_sys_short
= nil) then imp_jit_type_sys_short
:= jit_type_t(libjitImport('jit_type_sys_short')); result
:= imp_jit_type_sys_short
; end;
193 function jit_type_sys_ushort (): jit_type_t
; begin if (imp_jit_type_sys_ushort
= nil) then imp_jit_type_sys_ushort
:= jit_type_t(libjitImport('jit_type_sys_ushort')); result
:= imp_jit_type_sys_ushort
; end;
194 function jit_type_sys_int (): jit_type_t
; begin if (imp_jit_type_sys_int
= nil) then imp_jit_type_sys_int
:= jit_type_t(libjitImport('jit_type_sys_int')); result
:= imp_jit_type_sys_int
; end;
195 function jit_type_sys_uint (): jit_type_t
; begin if (imp_jit_type_sys_uint
= nil) then imp_jit_type_sys_uint
:= jit_type_t(libjitImport('jit_type_sys_uint')); result
:= imp_jit_type_sys_uint
; end;
196 function jit_type_sys_long (): jit_type_t
; begin if (imp_jit_type_sys_long
= nil) then imp_jit_type_sys_long
:= jit_type_t(libjitImport('jit_type_sys_long')); result
:= imp_jit_type_sys_long
; end;
197 function jit_type_sys_ulong (): jit_type_t
; begin if (imp_jit_type_sys_ulong
= nil) then imp_jit_type_sys_ulong
:= jit_type_t(libjitImport('jit_type_sys_ulong')); result
:= imp_jit_type_sys_ulong
; end;
198 function jit_type_sys_longlong (): jit_type_t
; begin if (imp_jit_type_sys_longlong
= nil) then imp_jit_type_sys_longlong
:= jit_type_t(libjitImport('jit_type_sys_longlong')); result
:= imp_jit_type_sys_longlong
; end;
199 function jit_type_sys_ulonglong (): jit_type_t
; begin if (imp_jit_type_sys_ulonglong
= nil) then imp_jit_type_sys_ulonglong
:= jit_type_t(libjitImport('jit_type_sys_ulonglong')); result
:= imp_jit_type_sys_ulonglong
; end;
200 function jit_type_sys_float (): jit_type_t
; begin if (imp_jit_type_sys_float
= nil) then imp_jit_type_sys_float
:= jit_type_t(libjitImport('jit_type_sys_float')); result
:= imp_jit_type_sys_float
; end;
201 function jit_type_sys_double (): jit_type_t
; begin if (imp_jit_type_sys_double
= nil) then imp_jit_type_sys_double
:= jit_type_t(libjitImport('jit_type_sys_double')); result
:= imp_jit_type_sys_double
; end;
202 function jit_type_sys_long_double (): jit_type_t
; begin if (imp_jit_type_sys_long_double
= nil) then imp_jit_type_sys_long_double
:= jit_type_t(libjitImport('jit_type_sys_long_double')); result
:= imp_jit_type_sys_long_double
; end;