evoasm 0.0.2.pre7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gemrelease +2 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/Gemfile.rake +8 -0
- data/Gemfile.rake.lock +51 -0
- data/LICENSE.txt +373 -0
- data/Makefile +6 -0
- data/README.md +43 -0
- data/Rakefile +128 -0
- data/bin/gdb +2 -0
- data/data/tables/README.md +19 -0
- data/data/tables/x64.csv +1684 -0
- data/data/templates/evoasm-x64.c.erb +319 -0
- data/data/templates/evoasm-x64.h.erb +126 -0
- data/evoasm.gemspec +30 -0
- data/examples/abs.yml +20 -0
- data/examples/popcnt.yml +17 -0
- data/examples/sym_reg.yml +26 -0
- data/exe/evoasm-search +13 -0
- data/ext/evoasm_ext/evoasm-alloc.c +145 -0
- data/ext/evoasm_ext/evoasm-alloc.h +59 -0
- data/ext/evoasm_ext/evoasm-arch.c +44 -0
- data/ext/evoasm_ext/evoasm-arch.h +161 -0
- data/ext/evoasm_ext/evoasm-bitmap.h +114 -0
- data/ext/evoasm_ext/evoasm-buf.c +130 -0
- data/ext/evoasm_ext/evoasm-buf.h +47 -0
- data/ext/evoasm_ext/evoasm-error.c +31 -0
- data/ext/evoasm_ext/evoasm-error.h +75 -0
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +121 -0
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +86 -0
- data/ext/evoasm_ext/evoasm-log.c +108 -0
- data/ext/evoasm_ext/evoasm-log.h +69 -0
- data/ext/evoasm_ext/evoasm-misc.c +23 -0
- data/ext/evoasm_ext/evoasm-misc.h +282 -0
- data/ext/evoasm_ext/evoasm-param.h +37 -0
- data/ext/evoasm_ext/evoasm-search.c +2145 -0
- data/ext/evoasm_ext/evoasm-search.h +214 -0
- data/ext/evoasm_ext/evoasm-util.h +40 -0
- data/ext/evoasm_ext/evoasm-x64.c +275624 -0
- data/ext/evoasm_ext/evoasm-x64.h +5436 -0
- data/ext/evoasm_ext/evoasm.c +7 -0
- data/ext/evoasm_ext/evoasm.h +23 -0
- data/ext/evoasm_ext/evoasm_ext.c +1757 -0
- data/ext/evoasm_ext/extconf.rb +31 -0
- data/lib/evoasm/cli/search.rb +127 -0
- data/lib/evoasm/cli.rb +6 -0
- data/lib/evoasm/core_ext/array.rb +9 -0
- data/lib/evoasm/core_ext/integer.rb +10 -0
- data/lib/evoasm/core_ext/kwstruct.rb +13 -0
- data/lib/evoasm/core_ext/range.rb +5 -0
- data/lib/evoasm/core_ext.rb +1 -0
- data/lib/evoasm/error.rb +20 -0
- data/lib/evoasm/examples.rb +27 -0
- data/lib/evoasm/gen/enum.rb +169 -0
- data/lib/evoasm/gen/name_util.rb +80 -0
- data/lib/evoasm/gen/state.rb +176 -0
- data/lib/evoasm/gen/state_dsl.rb +152 -0
- data/lib/evoasm/gen/strio.rb +27 -0
- data/lib/evoasm/gen/translator.rb +1102 -0
- data/lib/evoasm/gen/version.rb +5 -0
- data/lib/evoasm/gen/x64/funcs.rb +495 -0
- data/lib/evoasm/gen/x64/inst.rb +781 -0
- data/lib/evoasm/gen/x64.rb +237 -0
- data/lib/evoasm/gen.rb +8 -0
- data/lib/evoasm/program.rb +23 -0
- data/lib/evoasm/search.rb +40 -0
- data/lib/evoasm/tasks/gen_task.rb +86 -0
- data/lib/evoasm/tasks/template_task.rb +52 -0
- data/lib/evoasm/version.rb +3 -0
- data/lib/evoasm.rb +22 -0
- data/test/test_helper.rb +1 -0
- data/test/x64/test_helper.rb +19 -0
- data/test/x64/x64_test.rb +87 -0
- metadata +221 -0
@@ -0,0 +1,214 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <stdint.h>
|
4
|
+
#include <stdlib.h>
|
5
|
+
|
6
|
+
#include "evoasm.h"
|
7
|
+
#include "evoasm-buf.h"
|
8
|
+
#include "evoasm-x64.h"
|
9
|
+
|
10
|
+
typedef double evoasm_loss;
|
11
|
+
typedef uint8_t evoasm_program_size;
|
12
|
+
|
13
|
+
#define EVOASM_KERNEL_SIZE_MAX UINT8_MAX
|
14
|
+
typedef uint8_t evoasm_kernel_size;
|
15
|
+
#define EVOASM_KERNEL_MAX_SIZE (EVOASM_KERNEL_SIZE_MAX - 1)
|
16
|
+
|
17
|
+
typedef enum {
|
18
|
+
EVOASM_EXAMPLE_TYPE_I64,
|
19
|
+
EVOASM_EXAMPLE_TYPE_U64,
|
20
|
+
EVOASM_EXAMPLE_TYPE_F64,
|
21
|
+
} evoasm_example_type;
|
22
|
+
|
23
|
+
typedef struct {
|
24
|
+
union {
|
25
|
+
double f64;
|
26
|
+
int64_t i64;
|
27
|
+
uint64_t u64;
|
28
|
+
};
|
29
|
+
} evoasm_example_val;
|
30
|
+
|
31
|
+
#define EVOASM_PROGRAM_IO_MAX_ARITY 8
|
32
|
+
|
33
|
+
typedef struct {
|
34
|
+
uint8_t arity;
|
35
|
+
uint16_t len;
|
36
|
+
evoasm_example_val *vals;
|
37
|
+
evoasm_example_type types[EVOASM_PROGRAM_IO_MAX_ARITY];
|
38
|
+
} evoasm_program_io;
|
39
|
+
|
40
|
+
#define EVOASM_PROGRAM_OUTPUT_MAX_ARITY EVOASM_PROGRAM_IO_MAX_ARITY
|
41
|
+
#define EVOASM_PROGRAM_INPUT_MAX_ARITY EVOASM_PROGRAM_IO_MAX_ARITY
|
42
|
+
typedef evoasm_program_io evoasm_program_output;
|
43
|
+
typedef evoasm_program_io evoasm_program_input;
|
44
|
+
|
45
|
+
#define EVOASM_PROGRAM_IO_N(program_io) ((uint16_t)((program_io)->len / (program_io)->arity))
|
46
|
+
#define EVOASM_PROGRAM_INPUT_N(program_input) EVOASM_PROGRAM_IO_N((evoasm_program_io *)program_input)
|
47
|
+
#define EVOASM_PROGRAM_OUTPUT_N(program_output) EVOASM_PROGRAM_IO_N((evoasm_program_io *)program_output)
|
48
|
+
|
49
|
+
typedef struct {
|
50
|
+
evoasm_inst *inst;
|
51
|
+
evoasm_arch_params_bitmap set_params;
|
52
|
+
evoasm_arch_param_val param_vals[EVOASM_ARCH_MAX_PARAMS];
|
53
|
+
} evoasm_kernel_param;
|
54
|
+
|
55
|
+
typedef struct {
|
56
|
+
evoasm_kernel_size size;
|
57
|
+
/* kernel executed next (jumped to)
|
58
|
+
* Kernel terminates if EVOASM_KERNEL_SIZE_MAX
|
59
|
+
*/
|
60
|
+
evoasm_kernel_size branch_kernel_idx;
|
61
|
+
uint8_t jmp_selector;
|
62
|
+
evoasm_kernel_param params[];
|
63
|
+
} evoasm_kernel_params;
|
64
|
+
|
65
|
+
typedef struct {
|
66
|
+
evoasm_program_size size;
|
67
|
+
} evoasm_program_params;
|
68
|
+
|
69
|
+
#define EVOASM_KERNEL_MAX_OUTPUT_REGS 254
|
70
|
+
#define EVOASM_KERNEL_MAX_INPUT_REGS 254
|
71
|
+
#define EVOASM_PROGRAM_MAX_SIZE 64
|
72
|
+
|
73
|
+
#define EVOASM_KERNEL_REG_INFO_N_TRANS_REGS 2
|
74
|
+
|
75
|
+
typedef struct {
|
76
|
+
bool input : 1;
|
77
|
+
bool written : 1;
|
78
|
+
bool output : 1;
|
79
|
+
evoasm_x64_reg_id trans_regs[EVOASM_KERNEL_REG_INFO_N_TRANS_REGS];
|
80
|
+
} evoasm_kernel_x64_reg_info;
|
81
|
+
|
82
|
+
typedef union {
|
83
|
+
evoasm_kernel_x64_reg_info x64[EVOASM_X64_N_REGS];
|
84
|
+
} evoasm_kernel_reg_info;
|
85
|
+
|
86
|
+
|
87
|
+
typedef struct {
|
88
|
+
evoasm_kernel_params *params;
|
89
|
+
evoasm_kernel_reg_info reg_info;
|
90
|
+
|
91
|
+
union {
|
92
|
+
evoasm_x64_reg_id x64[EVOASM_KERNEL_MAX_OUTPUT_REGS];
|
93
|
+
} output_regs;
|
94
|
+
|
95
|
+
uint_fast8_t n_input_regs;
|
96
|
+
uint_fast8_t n_output_regs;
|
97
|
+
uint8_t idx;
|
98
|
+
} evoasm_kernel;
|
99
|
+
|
100
|
+
typedef struct {
|
101
|
+
evoasm_inst **insts;
|
102
|
+
evoasm_program_size min_program_size;
|
103
|
+
evoasm_program_size max_program_size;
|
104
|
+
evoasm_kernel_size min_kernel_size;
|
105
|
+
evoasm_kernel_size max_kernel_size;
|
106
|
+
uint32_t recur_limit;
|
107
|
+
uint16_t insts_len;
|
108
|
+
uint8_t params_len;
|
109
|
+
uint32_t pop_size;
|
110
|
+
uint32_t mutation_rate;
|
111
|
+
evoasm_program_input program_input;
|
112
|
+
evoasm_program_output program_output;
|
113
|
+
evoasm_arch_param_id *params;
|
114
|
+
evoasm_prng64_seed seed64;
|
115
|
+
evoasm_prng32_seed seed32;
|
116
|
+
evoasm_domain *domains[EVOASM_ARCH_MAX_PARAMS];
|
117
|
+
|
118
|
+
} evoasm_search_params;
|
119
|
+
|
120
|
+
|
121
|
+
typedef struct {
|
122
|
+
evoasm_arch *arch;
|
123
|
+
evoasm_buf *buf;
|
124
|
+
evoasm_buf *body_buf;
|
125
|
+
uint32_t index;
|
126
|
+
uint8_t in_arity;
|
127
|
+
uint8_t out_arity;
|
128
|
+
bool reset_rflags : 1;
|
129
|
+
bool need_emit : 1;
|
130
|
+
void *_signal_ctx;
|
131
|
+
uint32_t exception_mask;
|
132
|
+
evoasm_example_type types[EVOASM_PROGRAM_OUTPUT_MAX_ARITY];
|
133
|
+
evoasm_example_val *output_vals;
|
134
|
+
evoasm_kernel kernels[EVOASM_PROGRAM_MAX_SIZE];
|
135
|
+
uint32_t recur_counters[EVOASM_PROGRAM_MAX_SIZE];
|
136
|
+
evoasm_program_params *params;
|
137
|
+
evoasm_program_input _input;
|
138
|
+
evoasm_program_output _output;
|
139
|
+
evoasm_search_params *search_params;
|
140
|
+
evoasm_reg_id output_regs[EVOASM_PROGRAM_IO_MAX_ARITY];
|
141
|
+
|
142
|
+
union {
|
143
|
+
/* register at index i has input i % input_arity */
|
144
|
+
uint8_t x64[EVOASM_X64_N_REGS];
|
145
|
+
} reg_inputs;
|
146
|
+
|
147
|
+
} evoasm_program;
|
148
|
+
|
149
|
+
#define EVOASM_SEARCH_ELITE_SIZE 4
|
150
|
+
|
151
|
+
typedef struct {
|
152
|
+
evoasm_prng64 prng64;
|
153
|
+
evoasm_prng32 prng32;
|
154
|
+
evoasm_loss best_loss;
|
155
|
+
evoasm_buf buf;
|
156
|
+
evoasm_buf body_buf;
|
157
|
+
|
158
|
+
uint32_t elite[EVOASM_SEARCH_ELITE_SIZE];
|
159
|
+
uint8_t elite_pos;
|
160
|
+
uint_fast8_t *matching;
|
161
|
+
evoasm_example_val *output_vals;
|
162
|
+
evoasm_loss *losses;
|
163
|
+
unsigned char *programs;
|
164
|
+
unsigned char *programs_main;
|
165
|
+
unsigned char *programs_swap;
|
166
|
+
unsigned char *programs_aux;
|
167
|
+
} evoasm_population;
|
168
|
+
|
169
|
+
#define EVOASM_EXAMPLES_MAX_ARITY 8
|
170
|
+
typedef struct {
|
171
|
+
evoasm_example_type types[EVOASM_EXAMPLES_MAX_ARITY];
|
172
|
+
uint16_t len;
|
173
|
+
evoasm_example_val *vals;
|
174
|
+
uint8_t in_arity;
|
175
|
+
uint8_t out_arity;
|
176
|
+
} evoasm_examples;
|
177
|
+
|
178
|
+
typedef struct {
|
179
|
+
evoasm_arch *arch;
|
180
|
+
evoasm_population pop;
|
181
|
+
evoasm_search_params params;
|
182
|
+
evoasm_domain *domains;
|
183
|
+
} evoasm_search;
|
184
|
+
|
185
|
+
bool
|
186
|
+
evoasm_search_init(evoasm_search *search,
|
187
|
+
evoasm_arch *arch, evoasm_search_params *params);
|
188
|
+
|
189
|
+
bool
|
190
|
+
evoasm_search_destroy(evoasm_search *search);
|
191
|
+
|
192
|
+
typedef bool (*evoasm_search_result_func)(evoasm_program *program,
|
193
|
+
evoasm_loss loss, void *user_data);
|
194
|
+
|
195
|
+
void
|
196
|
+
evoasm_search_start(evoasm_search *search, evoasm_loss max_loss,
|
197
|
+
evoasm_search_result_func func, void *user_data);
|
198
|
+
|
199
|
+
bool
|
200
|
+
evoasm_program_run(evoasm_program *program,
|
201
|
+
evoasm_program_input *input,
|
202
|
+
evoasm_program_output *output);
|
203
|
+
|
204
|
+
void
|
205
|
+
evoasm_program_io_destroy(evoasm_program_io *program_io);
|
206
|
+
|
207
|
+
evoasm_success
|
208
|
+
evoasm_program_eliminate_introns(evoasm_program *program);
|
209
|
+
|
210
|
+
#define evoasm_program_output_destroy(program_output) \
|
211
|
+
evoasm_program_io_destroy((evoasm_program_io *)program_output)
|
212
|
+
|
213
|
+
void
|
214
|
+
evoasm_program_output_regs(evoasm_program *program, evoasm_reg_id *output_regs, size_t *len);
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#define EVOASM_INT8_MAX INT8_MAX
|
4
|
+
#define EVOASM_INT8_MIN INT8_MIN
|
5
|
+
#define EVOASM_INT16_MAX INT16_MAX
|
6
|
+
#define EVOASM_INT16_MIN INT16_MIN
|
7
|
+
#define EVOASM_INT32_MAX INT32_MAX
|
8
|
+
#define EVOASM_INT32_MIN INT32_MIN
|
9
|
+
#define EVOASM_INT64_MAX INT64_MAX
|
10
|
+
#define EVOASM_INT64_MIN INT64_MIN
|
11
|
+
|
12
|
+
|
13
|
+
#define EVOASM_MAX(a,b) (((a) > (b)) ? (a) : (b))
|
14
|
+
#define EVOASM_MIN(a,b) (((a) < (b)) ? (a) : (b))
|
15
|
+
#define EVOASM_CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
|
16
|
+
|
17
|
+
#define EVOASM_ALIGN_DOWN(s, a) ((s) &~ ((a) - 1))
|
18
|
+
#define EVOASM_ALIGN_UP(s, a) EVOASM_ALIGN_DOWN(((s) + (a) - 1), a)
|
19
|
+
|
20
|
+
#define EVOASM_ARY_LEN(ary) (sizeof(ary) / sizeof(ary[0]))
|
21
|
+
|
22
|
+
#ifdef __GNUC__
|
23
|
+
# define EVOASM_UNLIKELY(e) (__builtin_expect(e, 0))
|
24
|
+
# define EVOASM_LIKELY(e) (__builtin_expect(e, 1))
|
25
|
+
# define evoasm_used __attribute__((used))
|
26
|
+
# define evoasm_force_inline __attribute__((always_inline))
|
27
|
+
#else
|
28
|
+
# define EVOASM_UNLIKELY(e) (e)
|
29
|
+
# define EVOASM_LIKELY(e) (e)
|
30
|
+
# define evoasm_used
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#if defined(__GNUC__)
|
34
|
+
# define evoasm_check_return __attribute__((warn_unused_result))
|
35
|
+
#elif defined(_MSC_VER)
|
36
|
+
# define evoasm_check_return _Check_return_
|
37
|
+
# define evoasm_force_inline __forceinline
|
38
|
+
#else
|
39
|
+
# define evoasm_check_return
|
40
|
+
#endif
|