evoasm 0.0.2.pre7 → 0.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.gdbinit +41 -0
  3. data/.gitignore +1 -2
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +660 -0
  8. data/Makefile +1 -1
  9. data/README.md +17 -9
  10. data/Rakefile +39 -107
  11. data/bin/gdb +1 -1
  12. data/bin/gdb_loop +4 -0
  13. data/docs/FindingInstructions.md +17 -0
  14. data/docs/JIT.md +14 -0
  15. data/docs/SymbolicRegression.md +102 -0
  16. data/docs/Visualization.md +29 -0
  17. data/docs/examples/bit_insts.rb +44 -0
  18. data/docs/examples/jit.rb +26 -0
  19. data/docs/examples/loss.gif +0 -0
  20. data/docs/examples/program.png +0 -0
  21. data/docs/examples/sym_reg.rb +64 -0
  22. data/docs/examples/vis.rb +38 -0
  23. data/evoasm.gemspec +21 -15
  24. data/ext/evoasm_ext/Rakefile +3 -0
  25. data/ext/evoasm_ext/compile.rake +35 -0
  26. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
  27. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
  28. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
  29. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
  30. data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
  31. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
  32. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
  33. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
  34. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
  35. data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
  36. data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
  37. data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
  38. data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
  39. data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
  40. data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
  41. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
  42. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
  43. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
  44. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
  45. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
  46. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
  47. data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
  48. data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
  49. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
  50. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
  51. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
  52. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
  53. data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
  54. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
  55. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
  56. data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
  57. data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
  58. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
  59. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
  60. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
  61. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
  62. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
  63. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
  64. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
  65. data/lib/evoasm.rb +28 -11
  66. data/lib/evoasm/buffer.rb +105 -0
  67. data/lib/evoasm/capstone.rb +100 -0
  68. data/lib/evoasm/domain.rb +116 -0
  69. data/lib/evoasm/error.rb +37 -16
  70. data/lib/evoasm/exception_error.rb +19 -0
  71. data/lib/evoasm/ffi_ext.rb +53 -0
  72. data/lib/evoasm/libevoasm.rb +286 -0
  73. data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
  74. data/lib/evoasm/parameter.rb +20 -0
  75. data/lib/evoasm/population.rb +145 -0
  76. data/lib/evoasm/population/parameters.rb +227 -0
  77. data/lib/evoasm/population/plotter.rb +89 -0
  78. data/lib/evoasm/prng.rb +64 -0
  79. data/lib/evoasm/program.rb +195 -12
  80. data/lib/evoasm/program/io.rb +144 -0
  81. data/lib/evoasm/test.rb +8 -0
  82. data/lib/evoasm/version.rb +1 -1
  83. data/lib/evoasm/x64.rb +115 -0
  84. data/lib/evoasm/x64/cpu_state.rb +95 -0
  85. data/lib/evoasm/x64/instruction.rb +109 -0
  86. data/lib/evoasm/x64/operand.rb +156 -0
  87. data/lib/evoasm/x64/parameters.rb +211 -0
  88. data/test/helpers/population_helper.rb +128 -0
  89. data/test/helpers/test_helper.rb +1 -0
  90. data/test/helpers/x64_helper.rb +24 -0
  91. data/test/integration/bitwise_reverse_test.rb +41 -0
  92. data/test/integration/gcd_test.rb +52 -0
  93. data/test/integration/popcnt_test.rb +46 -0
  94. data/test/integration/sym_reg_test.rb +68 -0
  95. data/test/unit/evoasm/buffer_test.rb +48 -0
  96. data/test/unit/evoasm/capstone_test.rb +18 -0
  97. data/test/unit/evoasm/domain_test.rb +55 -0
  98. data/test/unit/evoasm/population/parameters_test.rb +106 -0
  99. data/test/unit/evoasm/population_test.rb +96 -0
  100. data/test/unit/evoasm/prng_test.rb +47 -0
  101. data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
  102. data/test/unit/evoasm/x64/encoding_test.rb +320 -0
  103. data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
  104. data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
  105. data/test/unit/evoasm/x64/instruction_test.rb +62 -0
  106. data/test/unit/evoasm/x64/parameters_test.rb +65 -0
  107. data/test/unit/evoasm/x64_test.rb +52 -0
  108. metadata +195 -89
  109. data/Gemfile.rake +0 -8
  110. data/Gemfile.rake.lock +0 -51
  111. data/LICENSE.txt +0 -373
  112. data/data/tables/README.md +0 -19
  113. data/data/tables/x64.csv +0 -1684
  114. data/data/templates/evoasm-x64.c.erb +0 -319
  115. data/data/templates/evoasm-x64.h.erb +0 -126
  116. data/examples/abs.yml +0 -20
  117. data/examples/popcnt.yml +0 -17
  118. data/examples/sym_reg.yml +0 -26
  119. data/exe/evoasm-search +0 -13
  120. data/ext/evoasm_ext/evoasm-alloc.c +0 -145
  121. data/ext/evoasm_ext/evoasm-alloc.h +0 -59
  122. data/ext/evoasm_ext/evoasm-arch.c +0 -44
  123. data/ext/evoasm_ext/evoasm-arch.h +0 -161
  124. data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
  125. data/ext/evoasm_ext/evoasm-buf.c +0 -130
  126. data/ext/evoasm_ext/evoasm-buf.h +0 -47
  127. data/ext/evoasm_ext/evoasm-error.c +0 -31
  128. data/ext/evoasm_ext/evoasm-error.h +0 -75
  129. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
  130. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
  131. data/ext/evoasm_ext/evoasm-log.h +0 -69
  132. data/ext/evoasm_ext/evoasm-misc.c +0 -23
  133. data/ext/evoasm_ext/evoasm-misc.h +0 -282
  134. data/ext/evoasm_ext/evoasm-param.h +0 -37
  135. data/ext/evoasm_ext/evoasm-search.c +0 -2145
  136. data/ext/evoasm_ext/evoasm-search.h +0 -214
  137. data/ext/evoasm_ext/evoasm-util.h +0 -40
  138. data/ext/evoasm_ext/evoasm-x64.c +0 -275624
  139. data/ext/evoasm_ext/evoasm-x64.h +0 -5436
  140. data/ext/evoasm_ext/evoasm.c +0 -7
  141. data/ext/evoasm_ext/evoasm.h +0 -23
  142. data/ext/evoasm_ext/evoasm_ext.c +0 -1757
  143. data/ext/evoasm_ext/extconf.rb +0 -31
  144. data/lib/evoasm/cli.rb +0 -6
  145. data/lib/evoasm/cli/search.rb +0 -127
  146. data/lib/evoasm/core_ext.rb +0 -1
  147. data/lib/evoasm/core_ext/array.rb +0 -9
  148. data/lib/evoasm/core_ext/integer.rb +0 -10
  149. data/lib/evoasm/core_ext/kwstruct.rb +0 -13
  150. data/lib/evoasm/core_ext/range.rb +0 -5
  151. data/lib/evoasm/examples.rb +0 -27
  152. data/lib/evoasm/gen.rb +0 -8
  153. data/lib/evoasm/gen/enum.rb +0 -169
  154. data/lib/evoasm/gen/name_util.rb +0 -80
  155. data/lib/evoasm/gen/state.rb +0 -176
  156. data/lib/evoasm/gen/state_dsl.rb +0 -152
  157. data/lib/evoasm/gen/strio.rb +0 -27
  158. data/lib/evoasm/gen/translator.rb +0 -1102
  159. data/lib/evoasm/gen/version.rb +0 -5
  160. data/lib/evoasm/gen/x64.rb +0 -237
  161. data/lib/evoasm/gen/x64/funcs.rb +0 -495
  162. data/lib/evoasm/gen/x64/inst.rb +0 -781
  163. data/lib/evoasm/search.rb +0 -40
  164. data/lib/evoasm/tasks/gen_task.rb +0 -86
  165. data/lib/evoasm/tasks/template_task.rb +0 -52
  166. data/test/test_helper.rb +0 -1
  167. data/test/x64/test_helper.rb +0 -19
  168. data/test/x64/x64_test.rb +0 -87
