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
@@ -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
+