evoasm 0.0.2.pre7 → 0.1.0.pre2

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.
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
@@ -0,0 +1,348 @@
1
+ /* AUTOGENERATED FILE, DO NOT EDIT */
2
+
3
+ /*
4
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU Affero General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Affero General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+ #include "evoasm-x64.h"
21
+ #include "evoasm-log.h"
22
+
23
+ static const char *_evoasm_log_tag = "x64";
24
+
25
+ evoasm_success_t
26
+ evoasm_x64_get_features(uint64_t *features_) {
27
+ evoasm_buf_t buf_;
28
+ evoasm_buf_t *buf = &buf_;
29
+ evoasm_x64_params_t params = {0};
30
+ bool retval = true;
31
+ uint64_t features = 0;
32
+
33
+ uint32_t vals[3][2] = {0};
34
+
35
+ evoasm_log_debug("Running CPUID...");
36
+
37
+ EVOASM_TRY(alloc_failed, evoasm_buf_init, buf, EVOASM_BUF_TYPE_MMAP, 512);
38
+ EVOASM_TRY(enc_failed, evoasm_x64_emit_func_prolog, EVOASM_X64_ABI_SYSV, buf);
39
+
40
+
41
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_A);
42
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, 1);
43
+ EVOASM_X64_ENC(mov_r32_imm32);
44
+
45
+
46
+ EVOASM_X64_ENC(cpuid);
47
+
48
+
49
+ {
50
+ int64_t addr_imm;
51
+ addr_imm = (int64_t)(uintptr_t) &vals[0][0];
52
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
53
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
54
+ EVOASM_X64_ENC(mov_r64_imm64);
55
+
56
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_D);
57
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
58
+ EVOASM_X64_ENC(mov_rm32_r32);
59
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
60
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
61
+
62
+ }
63
+
64
+ {
65
+ int64_t addr_imm;
66
+ addr_imm = (int64_t)(uintptr_t) &vals[0][1];
67
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
68
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
69
+ EVOASM_X64_ENC(mov_r64_imm64);
70
+
71
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_C);
72
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
73
+ EVOASM_X64_ENC(mov_rm32_r32);
74
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
75
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
76
+
77
+ }
78
+
79
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_A);
80
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, 7);
81
+ EVOASM_X64_ENC(mov_r32_imm32);
82
+
83
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_C);
84
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, 0);
85
+ EVOASM_X64_ENC(mov_r32_imm32);
86
+
87
+ EVOASM_X64_ENC(cpuid);
88
+
89
+
90
+ {
91
+ int64_t addr_imm;
92
+ addr_imm = (int64_t)(uintptr_t) &vals[1][0];
93
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
94
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
95
+ EVOASM_X64_ENC(mov_r64_imm64);
96
+
97
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_B);
98
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
99
+ EVOASM_X64_ENC(mov_rm32_r32);
100
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
101
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
102
+
103
+ }
104
+
105
+ {
106
+ int64_t addr_imm;
107
+ addr_imm = (int64_t)(uintptr_t) &vals[1][1];
108
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
109
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
110
+ EVOASM_X64_ENC(mov_r64_imm64);
111
+
112
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_C);
113
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
114
+ EVOASM_X64_ENC(mov_rm32_r32);
115
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
116
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
117
+
118
+ }
119
+
120
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_A);
121
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, 2147483649);
122
+ EVOASM_X64_ENC(mov_r32_imm32);
123
+
124
+
125
+ EVOASM_X64_ENC(cpuid);
126
+
127
+
128
+ {
129
+ int64_t addr_imm;
130
+ addr_imm = (int64_t)(uintptr_t) &vals[2][0];
131
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
132
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
133
+ EVOASM_X64_ENC(mov_r64_imm64);
134
+
135
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_D);
136
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
137
+ EVOASM_X64_ENC(mov_rm32_r32);
138
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
139
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
140
+
141
+ }
142
+
143
+ {
144
+ int64_t addr_imm;
145
+ addr_imm = (int64_t)(uintptr_t) &vals[2][1];
146
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG0, EVOASM_X64_REG_DI);
147
+ EVOASM_X64_SET(EVOASM_X64_PARAM_IMM0, addr_imm);
148
+ EVOASM_X64_ENC(mov_r64_imm64);
149
+
150
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG1, EVOASM_X64_REG_C);
151
+ EVOASM_X64_SET(EVOASM_X64_PARAM_REG_BASE, EVOASM_X64_REG_DI);
152
+ EVOASM_X64_ENC(mov_rm32_r32);
153
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_ADDR_SIZE);
154
+ EVOASM_X64_UNSET(EVOASM_X64_PARAM_REG_BASE);
155
+
156
+ }
157
+
158
+ EVOASM_TRY(enc_failed, evoasm_x64_emit_func_epilog, EVOASM_X64_ABI_SYSV, buf);
159
+
160
+ /*evoasm_buf_dump(buf, stderr);*/
161
+
162
+ EVOASM_TRY(enc_failed, evoasm_buf_protect, buf, EVOASM_MPROT_MODE_RX);
163
+ evoasm_buf_exec(buf);
164
+
165
+ if(vals[0][0] & (1ull << 8)) {
166
+ features |= (1ull << EVOASM_X64_FEATURE_CX8);
167
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "CX8" EVOASM_ANSI_CODE_RESET);
168
+ } else {
169
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " CX8" EVOASM_ANSI_CODE_RESET);
170
+ }
171
+ if(vals[0][0] & (1ull << 15)) {
172
+ features |= (1ull << EVOASM_X64_FEATURE_CMOV);
173
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "CMOV" EVOASM_ANSI_CODE_RESET);
174
+ } else {
175
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " CMOV" EVOASM_ANSI_CODE_RESET);
176
+ }
177
+ if(vals[0][0] & (1ull << 23)) {
178
+ features |= (1ull << EVOASM_X64_FEATURE_MMX);
179
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "MMX" EVOASM_ANSI_CODE_RESET);
180
+ } else {
181
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " MMX" EVOASM_ANSI_CODE_RESET);
182
+ }
183
+ if(vals[0][0] & (1ull << 25)) {
184
+ features |= (1ull << EVOASM_X64_FEATURE_SSE);
185
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSE" EVOASM_ANSI_CODE_RESET);
186
+ } else {
187
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSE" EVOASM_ANSI_CODE_RESET);
188
+ }
189
+ if(vals[0][0] & (1ull << 26)) {
190
+ features |= (1ull << EVOASM_X64_FEATURE_SSE2);
191
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSE2" EVOASM_ANSI_CODE_RESET);
192
+ } else {
193
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSE2" EVOASM_ANSI_CODE_RESET);
194
+ }
195
+ if(vals[0][1] & (1ull << 0)) {
196
+ features |= (1ull << EVOASM_X64_FEATURE_SSE3);
197
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSE3" EVOASM_ANSI_CODE_RESET);
198
+ } else {
199
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSE3" EVOASM_ANSI_CODE_RESET);
200
+ }
201
+ if(vals[0][1] & (1ull << 1)) {
202
+ features |= (1ull << EVOASM_X64_FEATURE_PCLMULQDQ);
203
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "PCLMULQDQ" EVOASM_ANSI_CODE_RESET);
204
+ } else {
205
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " PCLMULQDQ" EVOASM_ANSI_CODE_RESET);
206
+ }
207
+ if(vals[0][1] & (1ull << 9)) {
208
+ features |= (1ull << EVOASM_X64_FEATURE_SSSE3);
209
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSSE3" EVOASM_ANSI_CODE_RESET);
210
+ } else {
211
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSSE3" EVOASM_ANSI_CODE_RESET);
212
+ }
213
+ if(vals[0][1] & (1ull << 12)) {
214
+ features |= (1ull << EVOASM_X64_FEATURE_FMA);
215
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "FMA" EVOASM_ANSI_CODE_RESET);
216
+ } else {
217
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " FMA" EVOASM_ANSI_CODE_RESET);
218
+ }
219
+ if(vals[0][1] & (1ull << 13)) {
220
+ features |= (1ull << EVOASM_X64_FEATURE_CX16);
221
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "CX16" EVOASM_ANSI_CODE_RESET);
222
+ } else {
223
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " CX16" EVOASM_ANSI_CODE_RESET);
224
+ }
225
+ if(vals[0][1] & (1ull << 19)) {
226
+ features |= (1ull << EVOASM_X64_FEATURE_SSE4_1);
227
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSE4_1" EVOASM_ANSI_CODE_RESET);
228
+ } else {
229
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSE4_1" EVOASM_ANSI_CODE_RESET);
230
+ }
231
+ if(vals[0][1] & (1ull << 20)) {
232
+ features |= (1ull << EVOASM_X64_FEATURE_SSE4_2);
233
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SSE4_2" EVOASM_ANSI_CODE_RESET);
234
+ } else {
235
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SSE4_2" EVOASM_ANSI_CODE_RESET);
236
+ }
237
+ if(vals[0][1] & (1ull << 22)) {
238
+ features |= (1ull << EVOASM_X64_FEATURE_MOVBE);
239
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "MOVBE" EVOASM_ANSI_CODE_RESET);
240
+ } else {
241
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " MOVBE" EVOASM_ANSI_CODE_RESET);
242
+ }
243
+ if(vals[0][1] & (1ull << 23)) {
244
+ features |= (1ull << EVOASM_X64_FEATURE_POPCNT);
245
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "POPCNT" EVOASM_ANSI_CODE_RESET);
246
+ } else {
247
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " POPCNT" EVOASM_ANSI_CODE_RESET);
248
+ }
249
+ if(vals[0][1] & (1ull << 25)) {
250
+ features |= (1ull << EVOASM_X64_FEATURE_AES);
251
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "AES" EVOASM_ANSI_CODE_RESET);
252
+ } else {
253
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " AES" EVOASM_ANSI_CODE_RESET);
254
+ }
255
+ if(vals[0][1] & (1ull << 28)) {
256
+ features |= (1ull << EVOASM_X64_FEATURE_AVX);
257
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "AVX" EVOASM_ANSI_CODE_RESET);
258
+ } else {
259
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " AVX" EVOASM_ANSI_CODE_RESET);
260
+ }
261
+ if(vals[0][1] & (1ull << 29)) {
262
+ features |= (1ull << EVOASM_X64_FEATURE_F16C);
263
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "F16C" EVOASM_ANSI_CODE_RESET);
264
+ } else {
265
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " F16C" EVOASM_ANSI_CODE_RESET);
266
+ }
267
+ if(vals[0][1] & (1ull << 30)) {
268
+ features |= (1ull << EVOASM_X64_FEATURE_RDRAND);
269
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "RDRAND" EVOASM_ANSI_CODE_RESET);
270
+ } else {
271
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " RDRAND" EVOASM_ANSI_CODE_RESET);
272
+ }
273
+ if(vals[1][0] & (1ull << 3)) {
274
+ features |= (1ull << EVOASM_X64_FEATURE_BMI1);
275
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "BMI1" EVOASM_ANSI_CODE_RESET);
276
+ } else {
277
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " BMI1" EVOASM_ANSI_CODE_RESET);
278
+ }
279
+ if(vals[1][0] & (1ull << 5)) {
280
+ features |= (1ull << EVOASM_X64_FEATURE_AVX2);
281
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "AVX2" EVOASM_ANSI_CODE_RESET);
282
+ } else {
283
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " AVX2" EVOASM_ANSI_CODE_RESET);
284
+ }
285
+ if(vals[1][0] & (1ull << 8)) {
286
+ features |= (1ull << EVOASM_X64_FEATURE_BMI2);
287
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "BMI2" EVOASM_ANSI_CODE_RESET);
288
+ } else {
289
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " BMI2" EVOASM_ANSI_CODE_RESET);
290
+ }
291
+ if(vals[1][0] & (1ull << 11)) {
292
+ features |= (1ull << EVOASM_X64_FEATURE_RTM);
293
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "RTM" EVOASM_ANSI_CODE_RESET);
294
+ } else {
295
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " RTM" EVOASM_ANSI_CODE_RESET);
296
+ }
297
+ if(vals[1][0] & (1ull << 18)) {
298
+ features |= (1ull << EVOASM_X64_FEATURE_RDSEED);
299
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "RDSEED" EVOASM_ANSI_CODE_RESET);
300
+ } else {
301
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " RDSEED" EVOASM_ANSI_CODE_RESET);
302
+ }
303
+ if(vals[1][0] & (1ull << 19)) {
304
+ features |= (1ull << EVOASM_X64_FEATURE_ADX);
305
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "ADX" EVOASM_ANSI_CODE_RESET);
306
+ } else {
307
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " ADX" EVOASM_ANSI_CODE_RESET);
308
+ }
309
+ if(vals[1][0] & (1ull << 23)) {
310
+ features |= (1ull << EVOASM_X64_FEATURE_CLFLUSHOPT);
311
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "CLFLUSHOPT" EVOASM_ANSI_CODE_RESET);
312
+ } else {
313
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " CLFLUSHOPT" EVOASM_ANSI_CODE_RESET);
314
+ }
315
+ if(vals[1][0] & (1ull << 28)) {
316
+ features |= (1ull << EVOASM_X64_FEATURE_SHA);
317
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "SHA" EVOASM_ANSI_CODE_RESET);
318
+ } else {
319
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " SHA" EVOASM_ANSI_CODE_RESET);
320
+ }
321
+ if(vals[1][1] & (1ull << 0)) {
322
+ features |= (1ull << EVOASM_X64_FEATURE_PREFETCHWT1);
323
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "PREFETCHWT1" EVOASM_ANSI_CODE_RESET);
324
+ } else {
325
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " PREFETCHWT1" EVOASM_ANSI_CODE_RESET);
326
+ }
327
+ if(vals[2][1] & (1ull << 0)) {
328
+ features |= (1ull << EVOASM_X64_FEATURE_LAHF_LM);
329
+ evoasm_log_info("Found support for " EVOASM_ANSI_CODE_GREEN "LAHF_LM" EVOASM_ANSI_CODE_RESET);
330
+ } else {
331
+ evoasm_log_info("Missing support for " EVOASM_ANSI_CODE_RED " LAHF_LM" EVOASM_ANSI_CODE_RESET);
332
+ }
333
+
334
+
335
+ *features_ = features;
336
+
337
+ cleanup:
338
+ EVOASM_TRY(destroy_failed, evoasm_buf_destroy, buf);
339
+ return retval;
340
+ enc_failed:
341
+ retval = false;
342
+ goto cleanup;
343
+ destroy_failed:
344
+ return false;
345
+ alloc_failed:
346
+ return false;
347
+ }
348
+
@@ -0,0 +1,93 @@
1
+ /* vim: set filetype=c: */
2
+ /* AUTOGENERATED FILE, DO NOT EDIT */
3
+
4
+ /*
5
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU Affero General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program 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
15
+ * GNU Affero General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Affero General Public License
18
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ */
20
+
21
+ #pragma once
22
+
23
+ static inline evoasm_x64_reg_type_t
24
+ evoasm_x64_get_reg_type(evoasm_x64_reg_id_t reg) {
25
+ switch(reg) {
26
+ case EVOASM_X64_REG_IP: return EVOASM_X64_REG_TYPE_IP;
27
+ case EVOASM_X64_REG_RFLAGS: return EVOASM_X64_REG_TYPE_RFLAGS;
28
+ case EVOASM_X64_REG_MXCSR: return EVOASM_X64_REG_TYPE_MXCSR;
29
+ case EVOASM_X64_REG_A: return EVOASM_X64_REG_TYPE_GP;
30
+ case EVOASM_X64_REG_C: return EVOASM_X64_REG_TYPE_GP;
31
+ case EVOASM_X64_REG_D: return EVOASM_X64_REG_TYPE_GP;
32
+ case EVOASM_X64_REG_B: return EVOASM_X64_REG_TYPE_GP;
33
+ case EVOASM_X64_REG_SP: return EVOASM_X64_REG_TYPE_GP;
34
+ case EVOASM_X64_REG_BP: return EVOASM_X64_REG_TYPE_GP;
35
+ case EVOASM_X64_REG_SI: return EVOASM_X64_REG_TYPE_GP;
36
+ case EVOASM_X64_REG_DI: return EVOASM_X64_REG_TYPE_GP;
37
+ case EVOASM_X64_REG_8: return EVOASM_X64_REG_TYPE_GP;
38
+ case EVOASM_X64_REG_9: return EVOASM_X64_REG_TYPE_GP;
39
+ case EVOASM_X64_REG_10: return EVOASM_X64_REG_TYPE_GP;
40
+ case EVOASM_X64_REG_11: return EVOASM_X64_REG_TYPE_GP;
41
+ case EVOASM_X64_REG_12: return EVOASM_X64_REG_TYPE_GP;
42
+ case EVOASM_X64_REG_13: return EVOASM_X64_REG_TYPE_GP;
43
+ case EVOASM_X64_REG_14: return EVOASM_X64_REG_TYPE_GP;
44
+ case EVOASM_X64_REG_15: return EVOASM_X64_REG_TYPE_GP;
45
+ case EVOASM_X64_REG_MM0: return EVOASM_X64_REG_TYPE_MM;
46
+ case EVOASM_X64_REG_MM1: return EVOASM_X64_REG_TYPE_MM;
47
+ case EVOASM_X64_REG_MM2: return EVOASM_X64_REG_TYPE_MM;
48
+ case EVOASM_X64_REG_MM3: return EVOASM_X64_REG_TYPE_MM;
49
+ case EVOASM_X64_REG_MM4: return EVOASM_X64_REG_TYPE_MM;
50
+ case EVOASM_X64_REG_MM5: return EVOASM_X64_REG_TYPE_MM;
51
+ case EVOASM_X64_REG_MM6: return EVOASM_X64_REG_TYPE_MM;
52
+ case EVOASM_X64_REG_MM7: return EVOASM_X64_REG_TYPE_MM;
53
+ case EVOASM_X64_REG_XMM0: return EVOASM_X64_REG_TYPE_XMM;
54
+ case EVOASM_X64_REG_XMM1: return EVOASM_X64_REG_TYPE_XMM;
55
+ case EVOASM_X64_REG_XMM2: return EVOASM_X64_REG_TYPE_XMM;
56
+ case EVOASM_X64_REG_XMM3: return EVOASM_X64_REG_TYPE_XMM;
57
+ case EVOASM_X64_REG_XMM4: return EVOASM_X64_REG_TYPE_XMM;
58
+ case EVOASM_X64_REG_XMM5: return EVOASM_X64_REG_TYPE_XMM;
59
+ case EVOASM_X64_REG_XMM6: return EVOASM_X64_REG_TYPE_XMM;
60
+ case EVOASM_X64_REG_XMM7: return EVOASM_X64_REG_TYPE_XMM;
61
+ case EVOASM_X64_REG_XMM8: return EVOASM_X64_REG_TYPE_XMM;
62
+ case EVOASM_X64_REG_XMM9: return EVOASM_X64_REG_TYPE_XMM;
63
+ case EVOASM_X64_REG_XMM10: return EVOASM_X64_REG_TYPE_XMM;
64
+ case EVOASM_X64_REG_XMM11: return EVOASM_X64_REG_TYPE_XMM;
65
+ case EVOASM_X64_REG_XMM12: return EVOASM_X64_REG_TYPE_XMM;
66
+ case EVOASM_X64_REG_XMM13: return EVOASM_X64_REG_TYPE_XMM;
67
+ case EVOASM_X64_REG_XMM14: return EVOASM_X64_REG_TYPE_XMM;
68
+ case EVOASM_X64_REG_XMM15: return EVOASM_X64_REG_TYPE_XMM;
69
+ case EVOASM_X64_REG_ZMM16: return EVOASM_X64_REG_TYPE_ZMM;
70
+ case EVOASM_X64_REG_ZMM17: return EVOASM_X64_REG_TYPE_ZMM;
71
+ case EVOASM_X64_REG_ZMM18: return EVOASM_X64_REG_TYPE_ZMM;
72
+ case EVOASM_X64_REG_ZMM19: return EVOASM_X64_REG_TYPE_ZMM;
73
+ case EVOASM_X64_REG_ZMM20: return EVOASM_X64_REG_TYPE_ZMM;
74
+ case EVOASM_X64_REG_ZMM21: return EVOASM_X64_REG_TYPE_ZMM;
75
+ case EVOASM_X64_REG_ZMM22: return EVOASM_X64_REG_TYPE_ZMM;
76
+ case EVOASM_X64_REG_ZMM23: return EVOASM_X64_REG_TYPE_ZMM;
77
+ case EVOASM_X64_REG_ZMM24: return EVOASM_X64_REG_TYPE_ZMM;
78
+ case EVOASM_X64_REG_ZMM25: return EVOASM_X64_REG_TYPE_ZMM;
79
+ case EVOASM_X64_REG_ZMM26: return EVOASM_X64_REG_TYPE_ZMM;
80
+ case EVOASM_X64_REG_ZMM27: return EVOASM_X64_REG_TYPE_ZMM;
81
+ case EVOASM_X64_REG_ZMM28: return EVOASM_X64_REG_TYPE_ZMM;
82
+ case EVOASM_X64_REG_ZMM29: return EVOASM_X64_REG_TYPE_ZMM;
83
+ case EVOASM_X64_REG_ZMM30: return EVOASM_X64_REG_TYPE_ZMM;
84
+ case EVOASM_X64_REG_ZMM31: return EVOASM_X64_REG_TYPE_ZMM;
85
+ default: evoasm_assert_not_reached();
86
+ }
87
+ }
88
+
89
+ evoasm_success_t
90
+ evoasm_x64_get_features(uint64_t *features);
91
+
92
+ #define EVOASM_X64_INSTS_VAR_NAME _evoasm_x64_insts
93
+
@@ -0,0 +1,51 @@
1
+ /* AUTOGENERATED FILE, DO NOT EDIT */
2
+
3
+ /*
4
+ * Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU Affero General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Affero General Public License
17
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+
21
+ #include "evoasm-x64.h"
22
+
23
+ void evoasm_x64_params_set(evoasm_x64_params_t * params, evoasm_x64_param_id_t param, int64_t param_val) {
24
+ evoasm_x64_params_set_(params, param, param_val );
25
+ }
26
+
27
+ void evoasm_x64_basic_params_set(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param, int64_t param_val) {
28
+ evoasm_x64_basic_params_set_(params, param, param_val );
29
+ }
30
+ int64_t evoasm_x64_params_get(evoasm_x64_params_t * params, evoasm_x64_param_id_t param) {
31
+ return evoasm_x64_params_get_(params, param );
32
+ }
33
+
34
+ int64_t evoasm_x64_basic_params_get(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param) {
35
+ return evoasm_x64_basic_params_get_(params, param );
36
+ }
37
+ void evoasm_x64_params_unset(evoasm_x64_params_t * params, evoasm_x64_param_id_t param) {
38
+ evoasm_x64_params_unset_(params, param );
39
+ }
40
+
41
+ void evoasm_x64_basic_params_unset(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param) {
42
+ evoasm_x64_basic_params_unset_(params, param );
43
+ }
44
+ evoasm_x64_param_type_t evoasm_x64_params_get_type(evoasm_x64_param_id_t param) {
45
+ return evoasm_x64_params_get_type_(param );
46
+ }
47
+
48
+ evoasm_x64_param_type_t evoasm_x64_basic_params_get_type(evoasm_x64_basic_param_id_t param) {
49
+ return evoasm_x64_basic_params_get_type_(param );
50
+ }
51
+