@@ -1,319 +0,0 @@
1
- /* AUTOGENERATED FILE, DO NOT EDIT */
2
-
3
- #include "evoasm-x64.h"
4
- #include "evoasm-error.h"
5
- #include "evoasm-alloc.h"
6
-
7
- static const char *_evoasm_log_tag = "x64";
8
-
9
- uint8_t evoasm_x64_reg_type_sizes[EVOASM_X64_N_REG_TYPES] = {0};
10
-
11
- static int64_t
12
- evoasm_x64_disp_size(evoasm_x64 *x64, evoasm_arch_param_val *param_vals, evoasm_bitmap *set_params) {
13
- evoasm_arch_param_val val = param_vals[EVOASM_X64_PARAM_DISP];
14
- if(!evoasm_bitmap_get(set_params, EVOASM_X64_PARAM_DISP)) return 0;
15
- if(val >= INT8_MIN && val <= INT8_MAX) return 8;
16
- if(val >= INT32_MIN && val <= INT32_MAX) return 32;
17
- return 0;
18
- }
19
-
20
- static int8_t
21
- evoasm_x64_reg_code(evoasm_x64 *x64, evoasm_x64_reg_id reg) {
22
- switch(reg) {
23
- <% Evoasm::Gen::X64::REGISTERS.fetch_values(:gp, :mm, :xmm, :zmm).each do |regs| %>
24
- <% regs.each_with_index do |reg, index| %>
25
- case <%= reg_name_to_c reg %>: return <%= index %>;
26
- <%end %>
27
- <%end %>
28
- default:
29
- evoasm_fatal("invalid register id %d", reg);
30
- evoasm_assert_not_reached();
31
- }
32
- }
33
-
34
- /* PERMUTATION TABLES */
35
- <%= permutation_tables %>
36
- /* ------------------- */
37
-
38
- /* FUNCS */
39
- <%= called_funcs %>
40
- /* ------------------- */
41
-
42
- <%= pref_funcs %>
43
- <%= inst_funcs %>
44
- <%= param_domains %>
45
- <%= inst_params %>
46
- <%= inst_operands %>
47
-
48
- <%= insts_c %>
49
-
50
- static evoasm_x64_reg_id evoasm_x64_sysv_callee_save_regs[] = {
51
- EVOASM_X64_REG_BP,
52
- EVOASM_X64_REG_B,
53
- EVOASM_X64_REG_12,
54
- EVOASM_X64_REG_13,
55
- EVOASM_X64_REG_14,
56
- EVOASM_X64_REG_15,
57
- };
58
-
59
- static evoasm_success
60
- evoasm_x64_func_prolog_or_epilog(evoasm_x64 *x64, evoasm_buf *buf, evoasm_x64_abi abi, bool prolog) {
61
- evoasm_arch *arch = (evoasm_arch *) x64;
62
- unsigned i;
63
- size_t regs_len = EVOASM_ARY_LEN(evoasm_x64_sysv_callee_save_regs);
64
- evoasm_x64_params params = {0};
65
-
66
- /* touch RSP and RBX so we don't get a read access violation for PUSH */
67
- //evoasm_arch_write_access(arch, (evoasm_bitmap *) &arch->acc, EVOASM_X64_REG_SP);
68
-
69
- for(i = 0; i < regs_len; i++) {
70
- evoasm_x64_reg_id reg = evoasm_x64_sysv_callee_save_regs[prolog ? i : (regs_len - 1 - i)];
71
- evoasm_arch_write_access(arch, (evoasm_bitmap *) &arch->acc, reg);
72
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, reg);
73
-
74
- if(prolog) {
75
- EVOASM_X64_ENC(push_r64);
76
- }
77
- else {
78
- EVOASM_X64_ENC(pop_r64);
79
- }
80
- evoasm_arch_save(arch, buf);
81
- }
82
-
83
- if(!prolog) {
84
- EVOASM_X64_ENC(ret);
85
- evoasm_arch_save(arch, buf);
86
- }
87
-
88
- return true;
89
-
90
- enc_failed:
91
- return false;
92
- }
93
-
94
- evoasm_success
95
- evoasm_x64_func_prolog(evoasm_x64 *x64, evoasm_buf *buf, evoasm_x64_abi abi) {
96
- return evoasm_x64_func_prolog_or_epilog(x64, buf, abi, true);
97
- }
98
-
99
- evoasm_success
100
- evoasm_x64_func_epilog(evoasm_x64 *x64, evoasm_buf *buf, evoasm_x64_abi abi) {
101
- return evoasm_x64_func_prolog_or_epilog(x64, buf, abi, false);
102
- }
103
-
104
- static evoasm_success
105
- evoasm_x64_load_cpuid(evoasm_x64 *x64) {
106
- evoasm_buf buf;
107
- evoasm_x64_params params = {0};
108
- bool retval = true;
109
-
110
- uint32_t vals[<%= Evoasm::Gen::X64::CPUID.size %>][<%= Evoasm::Gen::X64::CPUID.max_by{|k, v| v.size}.size %>] = {0};
111
- evoasm_arch *arch = (evoasm_arch *) x64;
112
-
113
- evoasm_debug("Running CPUID...");
114
-
115
- EVOASM_TRY(alloc_failed, evoasm_buf_init, &buf, EVOASM_BUF_TYPE_MMAP, 512);
116
-
117
- EVOASM_TRY(enc_failed, evoasm_x64_func_prolog, x64, &buf, EVOASM_X64_ABI_SYSV);
118
-
119
- <% remaining_flags = features.keys %>
120
- <% io = StrIO.new %>
121
- <% Evoasm::Gen::X64::CPUID.each_with_index do |((eax_val, ecx_val), out_regs), index0| %>
122
-
123
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_A);
124
- EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, <%= eax_val %>);
125
- EVOASM_X64_ENC(mov_r32_imm32);
126
- evoasm_arch_save(arch, &buf);
127
-
128
- <% if ecx_val %>
129
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_C);
130
- EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, <%= ecx_val %>);
131
- EVOASM_X64_ENC(mov_r32_imm32);
132
- evoasm_arch_save(arch, &buf);
133
- <% end %>
134
-
135
- EVOASM_X64_ENC(cpuid);
136
- evoasm_arch_save(arch, &buf);
137
-
138
- <% out_regs.each.with_index do |(reg, flags), index1| %>
139
-
140
- {
141
- evoasm_arch_param_val addr_imm;
142
- addr_imm = (evoasm_arch_param_val)(uintptr_t) &vals[<%= index0 %>][<%= index1 %>];
143
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
144
- EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
145
- EVOASM_X64_ENC(mov_r64_imm64);
146
- evoasm_arch_save(arch, &buf);
147
-
148
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, <%= reg_name_to_c reg %>);
149
- EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
150
- EVOASM_X64_ENC(mov_rm32_r32);
151
- evoasm_arch_save(arch, &buf);
152
- EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDRESS_SIZE);
153
- EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
154
-
155
- <% flags.each_with_index do |flag, bit_index| %>
156
- <% if remaining_flags.delete(flag) %>
157
- <% io.indent 1 do %>
158
- <% io.puts "if(vals[#{index0}][#{index1}] & (1 << #{bit_index})) {" %>
159
- <% io.puts " x64->features |= #{feature_name_to_c flag};" %>
160
- <% io.puts %{ evoasm_info("Found support for #{flag.upcase}");} %>
161
- <% io.puts "} else {" %>
162
- <% io.puts %{ evoasm_info("Missing support for #{flag.upcase}");} %>
163
- <% io.puts "}" %>
164
- <% end %>
165
- <% end %>
166
- <% end %>
167
- }
168
- <% end%>
169
- <% end %>
170
-
171
- EVOASM_TRY(enc_failed, evoasm_x64_func_epilog, x64, &buf, EVOASM_X64_ABI_SYSV);
172
-
173
- /*evoasm_buf_dump(&buf, stderr);*/
174
-
175
- EVOASM_TRY(enc_failed, evoasm_buf_protect, &buf, EVOASM_MPROT_RX);
176
- evoasm_buf_exec(&buf);
177
-
178
- <%= io.string %>
179
-
180
- cleanup:
181
- EVOASM_TRY(destroy_failed, evoasm_buf_destroy, &buf);
182
- return retval;
183
- enc_failed:
184
- retval = false;
185
- goto cleanup;
186
- destroy_failed:
187
- return false;
188
- alloc_failed:
189
- return false;
190
-
191
- }
192
-
193
- static uint16_t
194
- evoasm_x64_insts(evoasm_x64 *x64, const evoasm_x64_inst **insts) {
195
- uint16_t len = 0;
196
- const evoasm_x64_inst *inst;
197
- /* Assuming that at least some feature is found */
198
-
199
- <% insts.each do |inst| %>
200
- inst = &<%= insts_var_name %>[<%= inst.index %>];
201
- if((inst->features & ~x64->features) == 0) insts[len++] = inst;
202
- <% end %>
203
-
204
- return len;
205
- }
206
-
207
- const evoasm_x64_inst *
208
- evoasm_x64_get_inst(evoasm_x64 *x64, unsigned index, bool ignore_features) {
209
- const evoasm_x64_inst *inst = &<%= insts_var_name %>[index];
210
- if(ignore_features || (inst->features & ~x64->features) == 0) return inst;
211
- return NULL;
212
- }
213
-
214
- static evoasm_arch_cls evoasm_x64_cls = {
215
- EVOASM_ARCH_X64,
216
- EVOASM_X64_N_INSTS,
217
- EVOASM_X64_N_PARAMS,
218
- 15,
219
- (evoasm_arch_insts_func) evoasm_x64_insts,
220
- };
221
-
222
-
223
- evoasm_success
224
- evoasm_x64_init(evoasm_x64 *x64) {
225
- static evoasm_x64 zero_x64 = {0};
226
- evoasm_arch *arch = (evoasm_arch *) x64;
227
- *x64 = zero_x64;
228
-
229
- evoasm_arch_init(arch, &evoasm_x64_cls);
230
- EVOASM_TRY(cpuid_failed, evoasm_x64_load_cpuid, x64);
231
-
232
- evoasm_x64_reg_type_sizes[EVOASM_X64_REG_TYPE_GP] = 8;
233
-
234
- #ifdef EVOASM_X64_ENABLE_AVX512
235
- uint64_t avx512 = EVOASM_X64_FEATURE_AVX512F |
236
- EVOASM_X64_FEATURE_AVX512DQ |
237
- EVOASM_X64_FEATURE_AVX512IFMA |
238
- EVOASM_X64_FEATURE_AVX512PF |
239
- EVOASM_X64_FEATURE_AVX512ER |
240
- EVOASM_X64_FEATURE_AVX512CD |
241
- EVOASM_X64_FEATURE_AVX512BW |
242
- EVOASM_X64_FEATURE_AVX512VL;
243
-
244
- if(x64->features & avx512) {
245
- evoasm_x64_reg_type_sizes[EVOASM_X64_REG_TYPE_XMM] = 64;
246
- evoasm_x64_reg_type_sizes[EVOASM_X64_REG_TYPE_ZMM] = 64;
247
- }
248
- else
249
- #endif
250
- if(x64->features & EVOASM_X64_FEATURE_AVX2) {
251
- evoasm_x64_reg_type_sizes[EVOASM_X64_REG_TYPE_XMM] = 32;
252
- } else {
253
- evoasm_x64_reg_type_sizes[EVOASM_X64_REG_TYPE_XMM] = 16;
254
- }
255
- return true;
256
-
257
- cpuid_failed:
258
- evoasm_arch_destroy(arch);
259
- return false;
260
- }
261
-
262
- void
263
- evoasm_x64_destroy(evoasm_x64 *x64) {
264
- evoasm_arch *arch = (evoasm_arch *) x64;
265
- evoasm_arch_destroy(arch);
266
- }
267
-
268
- <% if options[:ruby] %>
269
-
270
- extern VALUE evoasm_cX64Instruction;
271
-
272
- static ID _rb_x64_inst_ids[<%= insts.size %>];
273
- static ID _rb_x64_reg_ids[<%= reg_names.n %>];
274
- static ID _rb_x64_param_ids[<%= param_names.n %>];
275
- static ID _rb_x64_reg_type_ids[<%= Evoasm::Gen::X64::REGISTERS.size %>];
276
- static ID _rb_x64_operand_type_ids[<%= Evoasm::Gen::X64::REGISTERS.size %>];
277
-
278
- ID *rb_x64_inst_ids =_rb_x64_inst_ids ;
279
- ID *rb_x64_reg_ids = _rb_x64_reg_ids;
280
- ID *rb_x64_param_ids = _rb_x64_param_ids;
281
- ID *rb_x64_operand_type_ids= _rb_x64_operand_type_ids;
282
- ID *rb_x64_reg_type_ids = _rb_x64_reg_type_ids;
283
-
284
- void evoasm_x64_ruby_define_consts() {
285
-
286
- <% Evoasm::Gen::X64::Inst::OPERAND_TYPES.each_with_index do |operand_type, index| %>
287
- rb_x64_operand_type_ids[<%= index %>] = rb_intern("<%= operand_type %>");
288
- <% end %>
289
-
290
-
291
- <% Evoasm::Gen::X64::REGISTERS.keys.each_with_index do |reg_type, index| %>
292
- rb_x64_reg_type_ids[<%= index %>] = rb_intern("<%= reg_type.to_s %>");
293
- <% end %>
294
-
295
- <% param_names.each do |name, index| %>
296
- rb_x64_param_ids[<%= index %>] = rb_intern("<%= name.to_s %>");
297
- <% end %>
298
-
299
- <% features.each do |name, index| %>
300
- rb_define_const(evoasm_cX64Instruction,
301
- "FEATURE_<%= name.upcase %>",
302
- INT2FIX(<%= feature_name_to_c name %>));
303
- <% end %>
304
-
305
- <% inst_flags.each do |name, index| %>
306
- rb_define_const(evoasm_cX64Instruction,
307
- "FLAG_<%= name.upcase %>",
308
- INT2FIX(<%= inst_flag_to_c name %>));
309
- <% end %>
310
-
311
- <% insts.each_with_index do |inst, index| %>
312
- rb_x64_inst_ids[<%= index %>] = rb_intern("<%= inst.name.to_s %>");
313
- <% end %>
314
-
315
- <% reg_names.each do |name, index| %>
316
- rb_x64_reg_ids[<%= index %>] = rb_intern("<%= name =~ /^\d/ ? 'R' : '' %><%= name.to_s %>");
317
- <% end %>
318
- }
319
- <% end %>
@@ -1,126 +0,0 @@
1
- /* vim: set filetype=c: */
2
- /* AUTOGENERATED FILE, DO NOT EDIT */
3
-
4
- #pragma once
5
-
6
- #include "evoasm.h"
7
- #include "evoasm-util.h"
8
-
9
- #include <stdint.h>
10
-
11
- <%= features.to_c %>
12
-
13
- <%= inst_flags.to_c %>
14
-
15
- <%= exceptions.to_c %>
16
-
17
- <%= reg_types.to_c typedef: false %>
18
-
19
- extern uint8_t evoasm_x64_reg_type_sizes[EVOASM_X64_N_REG_TYPES];
20
-
21
- <%= reg_names.to_c %>
22
-
23
- static inline enum evoasm_x64_reg_type
24
- evoasm_x64_reg_type(evoasm_x64_reg_id reg) {
25
- switch(reg) {
26
- <% Evoasm::Gen::X64::REGISTERS.each do |reg_type, regs| %>
27
- <% regs.each do |reg| %>
28
- case <%= reg_name_to_c reg %>: return <%= reg_type_to_c reg_type %>;
29
- <% end %>
30
- <% end %>
31
- default: evoasm_assert_not_reached();
32
- }
33
- }
34
-
35
- <%= param_names.to_c %>
36
-
37
- typedef enum {
38
- <% insts.each do |inst| %>
39
- <%= inst_name_to_c inst %> = <%= inst.index %>,
40
- <% end %>
41
- EVOASM_X64_N_INSTS = <%= insts.size %>,
42
- } evoasm_x64_inst_id;
43
-
44
- typedef struct {
45
- _EVOASM_ARCH_PARAMS_HEADER
46
- evoasm_arch_param_val vals[EVOASM_X64_N_PARAMS];
47
- } evoasm_x64_params;
48
-
49
- _Static_assert(EVOASM_X64_N_PARAMS <= EVOASM_ARCH_MAX_PARAMS, "Too much parameters. Redeclar EVOASM_ARCH_MAX_PARAMS and evoasm_arch_params_bitmap.");
50
-
51
- typedef struct {
52
- evoasm_arch base;
53
- uint64_t features;
54
- } evoasm_x64;
55
-
56
- <%= operand_types.to_c %>
57
-
58
- <%= bit_masks.to_c %>
59
- #define <%= bit_mask_to_c 0..63 %> (<%= bit_mask_to_c 0..31 %> | <%= bit_mask_to_c 32..63 %>)
60
- #define <%= bit_mask_to_c 0..127 %> (<%= bit_mask_to_c 0..63 %> | <%= bit_mask_to_c 64..127 %>)
61
-
62
- typedef struct {
63
- unsigned acc_r: 1;
64
- unsigned acc_w: 1;
65
- unsigned acc_u: 1;
66
- unsigned acc_c: 1;
67
- unsigned implicit: 1;
68
- unsigned param_idx: 5;
69
- unsigned type: EVOASM_X64_OPERAND_TYPE_BITSIZE;
70
- unsigned size: EVOASM_OPERAND_SIZE_BITSIZE_WITH_N;
71
- unsigned reg_id: EVOASM_X64_REG_BITSIZE_WITH_N;
72
- unsigned reg_type: EVOASM_X64_REG_TYPE_BITSIZE_WITH_N;
73
- unsigned acc_w_mask: EVOASM_X64_BIT_MASK_BITSIZE;
74
- } evoasm_x64_operand;
75
-
76
- typedef struct {
77
- evoasm_inst base;
78
- uint64_t features;
79
- evoasm_x64_operand *operands;
80
- uint8_t n_operands;
81
- uint32_t exceptions;
82
- uint32_t flags;
83
- } evoasm_x64_inst;
84
-
85
- #define EVOASM_X64_ENC(inst) \
86
- EVOASM_TRY(enc_failed, evoasm_x64_##inst, x64, params.vals, (evoasm_bitmap *) &params.set)
87
-
88
- #define EVOASM_X64_SET(param, val) \
89
- evoasm_arch_params_set(params.vals, (evoasm_bitmap *) &params.set, param, val)
90
-
91
- #define EVOASM_X64_UNSET(param) \
92
- evoasm_arch_params_unset(params.vals, (evoasm_bitmap *) &params.set, param)
93
-
94
- typedef enum {
95
- EVOASM_X64_ABI_SYSV
96
- } evoasm_x64_abi;
97
-
98
- void
99
- evoasm_x64_destroy(evoasm_x64 *x64);
100
-
101
- evoasm_success
102
- evoasm_x64_init(evoasm_x64 *x64);
103
-
104
- evoasm_success
105
- evoasm_x64_func_prolog(evoasm_x64 *x64, evoasm_buf *buf, evoasm_x64_abi abi);
106
-
107
- evoasm_success
108
- evoasm_x64_func_epilog(evoasm_x64 *x64, evoasm_buf *buf, evoasm_x64_abi abi);
109
-
110
- const evoasm_x64_inst *
111
- evoasm_x64_get_inst(evoasm_x64 *x64, unsigned index, bool ignore_features);
112
-
113
- <% insts.each do |inst| %>
114
- <%= func_prototype_to_c(inst.name, static: false) %>;
115
- <% end %>
116
- <% if options[:ruby] %>
117
-
118
- #include <ruby.h>
119
-
120
- extern ID *rb_x64_inst_ids;
121
- extern ID *rb_x64_reg_ids;
122
- extern ID *rb_x64_param_ids;
123
- extern ID *rb_x64_operand_type_ids;
124
- extern ID *rb_x64_reg_type_ids;
125
- void evoasm_x64_ruby_define_consts();
126
- <% end %>
data/examples/abs.yml DELETED
@@ -1,20 +0,0 @@
1
- instructions:
2
- grep_v: cmov
3
- reg_types: [gp]
4
- examples:
5
- 1: 1
6
- -1: 1
7
- 2: 2
8
- -2: 2
9
- 100: 100
10
- -100: 100
11
- 23: 23
12
- 1024: 1024
13
- -1024: 1024
14
- 200000: 200000
15
- -200000: 200000
16
- 1234: 1234
17
- -1234: 1234
18
-
19
- program_size: 1..5
20
- population_size: 1600