OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
11 | 11 |
12 #include "native_client/src/include/elf32.h" | 12 #include "native_client/src/include/elf32.h" |
13 #include "native_client/src/include/elf64.h" | 13 #include "native_client/src/include/elf64.h" |
14 #include "native_client/src/shared/platform/nacl_check.h" | 14 #include "native_client/src/shared/platform/nacl_check.h" |
15 #include "native_client/src/shared/utils/types.h" | 15 #include "native_client/src/shared/utils/types.h" |
16 #include "native_client/src/trusted/validator_ragel/unreviewed/decoder.h" | 16 #include "native_client/src/trusted/validator_ragel/decoder.h" |
17 | 17 |
18 /* This is a copy of NaClLog from shared/platform/nacl_log.c to avoid | 18 /* This is a copy of NaClLog from shared/platform/nacl_log.c to avoid |
19 * linking in code in NaCl shared code in the unreviewed/Makefile and be able to | 19 * linking in code in NaCl shared code in the unreviewed/Makefile and be able to |
20 * use CHECK(). | 20 * use CHECK(). |
21 | 21 |
22 * TODO(khim): remove the copy of NaClLog implementation as soon as | 22 * TODO(khim): remove the copy of NaClLog implementation as soon as |
23 * unreviewed/Makefile is eliminated. | 23 * unreviewed/Makefile is eliminated. |
Brad Chen
2012/10/04 17:26:04
Will this change be in this CL or in a subsequent
khim
2012/10/05 08:22:53
It'll be in subsequent CL. Or maybe (most probably
| |
24 */ | 24 */ |
25 void NaClLog(int detail_level, char const *fmt, ...) { | 25 void NaClLog(int detail_level, char const *fmt, ...) { |
26 va_list ap; | 26 va_list ap; |
27 | 27 |
28 UNREFERENCED_PARAMETER(detail_level); | 28 UNREFERENCED_PARAMETER(detail_level); |
29 va_start(ap, fmt); | 29 va_start(ap, fmt); |
30 vfprintf(stderr, fmt, ap); | 30 vfprintf(stderr, fmt, ap); |
31 exit(1); | 31 exit(1); |
32 } | 32 } |
33 | 33 |
34 static void CheckBounds(unsigned char *data, size_t data_size, | 34 static void CheckBounds(unsigned char *data, size_t data_size, |
Brad Chen
2012/10/04 17:26:04
I don't understand what this function is for. Plea
khim
2012/10/05 08:22:53
It's used when we read the ELF file. But as I've s
| |
35 void *ptr, size_t inside_size) { | 35 void *ptr, size_t inside_size) { |
36 CHECK(data <= (unsigned char *) ptr); | 36 CHECK(data <= (unsigned char *) ptr); |
37 CHECK((unsigned char *) ptr + inside_size <= data + data_size); | 37 CHECK((unsigned char *) ptr + inside_size <= data + data_size); |
38 } | 38 } |
39 | 39 |
40 void ReadImage(const char *filename, uint8_t **result, size_t *result_size) { | 40 void ReadImage(const char *filename, uint8_t **result, size_t *result_size) { |
Brad Chen
2012/10/04 17:26:04
As a reader it's a bit frustrating to have a proce
| |
41 FILE *fp; | 41 FILE *fp; |
42 uint8_t *data; | 42 uint8_t *data; |
43 size_t file_size; | 43 size_t file_size; |
44 size_t got; | 44 size_t got; |
45 | 45 |
46 fp = fopen(filename, "rb"); | 46 fp = fopen(filename, "rb"); |
47 if (fp == NULL) { | 47 if (fp == NULL) { |
48 fprintf(stderr, "Failed to open input file: %s\n", filename); | 48 fprintf(stderr, "Failed to open input file: %s\n", filename); |
49 exit(1); | 49 exit(1); |
50 } | 50 } |
(...skipping 19 matching lines...) Expand all Loading... | |
70 *result_size = file_size; | 70 *result_size = file_size; |
71 } | 71 } |
72 | 72 |
73 struct DecodeState { | 73 struct DecodeState { |
74 uint8_t width; | 74 uint8_t width; |
75 const uint8_t *fwait; /* Set to true if fwait is detetected. */ | 75 const uint8_t *fwait; /* Set to true if fwait is detetected. */ |
76 const uint8_t *offset; | 76 const uint8_t *offset; |
77 int ia32_mode; | 77 int ia32_mode; |
78 }; | 78 }; |
79 | 79 |
80 void ProcessInstruction(const uint8_t *begin, const uint8_t *end, | 80 void ProcessInstruction(const uint8_t *begin, const uint8_t *end, |
Brad Chen
2012/10/04 17:26:04
This procedure is way too long. Please factor it i
Brad Chen
2012/10/22 21:29:05
Looks to me like you didn't take care of this requ
| |
81 struct instruction *instruction, void *userdata) { | 81 struct Instruction *instruction, void *userdata) { |
82 const char *instruction_name = instruction->name; | 82 const char *instruction_name = instruction->name; |
83 unsigned char operands_count = instruction->operands_count; | 83 unsigned char operands_count = instruction->operands_count; |
84 unsigned char rex_prefix = instruction->prefix.rex; | 84 unsigned char rex_prefix = instruction->prefix.rex; |
85 enum register_name rm_index = instruction->rm.index; | 85 enum OperandName rm_index = instruction->rm.index; |
86 enum register_name rm_base = instruction->rm.base; | 86 enum OperandName rm_base = instruction->rm.base; |
87 #ifdef _MSC_VER | 87 #ifdef _MSC_VER |
88 Bool data16_prefix = instruction->prefix.data16; | 88 Bool data16_prefix = instruction->prefix.data16; |
Brad Chen
2012/10/04 17:26:04
Again, it is really awful that you have to declare
khim
2012/10/05 08:22:53
Done.
| |
89 #else | 89 #else |
90 _Bool data16_prefix = instruction->prefix.data16; | 90 _Bool data16_prefix = instruction->prefix.data16; |
91 #endif | 91 #endif |
92 const uint8_t *p; | 92 const uint8_t *p; |
93 char delimeter = ' '; | 93 char delimeter = ' '; |
94 int print_rip = FALSE; | 94 int print_rip = FALSE; |
95 int rex_bits = 0; | 95 int rex_bits = 0; |
96 int maybe_rex_bits = 0; | 96 int maybe_rex_bits = 0; |
97 int show_name_suffix = FALSE; | 97 int show_name_suffix = FALSE; |
98 int empty_rex_prefix_ok = FALSE; | 98 int empty_rex_prefix_ok = FALSE; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
236 if (operands_count > 0) { | 236 if (operands_count > 0) { |
237 char rexw_counted = FALSE; | 237 char rexw_counted = FALSE; |
238 show_name_suffix = TRUE; | 238 show_name_suffix = TRUE; |
239 for (i=operands_count-1; i>=0; --i) { | 239 for (i=operands_count-1; i>=0; --i) { |
240 if (instruction->operands[i].name == JMP_TO) { | 240 if (instruction->operands[i].name == JMP_TO) { |
241 /* Most control flow instructions never use suffixes, but "call" and | 241 /* Most control flow instructions never use suffixes, but "call" and |
242 "jmp" do... unless byte offset is used. */ | 242 "jmp" do... unless byte offset is used. */ |
243 if ((!strcmp(instruction_name, "call")) || | 243 if ((!strcmp(instruction_name, "call")) || |
244 (!strcmp(instruction_name, "jmp"))) { | 244 (!strcmp(instruction_name, "jmp"))) { |
245 switch (instruction->operands[i].type) { | 245 switch (instruction->operands[i].type) { |
246 case OPERAND_SIZE_8_BIT: show_name_suffix = FALSE; break; | 246 case OPERAND_TYPE_8_BIT: show_name_suffix = FALSE; break; |
247 case OPERAND_SIZE_16_BIT: show_name_suffix = 'w'; break; | 247 case OPERAND_TYPE_16_BIT: show_name_suffix = 'w'; break; |
248 case OPERAND_SIZE_32_BIT: | 248 case OPERAND_TYPE_32_BIT: |
249 if (((struct DecodeState *)userdata)->ia32_mode) { | 249 if (((struct DecodeState *)userdata)->ia32_mode) { |
250 show_name_suffix = FALSE; | 250 show_name_suffix = FALSE; |
251 } else { | 251 } else { |
252 show_name_suffix = 'q'; | 252 show_name_suffix = 'q'; |
253 rex_bits += (rex_prefix & 0x08) >> 3; | 253 rex_bits += (rex_prefix & 0x08) >> 3; |
254 rexw_counted = TRUE; | 254 rexw_counted = TRUE; |
255 } | 255 } |
256 break; | 256 break; |
257 case OPERAND_SIZE_2_BIT: | 257 case OPERAND_TYPE_2_BIT: |
258 case OPERAND_SIZE_64_BIT: | 258 case OPERAND_TYPE_64_BIT: |
259 case OPERAND_SIZE_128_BIT: | 259 case OPERAND_TYPE_128_BIT: |
260 case OPERAND_SIZE_256_BIT: | 260 case OPERAND_TYPE_256_BIT: |
261 case OPERAND_FLOAT_SIZE_16_BIT: | 261 case OPERAND_TYPE_FLOAT_32_BIT: |
262 case OPERAND_FLOAT_SIZE_32_BIT: | 262 case OPERAND_TYPE_FLOAT_64_BIT: |
263 case OPERAND_FLOAT_SIZE_64_BIT: | 263 case OPERAND_TYPE_FLOAT_80_BIT: |
264 case OPERAND_FLOAT_SIZE_80_BIT: | 264 case OPERAND_TYPE_X87_16_BIT: |
265 case OPERAND_X87_SIZE_16_BIT: | 265 case OPERAND_TYPE_X87_32_BIT: |
266 case OPERAND_X87_SIZE_32_BIT: | 266 case OPERAND_TYPE_X87_64_BIT: |
267 case OPERAND_X87_SIZE_64_BIT: | 267 case OPERAND_TYPE_X87_BCD: |
268 case OPERAND_X87_BCD: | 268 case OPERAND_TYPE_X87_ENV: |
269 case OPERAND_X87_ENV: | 269 case OPERAND_TYPE_X87_STATE: |
270 case OPERAND_X87_STATE: | 270 case OPERAND_TYPE_X87_MMX_XMM_STATE: |
271 case OPERAND_X87_MMX_MM_STATE: | 271 case OPERAND_TYPE_ST: |
272 case OPERAND_ST: | 272 case OPERAND_TYPE_SELECTOR: |
273 case OPERAND_SELECTOR: | 273 case OPERAND_TYPE_FAR_PTR: |
274 case OPERAND_FAR_PTR: | 274 case OPERAND_TYPE_SEGMENT_REGISTER: |
275 case OPERAND_SEGMENT_REGISTER: | 275 case OPERAND_TYPE_CONTROL_REGISTER: |
276 case OPERAND_CONTROL_REGISTER: | 276 case OPERAND_TYPE_DEBUG_REGISTER: |
277 case OPERAND_DEBUG_REGISTER: | 277 case OPERAND_TYPE_MMX: |
278 case OPERAND_MMX: | 278 case OPERAND_TYPE_XMM: |
279 case OPERAND_XMM: | 279 case OPERAND_TYPE_YMM: |
280 case OPERAND_YMM: | |
281 assert(FALSE); | 280 assert(FALSE); |
282 } | 281 } |
283 } else { | 282 } else { |
284 show_name_suffix = FALSE; | 283 show_name_suffix = FALSE; |
285 } | 284 } |
286 } else if ((instruction->operands[i].name == REG_IMM) || | 285 } else if ((instruction->operands[i].name == REG_IMM) || |
287 (instruction->operands[i].name == REG_IMM2) || | 286 (instruction->operands[i].name == REG_IMM2) || |
288 (instruction->operands[i].name == REG_RM) || | 287 (instruction->operands[i].name == REG_RM) || |
289 (instruction->operands[i].name == REG_PORT_DX) || | 288 (instruction->operands[i].name == REG_PORT_DX) || |
290 (instruction->operands[i].name == REG_ES_RDI) || | 289 (instruction->operands[i].name == REG_ES_RDI) || |
291 (instruction->operands[i].name == REG_DS_RSI)) { | 290 (instruction->operands[i].name == REG_DS_RSI)) { |
292 if (show_name_suffix) { | 291 if (show_name_suffix) { |
293 switch (instruction->operands[i].type) { | 292 switch (instruction->operands[i].type) { |
294 case OPERAND_SIZE_8_BIT: show_name_suffix = 'b'; break; | 293 case OPERAND_TYPE_8_BIT: show_name_suffix = 'b'; break; |
295 case OPERAND_SIZE_16_BIT: show_name_suffix = 'w'; break; | 294 case OPERAND_TYPE_16_BIT: show_name_suffix = 'w'; break; |
296 case OPERAND_SIZE_32_BIT: show_name_suffix = 'l'; break; | 295 case OPERAND_TYPE_32_BIT: show_name_suffix = 'l'; break; |
297 case OPERAND_SIZE_64_BIT: show_name_suffix = 'q'; break; | 296 case OPERAND_TYPE_64_BIT: show_name_suffix = 'q'; break; |
298 case OPERAND_FLOAT_SIZE_32_BIT: show_name_suffix = 's'; break; | 297 case OPERAND_TYPE_FLOAT_32_BIT: show_name_suffix = 's'; break; |
299 case OPERAND_FLOAT_SIZE_64_BIT: show_name_suffix = 'l'; break; | 298 case OPERAND_TYPE_FLOAT_64_BIT: show_name_suffix = 'l'; break; |
300 case OPERAND_FLOAT_SIZE_80_BIT:show_name_suffix = 't'; break; | 299 case OPERAND_TYPE_FLOAT_80_BIT:show_name_suffix = 't'; break; |
301 case OPERAND_X87_SIZE_32_BIT: show_name_suffix = 'l'; break; | 300 case OPERAND_TYPE_X87_32_BIT: show_name_suffix = 'l'; break; |
302 case OPERAND_X87_SIZE_64_BIT: show_name_suffix = 'L'; break; | 301 case OPERAND_TYPE_X87_64_BIT: show_name_suffix = 'L'; break; |
303 case OPERAND_SIZE_2_BIT: | 302 case OPERAND_TYPE_2_BIT: |
304 case OPERAND_X87_SIZE_16_BIT: | 303 case OPERAND_TYPE_X87_16_BIT: |
305 case OPERAND_X87_BCD: | 304 case OPERAND_TYPE_X87_BCD: |
306 case OPERAND_X87_ENV: | 305 case OPERAND_TYPE_X87_ENV: |
307 case OPERAND_X87_STATE: | 306 case OPERAND_TYPE_X87_STATE: |
308 case OPERAND_X87_MMX_MM_STATE: | 307 case OPERAND_TYPE_X87_MMX_XMM_STATE: |
309 case OPERAND_SIZE_128_BIT: | 308 case OPERAND_TYPE_128_BIT: |
310 case OPERAND_SIZE_256_BIT: | 309 case OPERAND_TYPE_256_BIT: |
311 case OPERAND_FAR_PTR: | 310 case OPERAND_TYPE_FAR_PTR: |
312 case OPERAND_MMX: | 311 case OPERAND_TYPE_MMX: |
313 case OPERAND_XMM: | 312 case OPERAND_TYPE_XMM: |
314 case OPERAND_YMM: | 313 case OPERAND_TYPE_YMM: |
315 case OPERAND_SELECTOR: show_name_suffix = FALSE; break; | 314 case OPERAND_TYPE_SELECTOR: show_name_suffix = FALSE; break; |
316 case OPERAND_FLOAT_SIZE_16_BIT: | 315 case OPERAND_TYPE_ST: |
317 case OPERAND_ST: | 316 case OPERAND_TYPE_SEGMENT_REGISTER: |
318 case OPERAND_SEGMENT_REGISTER: | 317 case OPERAND_TYPE_CONTROL_REGISTER: |
319 case OPERAND_CONTROL_REGISTER: | 318 case OPERAND_TYPE_DEBUG_REGISTER: |
320 case OPERAND_DEBUG_REGISTER: | |
321 assert(FALSE); | 319 assert(FALSE); |
322 } | 320 } |
323 } | 321 } |
324 } else { | 322 } else { |
325 /* "Empty" rex prefix (0x40) is used to select "sil"/"dil"/"spl"/"bpl". | 323 /* "Empty" rex prefix (0x40) is used to select "sil"/"dil"/"spl"/"bpl". |
326 */ | 324 */ |
327 if (instruction->operands[i].type == OPERAND_SIZE_8_BIT && | 325 if (instruction->operands[i].type == OPERAND_TYPE_8_BIT && |
328 instruction->operands[i].name <= REG_R15) { | 326 instruction->operands[i].name <= REG_R15) { |
329 empty_rex_prefix_ok = TRUE; | 327 empty_rex_prefix_ok = TRUE; |
330 } | 328 } |
331 /* First argument of "rcl"/"rcr"/"rol"/"ror"/"sar/""shl"/"shr" | 329 /* First argument of "rcl"/"rcr"/"rol"/"ror"/"sar/""shl"/"shr" |
332 can not be used to determine size of command. */ | 330 can not be used to determine size of command. */ |
333 if (((i != 1) || (strcmp(instruction_name, "rcl") && | 331 if (((i != 1) || (strcmp(instruction_name, "rcl") && |
334 strcmp(instruction_name, "rcr") && | 332 strcmp(instruction_name, "rcr") && |
335 strcmp(instruction_name, "rol") && | 333 strcmp(instruction_name, "rol") && |
336 strcmp(instruction_name, "ror") && | 334 strcmp(instruction_name, "ror") && |
337 strcmp(instruction_name, "sal") && | 335 strcmp(instruction_name, "sal") && |
338 strcmp(instruction_name, "sar") && | 336 strcmp(instruction_name, "sar") && |
339 strcmp(instruction_name, "shl") && | 337 strcmp(instruction_name, "shl") && |
340 strcmp(instruction_name, "shr"))) && | 338 strcmp(instruction_name, "shr"))) && |
341 /* Second argument of "crc32" can not be used to determine size of | 339 /* Second argument of "crc32" can not be used to determine size of |
342 command. */ | 340 command. */ |
343 ((i != 0) || strcmp(instruction_name, "crc32"))) { | 341 ((i != 0) || strcmp(instruction_name, "crc32"))) { |
344 show_name_suffix = FALSE; | 342 show_name_suffix = FALSE; |
345 } | 343 } |
346 /* First argument of "crc32" can be used for that but objdump uses | 344 /* First argument of "crc32" can be used for that but objdump uses |
347 suffix anyway. */ | 345 suffix anyway. */ |
348 if ((i == 1) && (!strcmp(instruction_name, "crc32"))) { | 346 if ((i == 1) && (!strcmp(instruction_name, "crc32"))) { |
349 switch (instruction->operands[i].type) { | 347 switch (instruction->operands[i].type) { |
350 case OPERAND_SIZE_8_BIT: show_name_suffix = 'b'; break; | 348 case OPERAND_TYPE_8_BIT: show_name_suffix = 'b'; break; |
351 case OPERAND_SIZE_16_BIT: show_name_suffix = 'w'; break; | 349 case OPERAND_TYPE_16_BIT: show_name_suffix = 'w'; break; |
352 case OPERAND_SIZE_32_BIT: show_name_suffix = 'l'; break; | 350 case OPERAND_TYPE_32_BIT: show_name_suffix = 'l'; break; |
353 case OPERAND_SIZE_64_BIT: show_name_suffix = 'q'; break; | 351 case OPERAND_TYPE_64_BIT: show_name_suffix = 'q'; break; |
354 case OPERAND_SIZE_2_BIT: | 352 case OPERAND_TYPE_2_BIT: |
355 case OPERAND_SIZE_128_BIT: | 353 case OPERAND_TYPE_128_BIT: |
356 case OPERAND_SIZE_256_BIT: | 354 case OPERAND_TYPE_256_BIT: |
357 case OPERAND_FLOAT_SIZE_16_BIT: | 355 case OPERAND_TYPE_FLOAT_32_BIT: |
358 case OPERAND_FLOAT_SIZE_32_BIT: | 356 case OPERAND_TYPE_FLOAT_64_BIT: |
359 case OPERAND_FLOAT_SIZE_64_BIT: | 357 case OPERAND_TYPE_FLOAT_80_BIT: |
360 case OPERAND_FLOAT_SIZE_80_BIT: | 358 case OPERAND_TYPE_X87_16_BIT: |
361 case OPERAND_X87_SIZE_16_BIT: | 359 case OPERAND_TYPE_X87_32_BIT: |
362 case OPERAND_X87_SIZE_32_BIT: | 360 case OPERAND_TYPE_X87_64_BIT: |
363 case OPERAND_X87_SIZE_64_BIT: | 361 case OPERAND_TYPE_X87_BCD: |
364 case OPERAND_X87_BCD: | 362 case OPERAND_TYPE_X87_ENV: |
365 case OPERAND_X87_ENV: | 363 case OPERAND_TYPE_X87_STATE: |
366 case OPERAND_X87_STATE: | 364 case OPERAND_TYPE_X87_MMX_XMM_STATE: |
367 case OPERAND_X87_MMX_MM_STATE: | 365 case OPERAND_TYPE_ST: |
368 case OPERAND_ST: | 366 case OPERAND_TYPE_SELECTOR: |
369 case OPERAND_SELECTOR: | 367 case OPERAND_TYPE_FAR_PTR: |
370 case OPERAND_FAR_PTR: | 368 case OPERAND_TYPE_SEGMENT_REGISTER: |
371 case OPERAND_SEGMENT_REGISTER: | 369 case OPERAND_TYPE_CONTROL_REGISTER: |
372 case OPERAND_CONTROL_REGISTER: | 370 case OPERAND_TYPE_DEBUG_REGISTER: |
373 case OPERAND_DEBUG_REGISTER: | 371 case OPERAND_TYPE_MMX: |
374 case OPERAND_MMX: | 372 case OPERAND_TYPE_XMM: |
375 case OPERAND_XMM: | 373 case OPERAND_TYPE_YMM: |
376 case OPERAND_YMM: | |
377 assert(FALSE); | 374 assert(FALSE); |
378 } | 375 } |
379 } | 376 } |
380 } | 377 } |
381 if ((instruction->operands[i].name >= REG_R8) && | 378 if ((instruction->operands[i].name >= REG_R8) && |
382 (instruction->operands[i].name <= REG_R15) && | 379 (instruction->operands[i].name <= REG_R15) && |
383 (instruction->operands[i].type != OPERAND_MMX)) { | 380 (instruction->operands[i].type != OPERAND_TYPE_MMX)) { |
384 if (!((struct DecodeState *)userdata)->ia32_mode) { | 381 if (!((struct DecodeState *)userdata)->ia32_mode) { |
385 ++rex_bits; | 382 ++rex_bits; |
386 /* HACK: objdump mistakenly allows "lock" with "mov %crX,%rXX" only in | 383 /* HACK: objdump mistakenly allows "lock" with "mov %crX,%rXX" only in |
387 32bit mode. It's perfectly valid in 64bit mode, too, so instead of | 384 32bit mode. It's perfectly valid in 64bit mode, too, so instead of |
388 changing the decoder we fix it here. */ | 385 changing the decoder we fix it here. */ |
389 if (instruction->operands[i].type == OPERAND_CONTROL_REGISTER) { | 386 if (instruction->operands[i].type == OPERAND_TYPE_CONTROL_REGISTER) { |
390 if ((*begin == 0xf0) && !(instruction->prefix.lock)) { | 387 if ((*begin == 0xf0) && !(instruction->prefix.lock)) { |
391 print_name("lock "); | 388 print_name("lock "); |
392 if (!(rex_prefix & 0x04)) { | 389 if (!(rex_prefix & 0x04)) { |
393 instruction->operands[i].name -= 8; | 390 instruction->operands[i].name -= 8; |
394 --rex_bits; | 391 --rex_bits; |
395 } | 392 } |
396 } | 393 } |
397 } | 394 } |
398 } | 395 } |
399 } else if (instruction->operands[i].name == REG_RM) { | 396 } else if (instruction->operands[i].name == REG_RM) { |
400 if ((rm_base >= REG_R8) && | 397 if ((rm_base >= REG_R8) && |
401 (rm_base <= REG_R15)) { | 398 (rm_base <= REG_R15)) { |
402 ++rex_bits; | 399 ++rex_bits; |
403 } else if ((rm_base == NO_REG) || | 400 } else if ((rm_base == NO_REG) || |
404 (rm_base == REG_RIP)) { | 401 (rm_base == REG_RIP)) { |
405 if (strcmp(instruction_name, "movabs")) | 402 if (strcmp(instruction_name, "movabs")) |
406 ++maybe_rex_bits; | 403 ++maybe_rex_bits; |
407 } | 404 } |
408 if ((rm_index >= REG_R8) && | 405 if ((rm_index >= REG_R8) && |
409 (rm_index <= REG_R15)) { | 406 (rm_index <= REG_R15)) { |
410 ++rex_bits; | 407 ++rex_bits; |
411 } | 408 } |
412 } | 409 } |
413 if ((instruction->operands[i].type == OPERAND_SIZE_64_BIT) && | 410 if ((instruction->operands[i].type == OPERAND_TYPE_64_BIT) && |
Brad Chen
2012/10/22 21:29:05
The disappearance of this next large block of code
| |
414 !rexw_counted) { | 411 !rexw_counted) { |
415 if (strcmp(instruction_name, "callq") && | 412 if (strcmp(instruction_name, "callq") && |
Brad Chen
2012/10/04 17:26:04
Please break this if statement out into its own fu
| |
416 strcmp(instruction_name, "cmpxchg8b") && | 413 strcmp(instruction_name, "cmpxchg8b") && |
417 strcmp(instruction_name, "cvtpi2ps") && | 414 strcmp(instruction_name, "cvtpi2ps") && |
418 strcmp(instruction_name, "cvtpi2pd") && | 415 strcmp(instruction_name, "cvtpi2pd") && |
419 (strcmp(instruction_name, "extractps") || | 416 (strcmp(instruction_name, "extractps") || |
420 instruction->operands[i].name != REG_RM) && | 417 instruction->operands[i].name != REG_RM) && |
421 strcmp(instruction_name, "jmpq") && | 418 strcmp(instruction_name, "jmpq") && |
422 strcmp(instruction_name, "monitor") && | 419 strcmp(instruction_name, "monitor") && |
423 strcmp(instruction_name, "movntq") && | 420 strcmp(instruction_name, "movntq") && |
424 strcmp(instruction_name, "movhpd") && | 421 strcmp(instruction_name, "movhpd") && |
425 strcmp(instruction_name, "movhps") && | 422 strcmp(instruction_name, "movhps") && |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
543 strcmp(instruction_name, "punpcklqdq") && | 540 strcmp(instruction_name, "punpcklqdq") && |
544 strcmp(instruction_name, "punpcklwd") && | 541 strcmp(instruction_name, "punpcklwd") && |
545 strcmp(instruction_name, "push") && | 542 strcmp(instruction_name, "push") && |
546 strcmp(instruction_name, "pxor") && | 543 strcmp(instruction_name, "pxor") && |
547 strcmp(instruction_name, "unpckhpd") && | 544 strcmp(instruction_name, "unpckhpd") && |
548 strcmp(instruction_name, "unpcklpd")) { | 545 strcmp(instruction_name, "unpcklpd")) { |
549 ++rex_bits; | 546 ++rex_bits; |
550 rexw_counted = TRUE; | 547 rexw_counted = TRUE; |
551 } | 548 } |
552 if ((operands_count == 2) && | 549 if ((operands_count == 2) && |
553 ((instruction->operands[1-i].type == OPERAND_CONTROL_REGISTER) || | 550 ((instruction->operands[1-i].type == OPERAND_TYPE_CONTROL_REGISTER) || |
554 (instruction->operands[1-i].type == OPERAND_DEBUG_REGISTER))) { | 551 (instruction->operands[1-i].type == OPERAND_TYPE_DEBUG_REGISTER))) { |
555 --rex_bits; | 552 --rex_bits; |
556 } | 553 } |
557 } | 554 } |
558 if ((instruction->operands[i].type == OPERAND_SIZE_128_BIT) && | 555 if ((instruction->operands[i].type == OPERAND_TYPE_128_BIT) && |
559 !rexw_counted) { | 556 !rexw_counted) { |
560 if (!strcmp(instruction_name, "cmpxchg16b")) { | 557 if (!strcmp(instruction_name, "cmpxchg16b")) { |
561 ++rex_bits; | 558 ++rex_bits; |
562 rexw_counted = TRUE; | 559 rexw_counted = TRUE; |
563 } | 560 } |
564 } | 561 } |
565 } | 562 } |
566 } | 563 } |
567 if ((!strcmp(instruction_name, "cvtsi2sd") || | 564 if ((!strcmp(instruction_name, "cvtsi2sd") || |
568 !strcmp(instruction_name, "cvtsi2ss")) && | 565 !strcmp(instruction_name, "cvtsi2ss")) && |
569 instruction->operands[1].name == REG_RM) { | 566 instruction->operands[1].name == REG_RM) { |
570 if (instruction->operands[1].type == OPERAND_SIZE_32_BIT) { | 567 if (instruction->operands[1].type == OPERAND_TYPE_32_BIT) { |
571 show_name_suffix = 'l'; | 568 show_name_suffix = 'l'; |
572 } else { | 569 } else { |
573 show_name_suffix = 'q'; | 570 show_name_suffix = 'q'; |
574 } | 571 } |
575 } | 572 } |
576 if ((!strcmp(instruction_name, "vcvtpd2dq") || | 573 if ((!strcmp(instruction_name, "vcvtpd2dq") || |
577 !strcmp(instruction_name, "vcvtpd2ps") || | 574 !strcmp(instruction_name, "vcvtpd2ps") || |
578 !strcmp(instruction_name, "vcvttpd2dq") || | 575 !strcmp(instruction_name, "vcvttpd2dq") || |
579 !strcmp(instruction_name, "vcvttpd2ps")) && | 576 !strcmp(instruction_name, "vcvttpd2ps")) && |
580 instruction->operands[1].name == REG_RM) { | 577 instruction->operands[1].name == REG_RM) { |
581 if (instruction->operands[1].type == OPERAND_SIZE_128_BIT) { | 578 if (instruction->operands[1].type == OPERAND_TYPE_128_BIT) { |
582 show_name_suffix = 'x'; | 579 show_name_suffix = 'x'; |
583 } else { | 580 } else { |
584 show_name_suffix = 'y'; | 581 show_name_suffix = 'y'; |
585 } | 582 } |
586 } | 583 } |
587 if ((!strcmp(instruction_name, "vcvtsi2sd") || | 584 if ((!strcmp(instruction_name, "vcvtsi2sd") || |
588 !strcmp(instruction_name, "vcvtsi2ss")) && | 585 !strcmp(instruction_name, "vcvtsi2ss")) && |
589 instruction->operands[2].name == REG_RM) { | 586 instruction->operands[2].name == REG_RM) { |
590 if (instruction->operands[2].type == OPERAND_SIZE_32_BIT) { | 587 if (instruction->operands[2].type == OPERAND_TYPE_32_BIT) { |
591 show_name_suffix = 'l'; | 588 show_name_suffix = 'l'; |
592 } else { | 589 } else { |
593 show_name_suffix = 'q'; | 590 show_name_suffix = 'q'; |
594 } | 591 } |
595 } | 592 } |
596 if (instruction->prefix.lock && (begin[0] == 0xf0)) { | 593 if (instruction->prefix.lock && (begin[0] == 0xf0)) { |
597 print_name("lock "); | 594 print_name("lock "); |
598 } | 595 } |
599 if (instruction->prefix.repnz && (begin[0] == 0xf2)) { | 596 if (instruction->prefix.repnz && (begin[0] == 0xf2)) { |
600 print_name("repnz "); | 597 print_name("repnz "); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
797 /* "callq","cmpxchg8b"/"jmpq" already include suffix in the nanme. */ | 794 /* "callq","cmpxchg8b"/"jmpq" already include suffix in the nanme. */ |
798 if ((!strcmp(instruction_name, "callq")) || | 795 if ((!strcmp(instruction_name, "callq")) || |
799 (!strcmp(instruction_name, "cmpxchg8b")) || | 796 (!strcmp(instruction_name, "cmpxchg8b")) || |
800 (!strcmp(instruction_name, "jmpq"))) { | 797 (!strcmp(instruction_name, "jmpq"))) { |
801 show_name_suffix = FALSE; | 798 show_name_suffix = FALSE; |
802 } | 799 } |
803 } | 800 } |
804 if (rex_prefix & 0x08) { | 801 if (rex_prefix & 0x08) { |
805 /* rex.W is not shown for relative jumps with rel32 operand, but are | 802 /* rex.W is not shown for relative jumps with rel32 operand, but are |
806 shown for relative jumps with rel8 operands. */ | 803 shown for relative jumps with rel8 operands. */ |
807 if ((instruction->operands[0].type == OPERAND_SIZE_32_BIT) && | 804 if ((instruction->operands[0].type == OPERAND_TYPE_32_BIT) && |
808 (!strcmp(instruction_name, "ja") || | 805 (!strcmp(instruction_name, "ja") || |
809 !strcmp(instruction_name, "jae") || | 806 !strcmp(instruction_name, "jae") || |
810 !strcmp(instruction_name, "jb") || | 807 !strcmp(instruction_name, "jb") || |
811 !strcmp(instruction_name, "jbe") || | 808 !strcmp(instruction_name, "jbe") || |
812 !strcmp(instruction_name, "je") || | 809 !strcmp(instruction_name, "je") || |
813 !strcmp(instruction_name, "jg") || | 810 !strcmp(instruction_name, "jg") || |
814 !strcmp(instruction_name, "jge") || | 811 !strcmp(instruction_name, "jge") || |
815 !strcmp(instruction_name, "jl") || | 812 !strcmp(instruction_name, "jl") || |
816 !strcmp(instruction_name, "jle") || | 813 !strcmp(instruction_name, "jle") || |
817 !strcmp(instruction_name, "jne") || | 814 !strcmp(instruction_name, "jne") || |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
882 if (show_name_suffix) { | 879 if (show_name_suffix) { |
883 if (show_name_suffix == 'L') { | 880 if (show_name_suffix == 'L') { |
884 print_name("ll"); | 881 print_name("ll"); |
885 } else { | 882 } else { |
886 printf("%c", show_name_suffix); | 883 printf("%c", show_name_suffix); |
887 ++shown_name; | 884 ++shown_name; |
888 } | 885 } |
889 } | 886 } |
890 if (!strcmp(instruction_name, "mov")) { | 887 if (!strcmp(instruction_name, "mov")) { |
891 if ((instruction->operands[1].name == REG_IMM) && | 888 if ((instruction->operands[1].name == REG_IMM) && |
892 (instruction->operands[1].type == OPERAND_SIZE_64_BIT)) { | 889 (instruction->operands[1].type == OPERAND_TYPE_64_BIT)) { |
893 print_name("abs"); | 890 print_name("abs"); |
894 } | 891 } |
895 } | 892 } |
896 { | 893 { |
897 size_t i; | 894 size_t i; |
898 /* Print branch hint suffixes for conditional jump instructions (Jcc). */ | 895 /* Print branch hint suffixes for conditional jump instructions (Jcc). */ |
899 const char* jcc_jumps[] = { | 896 const char* jcc_jumps[] = { |
900 "ja", "jae", "jbe", "jb", "je", "jg", "jge", "jle", | 897 "ja", "jae", "jbe", "jb", "je", "jg", "jge", "jle", |
901 "jl", "jne", "jno", "jnp", "jns", "jo", "jp", "js", | 898 "jl", "jne", "jno", "jnp", "jns", "jo", "jp", "js", |
902 "jecxz", "jrcxz", "loop", "loope", "loopne", NULL}; | 899 "jecxz", "jrcxz", "loop", "loope", "loopne", NULL}; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
980 (!strcmp(instruction_name, "ljmpq")) || | 977 (!strcmp(instruction_name, "ljmpq")) || |
981 (!strcmp(instruction_name, "lcallw")) || | 978 (!strcmp(instruction_name, "lcallw")) || |
982 (!strcmp(instruction_name, "lcallq"))) { | 979 (!strcmp(instruction_name, "lcallq"))) { |
983 printf("*"); | 980 printf("*"); |
984 } | 981 } |
985 /* Dirty hack: both AMD manual and Intel manual agree that mov from general | 982 /* Dirty hack: both AMD manual and Intel manual agree that mov from general |
986 purpose register to segment register has signature "mov Ew Sw", but | 983 purpose register to segment register has signature "mov Ew Sw", but |
987 objdump insist on 32bit/64 bit. This is clearly error in objdump so we | 984 objdump insist on 32bit/64 bit. This is clearly error in objdump so we |
988 fix it here and not in decoder. */ | 985 fix it here and not in decoder. */ |
989 if ((begin[0] >= 0x48) && (begin[0] <= 0x4f) && (begin[1] == 0x8e) && | 986 if ((begin[0] >= 0x48) && (begin[0] <= 0x4f) && (begin[1] == 0x8e) && |
990 (instruction->operands[i].type == OPERAND_SIZE_16_BIT)) { | 987 (instruction->operands[i].type == OPERAND_TYPE_16_BIT)) { |
991 operand_type = OPERAND_SIZE_64_BIT; | 988 operand_type = OPERAND_TYPE_64_BIT; |
992 } else if (((begin[0] == 0x8e) || | 989 } else if (((begin[0] == 0x8e) || |
993 ((begin[0] >= 0x40) && (begin[0] <= 0x4f) && (begin[1] == 0x8e))) && | 990 ((begin[0] >= 0x40) && (begin[0] <= 0x4f) && (begin[1] == 0x8e))) && |
994 (instruction->operands[i].type == OPERAND_SIZE_16_BIT)) { | 991 (instruction->operands[i].type == OPERAND_TYPE_16_BIT)) { |
995 operand_type = OPERAND_SIZE_32_BIT; | 992 operand_type = OPERAND_TYPE_32_BIT; |
996 } else { | 993 } else { |
997 operand_type = instruction->operands[i].type; | 994 operand_type = instruction->operands[i].type; |
998 } | 995 } |
999 switch (instruction->operands[i].name) { | 996 switch (instruction->operands[i].name) { |
1000 case REG_RAX: switch (operand_type) { | 997 case REG_RAX: switch (operand_type) { |
1001 case OPERAND_SIZE_8_BIT: printf("%%al"); break; | 998 case OPERAND_TYPE_8_BIT: printf("%%al"); break; |
1002 case OPERAND_SIZE_16_BIT: printf("%%ax"); break; | 999 case OPERAND_TYPE_16_BIT: printf("%%ax"); break; |
1003 case OPERAND_SIZE_32_BIT: printf("%%eax"); break; | 1000 case OPERAND_TYPE_32_BIT: printf("%%eax"); break; |
1004 case OPERAND_SIZE_64_BIT: printf("%%rax"); break; | 1001 case OPERAND_TYPE_64_BIT: printf("%%rax"); break; |
1005 case OPERAND_ST: printf("%%st(0)"); break; | 1002 case OPERAND_TYPE_ST: printf("%%st(0)"); break; |
1006 case OPERAND_MMX: printf("%%mm0"); break; | 1003 case OPERAND_TYPE_MMX: printf("%%mm0"); break; |
1007 case OPERAND_FLOAT_SIZE_32_BIT: | 1004 case OPERAND_TYPE_FLOAT_32_BIT: |
1008 case OPERAND_FLOAT_SIZE_64_BIT: | 1005 case OPERAND_TYPE_FLOAT_64_BIT: |
1009 case OPERAND_SIZE_128_BIT: | 1006 case OPERAND_TYPE_128_BIT: |
1010 case OPERAND_XMM: printf("%%xmm0"); break; | 1007 case OPERAND_TYPE_XMM: printf("%%xmm0"); break; |
1011 case OPERAND_SIZE_256_BIT: | 1008 case OPERAND_TYPE_256_BIT: |
1012 case OPERAND_YMM: printf("%%ymm0"); break; | 1009 case OPERAND_TYPE_YMM: printf("%%ymm0"); break; |
1013 case OPERAND_SEGMENT_REGISTER: printf("%%es"); break; | 1010 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%es"); break; |
1014 case OPERAND_CONTROL_REGISTER: printf("%%cr0"); break; | 1011 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr0"); break; |
1015 case OPERAND_DEBUG_REGISTER: printf("%%db0"); break; | 1012 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db0"); break; |
1016 default: assert(FALSE); | 1013 default: assert(FALSE); |
1017 } | 1014 } |
1018 break; | 1015 break; |
1019 case REG_RCX: switch (operand_type) { | 1016 case REG_RCX: switch (operand_type) { |
1020 case OPERAND_SIZE_8_BIT: printf("%%cl"); break; | 1017 case OPERAND_TYPE_8_BIT: printf("%%cl"); break; |
1021 case OPERAND_SIZE_16_BIT: printf("%%cx"); break; | 1018 case OPERAND_TYPE_16_BIT: printf("%%cx"); break; |
1022 case OPERAND_SIZE_32_BIT: printf("%%ecx"); break; | 1019 case OPERAND_TYPE_32_BIT: printf("%%ecx"); break; |
1023 case OPERAND_SIZE_64_BIT: printf("%%rcx"); break; | 1020 case OPERAND_TYPE_64_BIT: printf("%%rcx"); break; |
1024 case OPERAND_ST: printf("%%st(1)"); break; | 1021 case OPERAND_TYPE_ST: printf("%%st(1)"); break; |
1025 case OPERAND_MMX: printf("%%mm1"); break; | 1022 case OPERAND_TYPE_MMX: printf("%%mm1"); break; |
1026 case OPERAND_FLOAT_SIZE_32_BIT: | 1023 case OPERAND_TYPE_FLOAT_32_BIT: |
1027 case OPERAND_FLOAT_SIZE_64_BIT: | 1024 case OPERAND_TYPE_FLOAT_64_BIT: |
1028 case OPERAND_SIZE_128_BIT: | 1025 case OPERAND_TYPE_128_BIT: |
1029 case OPERAND_XMM: printf("%%xmm1"); break; | 1026 case OPERAND_TYPE_XMM: printf("%%xmm1"); break; |
1030 case OPERAND_SIZE_256_BIT: | 1027 case OPERAND_TYPE_256_BIT: |
1031 case OPERAND_YMM: printf("%%ymm1"); break; | 1028 case OPERAND_TYPE_YMM: printf("%%ymm1"); break; |
1032 case OPERAND_SEGMENT_REGISTER: printf("%%cs"); break; | 1029 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%cs"); break; |
1033 case OPERAND_CONTROL_REGISTER: printf("%%cr1"); break; | 1030 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr1"); break; |
1034 case OPERAND_DEBUG_REGISTER: printf("%%db1"); break; | 1031 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db1"); break; |
1035 default: assert(FALSE); | 1032 default: assert(FALSE); |
1036 } | 1033 } |
1037 break; | 1034 break; |
1038 case REG_RDX: switch (operand_type) { | 1035 case REG_RDX: switch (operand_type) { |
1039 case OPERAND_SIZE_8_BIT: printf("%%dl"); break; | 1036 case OPERAND_TYPE_8_BIT: printf("%%dl"); break; |
1040 case OPERAND_SIZE_16_BIT: printf("%%dx"); break; | 1037 case OPERAND_TYPE_16_BIT: printf("%%dx"); break; |
1041 case OPERAND_SIZE_32_BIT: printf("%%edx"); break; | 1038 case OPERAND_TYPE_32_BIT: printf("%%edx"); break; |
1042 case OPERAND_SIZE_64_BIT: printf("%%rdx"); break; | 1039 case OPERAND_TYPE_64_BIT: printf("%%rdx"); break; |
1043 case OPERAND_ST: printf("%%st(2)"); break; | 1040 case OPERAND_TYPE_ST: printf("%%st(2)"); break; |
1044 case OPERAND_MMX: printf("%%mm2"); break; | 1041 case OPERAND_TYPE_MMX: printf("%%mm2"); break; |
1045 case OPERAND_FLOAT_SIZE_32_BIT: | 1042 case OPERAND_TYPE_FLOAT_32_BIT: |
1046 case OPERAND_FLOAT_SIZE_64_BIT: | 1043 case OPERAND_TYPE_FLOAT_64_BIT: |
1047 case OPERAND_SIZE_128_BIT: | 1044 case OPERAND_TYPE_128_BIT: |
1048 case OPERAND_XMM: printf("%%xmm2"); break; | 1045 case OPERAND_TYPE_XMM: printf("%%xmm2"); break; |
1049 case OPERAND_SIZE_256_BIT: | 1046 case OPERAND_TYPE_256_BIT: |
1050 case OPERAND_YMM: printf("%%ymm2"); break; | 1047 case OPERAND_TYPE_YMM: printf("%%ymm2"); break; |
1051 case OPERAND_SEGMENT_REGISTER: printf("%%ss"); break; | 1048 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%ss"); break; |
1052 case OPERAND_CONTROL_REGISTER: printf("%%cr2"); break; | 1049 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr2"); break; |
1053 case OPERAND_DEBUG_REGISTER: printf("%%db2"); break; | 1050 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db2"); break; |
1054 default: assert(FALSE); | 1051 default: assert(FALSE); |
1055 } | 1052 } |
1056 break; | 1053 break; |
1057 case REG_RBX: switch (operand_type) { | 1054 case REG_RBX: switch (operand_type) { |
1058 case OPERAND_SIZE_8_BIT: printf("%%bl"); break; | 1055 case OPERAND_TYPE_8_BIT: printf("%%bl"); break; |
1059 case OPERAND_SIZE_16_BIT: printf("%%bx"); break; | 1056 case OPERAND_TYPE_16_BIT: printf("%%bx"); break; |
1060 case OPERAND_SIZE_32_BIT: printf("%%ebx"); break; | 1057 case OPERAND_TYPE_32_BIT: printf("%%ebx"); break; |
1061 case OPERAND_SIZE_64_BIT: printf("%%rbx"); break; | 1058 case OPERAND_TYPE_64_BIT: printf("%%rbx"); break; |
1062 case OPERAND_ST: printf("%%st(3)"); break; | 1059 case OPERAND_TYPE_ST: printf("%%st(3)"); break; |
1063 case OPERAND_MMX: printf("%%mm3"); break; | 1060 case OPERAND_TYPE_MMX: printf("%%mm3"); break; |
1064 case OPERAND_FLOAT_SIZE_32_BIT: | 1061 case OPERAND_TYPE_FLOAT_32_BIT: |
1065 case OPERAND_FLOAT_SIZE_64_BIT: | 1062 case OPERAND_TYPE_FLOAT_64_BIT: |
1066 case OPERAND_SIZE_128_BIT: | 1063 case OPERAND_TYPE_128_BIT: |
1067 case OPERAND_XMM: printf("%%xmm3"); break; | 1064 case OPERAND_TYPE_XMM: printf("%%xmm3"); break; |
1068 case OPERAND_SIZE_256_BIT: | 1065 case OPERAND_TYPE_256_BIT: |
1069 case OPERAND_YMM: printf("%%ymm3"); break; | 1066 case OPERAND_TYPE_YMM: printf("%%ymm3"); break; |
1070 case OPERAND_SEGMENT_REGISTER: printf("%%ds"); break; | 1067 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%ds"); break; |
1071 case OPERAND_CONTROL_REGISTER: printf("%%cr3"); break; | 1068 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr3"); break; |
1072 case OPERAND_DEBUG_REGISTER: printf("%%db3"); break; | 1069 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db3"); break; |
1073 default: assert(FALSE); | 1070 default: assert(FALSE); |
1074 } | 1071 } |
1075 break; | 1072 break; |
1076 case REG_RSP: switch (operand_type) { | 1073 case REG_RSP: switch (operand_type) { |
1077 case OPERAND_SIZE_8_BIT: if (rex_prefix) | 1074 case OPERAND_TYPE_8_BIT: if (rex_prefix) |
1078 printf("%%spl"); | 1075 printf("%%spl"); |
1079 else | 1076 else |
1080 printf("%%ah"); | 1077 printf("%%ah"); |
1081 break; | 1078 break; |
1082 case OPERAND_SIZE_16_BIT: printf("%%sp"); break; | 1079 case OPERAND_TYPE_16_BIT: printf("%%sp"); break; |
1083 case OPERAND_SIZE_32_BIT: printf("%%esp"); break; | 1080 case OPERAND_TYPE_32_BIT: printf("%%esp"); break; |
1084 case OPERAND_SIZE_64_BIT: printf("%%rsp"); break; | 1081 case OPERAND_TYPE_64_BIT: printf("%%rsp"); break; |
1085 case OPERAND_ST: printf("%%st(4)"); break; | 1082 case OPERAND_TYPE_ST: printf("%%st(4)"); break; |
1086 case OPERAND_MMX: printf("%%mm4"); break; | 1083 case OPERAND_TYPE_MMX: printf("%%mm4"); break; |
1087 case OPERAND_FLOAT_SIZE_32_BIT: | 1084 case OPERAND_TYPE_FLOAT_32_BIT: |
1088 case OPERAND_FLOAT_SIZE_64_BIT: | 1085 case OPERAND_TYPE_FLOAT_64_BIT: |
1089 case OPERAND_SIZE_128_BIT: | 1086 case OPERAND_TYPE_128_BIT: |
1090 case OPERAND_XMM: printf("%%xmm4"); break; | 1087 case OPERAND_TYPE_XMM: printf("%%xmm4"); break; |
1091 case OPERAND_SIZE_256_BIT: | 1088 case OPERAND_TYPE_256_BIT: |
1092 case OPERAND_YMM: printf("%%ymm4"); break; | 1089 case OPERAND_TYPE_YMM: printf("%%ymm4"); break; |
1093 case OPERAND_SEGMENT_REGISTER: printf("%%fs"); break; | 1090 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%fs"); break; |
1094 case OPERAND_CONTROL_REGISTER: printf("%%cr4"); break; | 1091 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr4"); break; |
1095 case OPERAND_DEBUG_REGISTER: printf("%%db4"); break; | 1092 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db4"); break; |
1096 default: assert(FALSE); | 1093 default: assert(FALSE); |
1097 } | 1094 } |
1098 break; | 1095 break; |
1099 case REG_RBP: switch (operand_type) { | 1096 case REG_RBP: switch (operand_type) { |
1100 case OPERAND_SIZE_8_BIT: if (rex_prefix) | 1097 case OPERAND_TYPE_8_BIT: if (rex_prefix) |
1101 printf("%%bpl"); | 1098 printf("%%bpl"); |
1102 else | 1099 else |
1103 printf("%%ch"); | 1100 printf("%%ch"); |
1104 break; | 1101 break; |
1105 case OPERAND_SIZE_16_BIT: printf("%%bp"); break; | 1102 case OPERAND_TYPE_16_BIT: printf("%%bp"); break; |
1106 case OPERAND_SIZE_32_BIT: printf("%%ebp"); break; | 1103 case OPERAND_TYPE_32_BIT: printf("%%ebp"); break; |
1107 case OPERAND_SIZE_64_BIT: printf("%%rbp"); break; | 1104 case OPERAND_TYPE_64_BIT: printf("%%rbp"); break; |
1108 case OPERAND_ST: printf("%%st(5)"); break; | 1105 case OPERAND_TYPE_ST: printf("%%st(5)"); break; |
1109 case OPERAND_MMX: printf("%%mm5"); break; | 1106 case OPERAND_TYPE_MMX: printf("%%mm5"); break; |
1110 case OPERAND_FLOAT_SIZE_32_BIT: | 1107 case OPERAND_TYPE_FLOAT_32_BIT: |
1111 case OPERAND_FLOAT_SIZE_64_BIT: | 1108 case OPERAND_TYPE_FLOAT_64_BIT: |
1112 case OPERAND_SIZE_128_BIT: | 1109 case OPERAND_TYPE_128_BIT: |
1113 case OPERAND_XMM: printf("%%xmm5"); break; | 1110 case OPERAND_TYPE_XMM: printf("%%xmm5"); break; |
1114 case OPERAND_SIZE_256_BIT: | 1111 case OPERAND_TYPE_256_BIT: |
1115 case OPERAND_YMM: printf("%%ymm5"); break; | 1112 case OPERAND_TYPE_YMM: printf("%%ymm5"); break; |
1116 case OPERAND_SEGMENT_REGISTER: printf("%%gs"); break; | 1113 case OPERAND_TYPE_SEGMENT_REGISTER: printf("%%gs"); break; |
1117 case OPERAND_CONTROL_REGISTER: printf("%%cr5"); break; | 1114 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr5"); break; |
1118 case OPERAND_DEBUG_REGISTER: printf("%%db5"); break; | 1115 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db5"); break; |
1119 default: assert(FALSE); | 1116 default: assert(FALSE); |
1120 } | 1117 } |
1121 break; | 1118 break; |
1122 case REG_RSI: switch (operand_type) { | 1119 case REG_RSI: switch (operand_type) { |
1123 case OPERAND_SIZE_8_BIT: if (rex_prefix) | 1120 case OPERAND_TYPE_8_BIT: if (rex_prefix) |
1124 printf("%%sil"); | 1121 printf("%%sil"); |
1125 else | 1122 else |
1126 printf("%%dh"); | 1123 printf("%%dh"); |
1127 break; | 1124 break; |
1128 case OPERAND_SIZE_16_BIT: printf("%%si"); break; | 1125 case OPERAND_TYPE_16_BIT: printf("%%si"); break; |
1129 case OPERAND_SIZE_32_BIT: printf("%%esi"); break; | 1126 case OPERAND_TYPE_32_BIT: printf("%%esi"); break; |
1130 case OPERAND_SIZE_64_BIT: printf("%%rsi"); break; | 1127 case OPERAND_TYPE_64_BIT: printf("%%rsi"); break; |
1131 case OPERAND_ST: printf("%%st(6)"); break; | 1128 case OPERAND_TYPE_ST: printf("%%st(6)"); break; |
1132 case OPERAND_MMX: printf("%%mm6"); break; | 1129 case OPERAND_TYPE_MMX: printf("%%mm6"); break; |
1133 case OPERAND_FLOAT_SIZE_32_BIT: | 1130 case OPERAND_TYPE_FLOAT_32_BIT: |
1134 case OPERAND_FLOAT_SIZE_64_BIT: | 1131 case OPERAND_TYPE_FLOAT_64_BIT: |
1135 case OPERAND_SIZE_128_BIT: | 1132 case OPERAND_TYPE_128_BIT: |
1136 case OPERAND_XMM: printf("%%xmm6"); break; | 1133 case OPERAND_TYPE_XMM: printf("%%xmm6"); break; |
1137 case OPERAND_SIZE_256_BIT: | 1134 case OPERAND_TYPE_256_BIT: |
1138 case OPERAND_YMM: printf("%%ymm6"); break; | 1135 case OPERAND_TYPE_YMM: printf("%%ymm6"); break; |
1139 case OPERAND_CONTROL_REGISTER: printf("%%cr6"); break; | 1136 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr6"); break; |
1140 case OPERAND_DEBUG_REGISTER: printf("%%db6"); break; | 1137 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db6"); break; |
1141 default: assert(FALSE); | 1138 default: assert(FALSE); |
1142 } | 1139 } |
1143 break; | 1140 break; |
1144 case REG_RDI: switch (operand_type) { | 1141 case REG_RDI: switch (operand_type) { |
1145 case OPERAND_SIZE_8_BIT: if (rex_prefix) | 1142 case OPERAND_TYPE_8_BIT: if (rex_prefix) |
1146 printf("%%dil"); | 1143 printf("%%dil"); |
1147 else | 1144 else |
1148 printf("%%bh"); | 1145 printf("%%bh"); |
1149 break; | 1146 break; |
1150 case OPERAND_SIZE_16_BIT: printf("%%di"); break; | 1147 case OPERAND_TYPE_16_BIT: printf("%%di"); break; |
1151 case OPERAND_SIZE_32_BIT: printf("%%edi"); break; | 1148 case OPERAND_TYPE_32_BIT: printf("%%edi"); break; |
1152 case OPERAND_SIZE_64_BIT: printf("%%rdi"); break; | 1149 case OPERAND_TYPE_64_BIT: printf("%%rdi"); break; |
1153 case OPERAND_ST: printf("%%st(7)"); break; | 1150 case OPERAND_TYPE_ST: printf("%%st(7)"); break; |
1154 case OPERAND_MMX: printf("%%mm7"); break; | 1151 case OPERAND_TYPE_MMX: printf("%%mm7"); break; |
1155 case OPERAND_FLOAT_SIZE_32_BIT: | 1152 case OPERAND_TYPE_FLOAT_32_BIT: |
1156 case OPERAND_FLOAT_SIZE_64_BIT: | 1153 case OPERAND_TYPE_FLOAT_64_BIT: |
1157 case OPERAND_SIZE_128_BIT: | 1154 case OPERAND_TYPE_128_BIT: |
1158 case OPERAND_XMM: printf("%%xmm7"); break; | 1155 case OPERAND_TYPE_XMM: printf("%%xmm7"); break; |
1159 case OPERAND_SIZE_256_BIT: | 1156 case OPERAND_TYPE_256_BIT: |
1160 case OPERAND_YMM: printf("%%ymm7"); break; | 1157 case OPERAND_TYPE_YMM: printf("%%ymm7"); break; |
1161 case OPERAND_CONTROL_REGISTER: printf("%%cr7"); break; | 1158 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr7"); break; |
1162 case OPERAND_DEBUG_REGISTER: printf("%%db7"); break; | 1159 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db7"); break; |
1163 default: assert(FALSE); | 1160 default: assert(FALSE); |
1164 } | 1161 } |
1165 break; | 1162 break; |
1166 case REG_R8: switch (operand_type) { | 1163 case REG_R8: switch (operand_type) { |
1167 case OPERAND_SIZE_8_BIT: printf("%%r8b"); break; | 1164 case OPERAND_TYPE_8_BIT: printf("%%r8b"); break; |
1168 case OPERAND_SIZE_16_BIT: printf("%%r8w"); break; | 1165 case OPERAND_TYPE_16_BIT: printf("%%r8w"); break; |
1169 case OPERAND_SIZE_32_BIT: printf("%%r8d"); break; | 1166 case OPERAND_TYPE_32_BIT: printf("%%r8d"); break; |
1170 case OPERAND_SIZE_64_BIT: printf("%%r8"); break; | 1167 case OPERAND_TYPE_64_BIT: printf("%%r8"); break; |
1171 case OPERAND_MMX: printf("%%mm0"); break; | 1168 case OPERAND_TYPE_MMX: printf("%%mm0"); break; |
1172 case OPERAND_FLOAT_SIZE_32_BIT: | 1169 case OPERAND_TYPE_FLOAT_32_BIT: |
1173 case OPERAND_FLOAT_SIZE_64_BIT: | 1170 case OPERAND_TYPE_FLOAT_64_BIT: |
1174 case OPERAND_SIZE_128_BIT: | 1171 case OPERAND_TYPE_128_BIT: |
1175 case OPERAND_XMM: printf("%%xmm8"); break; | 1172 case OPERAND_TYPE_XMM: printf("%%xmm8"); break; |
1176 case OPERAND_SIZE_256_BIT: | 1173 case OPERAND_TYPE_256_BIT: |
1177 case OPERAND_YMM: printf("%%ymm8"); break; | 1174 case OPERAND_TYPE_YMM: printf("%%ymm8"); break; |
1178 case OPERAND_CONTROL_REGISTER: printf("%%cr8"); break; | 1175 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr8"); break; |
1179 case OPERAND_DEBUG_REGISTER: printf("%%db8"); break; | 1176 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db8"); break; |
1180 default: assert(FALSE); | 1177 default: assert(FALSE); |
1181 } | 1178 } |
1182 break; | 1179 break; |
1183 case REG_R9: switch (operand_type) { | 1180 case REG_R9: switch (operand_type) { |
1184 case OPERAND_SIZE_8_BIT: printf("%%r9b"); break; | 1181 case OPERAND_TYPE_8_BIT: printf("%%r9b"); break; |
1185 case OPERAND_SIZE_16_BIT: printf("%%r9w"); break; | 1182 case OPERAND_TYPE_16_BIT: printf("%%r9w"); break; |
1186 case OPERAND_SIZE_32_BIT: printf("%%r9d"); break; | 1183 case OPERAND_TYPE_32_BIT: printf("%%r9d"); break; |
1187 case OPERAND_SIZE_64_BIT: printf("%%r9"); break; | 1184 case OPERAND_TYPE_64_BIT: printf("%%r9"); break; |
1188 case OPERAND_MMX: printf("%%mm1"); break; | 1185 case OPERAND_TYPE_MMX: printf("%%mm1"); break; |
1189 case OPERAND_FLOAT_SIZE_32_BIT: | 1186 case OPERAND_TYPE_FLOAT_32_BIT: |
1190 case OPERAND_FLOAT_SIZE_64_BIT: | 1187 case OPERAND_TYPE_FLOAT_64_BIT: |
1191 case OPERAND_SIZE_128_BIT: | 1188 case OPERAND_TYPE_128_BIT: |
1192 case OPERAND_XMM: printf("%%xmm9"); break; | 1189 case OPERAND_TYPE_XMM: printf("%%xmm9"); break; |
1193 case OPERAND_SIZE_256_BIT: | 1190 case OPERAND_TYPE_256_BIT: |
1194 case OPERAND_YMM: printf("%%ymm9"); break; | 1191 case OPERAND_TYPE_YMM: printf("%%ymm9"); break; |
1195 case OPERAND_CONTROL_REGISTER: printf("%%cr9"); break; | 1192 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr9"); break; |
1196 case OPERAND_DEBUG_REGISTER: printf("%%db9"); break; | 1193 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db9"); break; |
1197 default: assert(FALSE); | 1194 default: assert(FALSE); |
1198 } | 1195 } |
1199 break; | 1196 break; |
1200 case REG_R10: switch (operand_type) { | 1197 case REG_R10: switch (operand_type) { |
1201 case OPERAND_SIZE_8_BIT: printf("%%r10b"); break; | 1198 case OPERAND_TYPE_8_BIT: printf("%%r10b"); break; |
1202 case OPERAND_SIZE_16_BIT: printf("%%r10w"); break; | 1199 case OPERAND_TYPE_16_BIT: printf("%%r10w"); break; |
1203 case OPERAND_SIZE_32_BIT: printf("%%r10d"); break; | 1200 case OPERAND_TYPE_32_BIT: printf("%%r10d"); break; |
1204 case OPERAND_SIZE_64_BIT: printf("%%r10"); break; | 1201 case OPERAND_TYPE_64_BIT: printf("%%r10"); break; |
1205 case OPERAND_MMX: printf("%%mm2"); break; | 1202 case OPERAND_TYPE_MMX: printf("%%mm2"); break; |
1206 case OPERAND_FLOAT_SIZE_32_BIT: | 1203 case OPERAND_TYPE_FLOAT_32_BIT: |
1207 case OPERAND_FLOAT_SIZE_64_BIT: | 1204 case OPERAND_TYPE_FLOAT_64_BIT: |
1208 case OPERAND_SIZE_128_BIT: | 1205 case OPERAND_TYPE_128_BIT: |
1209 case OPERAND_XMM: printf("%%xmm10"); break; | 1206 case OPERAND_TYPE_XMM: printf("%%xmm10"); break; |
1210 case OPERAND_SIZE_256_BIT: | 1207 case OPERAND_TYPE_256_BIT: |
1211 case OPERAND_YMM: printf("%%ymm10"); break; | 1208 case OPERAND_TYPE_YMM: printf("%%ymm10"); break; |
1212 case OPERAND_CONTROL_REGISTER: printf("%%cr10"); break; | 1209 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr10"); break; |
1213 case OPERAND_DEBUG_REGISTER: printf("%%db10"); break; | 1210 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db10"); break; |
1214 default: assert(FALSE); | 1211 default: assert(FALSE); |
1215 } | 1212 } |
1216 break; | 1213 break; |
1217 case REG_R11: switch (operand_type) { | 1214 case REG_R11: switch (operand_type) { |
1218 case OPERAND_SIZE_8_BIT: printf("%%r11b"); break; | 1215 case OPERAND_TYPE_8_BIT: printf("%%r11b"); break; |
1219 case OPERAND_SIZE_16_BIT: printf("%%r11w"); break; | 1216 case OPERAND_TYPE_16_BIT: printf("%%r11w"); break; |
1220 case OPERAND_SIZE_32_BIT: printf("%%r11d"); break; | 1217 case OPERAND_TYPE_32_BIT: printf("%%r11d"); break; |
1221 case OPERAND_SIZE_64_BIT: printf("%%r11"); break; | 1218 case OPERAND_TYPE_64_BIT: printf("%%r11"); break; |
1222 case OPERAND_MMX: printf("%%mm3"); break; | 1219 case OPERAND_TYPE_MMX: printf("%%mm3"); break; |
1223 case OPERAND_FLOAT_SIZE_32_BIT: | 1220 case OPERAND_TYPE_FLOAT_32_BIT: |
1224 case OPERAND_FLOAT_SIZE_64_BIT: | 1221 case OPERAND_TYPE_FLOAT_64_BIT: |
1225 case OPERAND_SIZE_128_BIT: | 1222 case OPERAND_TYPE_128_BIT: |
1226 case OPERAND_XMM: printf("%%xmm11"); break; | 1223 case OPERAND_TYPE_XMM: printf("%%xmm11"); break; |
1227 case OPERAND_SIZE_256_BIT: | 1224 case OPERAND_TYPE_256_BIT: |
1228 case OPERAND_YMM: printf("%%ymm11"); break; | 1225 case OPERAND_TYPE_YMM: printf("%%ymm11"); break; |
1229 case OPERAND_CONTROL_REGISTER: printf("%%cr11"); break; | 1226 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr11"); break; |
1230 case OPERAND_DEBUG_REGISTER: printf("%%db11"); break; | 1227 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db11"); break; |
1231 default: assert(FALSE); | 1228 default: assert(FALSE); |
1232 } | 1229 } |
1233 break; | 1230 break; |
1234 case REG_R12: switch (operand_type) { | 1231 case REG_R12: switch (operand_type) { |
1235 case OPERAND_SIZE_8_BIT: printf("%%r12b"); break; | 1232 case OPERAND_TYPE_8_BIT: printf("%%r12b"); break; |
1236 case OPERAND_SIZE_16_BIT: printf("%%r12w"); break; | 1233 case OPERAND_TYPE_16_BIT: printf("%%r12w"); break; |
1237 case OPERAND_SIZE_32_BIT: printf("%%r12d"); break; | 1234 case OPERAND_TYPE_32_BIT: printf("%%r12d"); break; |
1238 case OPERAND_SIZE_64_BIT: printf("%%r12"); break; | 1235 case OPERAND_TYPE_64_BIT: printf("%%r12"); break; |
1239 case OPERAND_MMX: printf("%%mm4"); break; | 1236 case OPERAND_TYPE_MMX: printf("%%mm4"); break; |
1240 case OPERAND_FLOAT_SIZE_32_BIT: | 1237 case OPERAND_TYPE_FLOAT_32_BIT: |
1241 case OPERAND_FLOAT_SIZE_64_BIT: | 1238 case OPERAND_TYPE_FLOAT_64_BIT: |
1242 case OPERAND_SIZE_128_BIT: | 1239 case OPERAND_TYPE_128_BIT: |
1243 case OPERAND_XMM: printf("%%xmm12"); break; | 1240 case OPERAND_TYPE_XMM: printf("%%xmm12"); break; |
1244 case OPERAND_SIZE_256_BIT: | 1241 case OPERAND_TYPE_256_BIT: |
1245 case OPERAND_YMM: printf("%%ymm12"); break; | 1242 case OPERAND_TYPE_YMM: printf("%%ymm12"); break; |
1246 case OPERAND_CONTROL_REGISTER: printf("%%cr12"); break; | 1243 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr12"); break; |
1247 case OPERAND_DEBUG_REGISTER: printf("%%db12"); break; | 1244 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db12"); break; |
1248 default: assert(FALSE); | 1245 default: assert(FALSE); |
1249 } | 1246 } |
1250 break; | 1247 break; |
1251 case REG_R13: switch (operand_type) { | 1248 case REG_R13: switch (operand_type) { |
1252 case OPERAND_SIZE_8_BIT: printf("%%r13b"); break; | 1249 case OPERAND_TYPE_8_BIT: printf("%%r13b"); break; |
1253 case OPERAND_SIZE_16_BIT: printf("%%r13w"); break; | 1250 case OPERAND_TYPE_16_BIT: printf("%%r13w"); break; |
1254 case OPERAND_SIZE_32_BIT: printf("%%r13d"); break; | 1251 case OPERAND_TYPE_32_BIT: printf("%%r13d"); break; |
1255 case OPERAND_SIZE_64_BIT: printf("%%r13"); break; | 1252 case OPERAND_TYPE_64_BIT: printf("%%r13"); break; |
1256 case OPERAND_MMX: printf("%%mm5"); break; | 1253 case OPERAND_TYPE_MMX: printf("%%mm5"); break; |
1257 case OPERAND_FLOAT_SIZE_32_BIT: | 1254 case OPERAND_TYPE_FLOAT_32_BIT: |
1258 case OPERAND_FLOAT_SIZE_64_BIT: | 1255 case OPERAND_TYPE_FLOAT_64_BIT: |
1259 case OPERAND_SIZE_128_BIT: | 1256 case OPERAND_TYPE_128_BIT: |
1260 case OPERAND_XMM: printf("%%xmm13"); break; | 1257 case OPERAND_TYPE_XMM: printf("%%xmm13"); break; |
1261 case OPERAND_SIZE_256_BIT: | 1258 case OPERAND_TYPE_256_BIT: |
1262 case OPERAND_YMM: printf("%%ymm13"); break; | 1259 case OPERAND_TYPE_YMM: printf("%%ymm13"); break; |
1263 case OPERAND_CONTROL_REGISTER: printf("%%cr13"); break; | 1260 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr13"); break; |
1264 case OPERAND_DEBUG_REGISTER: printf("%%db13"); break; | 1261 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db13"); break; |
1265 default: assert(FALSE); | 1262 default: assert(FALSE); |
1266 } | 1263 } |
1267 break; | 1264 break; |
1268 case REG_R14: switch (operand_type) { | 1265 case REG_R14: switch (operand_type) { |
1269 case OPERAND_SIZE_8_BIT: printf("%%r14b"); break; | 1266 case OPERAND_TYPE_8_BIT: printf("%%r14b"); break; |
1270 case OPERAND_SIZE_16_BIT: printf("%%r14w"); break; | 1267 case OPERAND_TYPE_16_BIT: printf("%%r14w"); break; |
1271 case OPERAND_SIZE_32_BIT: printf("%%r14d"); break; | 1268 case OPERAND_TYPE_32_BIT: printf("%%r14d"); break; |
1272 case OPERAND_SIZE_64_BIT: printf("%%r14"); break; | 1269 case OPERAND_TYPE_64_BIT: printf("%%r14"); break; |
1273 case OPERAND_MMX: printf("%%mm6"); break; | 1270 case OPERAND_TYPE_MMX: printf("%%mm6"); break; |
1274 case OPERAND_FLOAT_SIZE_32_BIT: | 1271 case OPERAND_TYPE_FLOAT_32_BIT: |
1275 case OPERAND_FLOAT_SIZE_64_BIT: | 1272 case OPERAND_TYPE_FLOAT_64_BIT: |
1276 case OPERAND_SIZE_128_BIT: | 1273 case OPERAND_TYPE_128_BIT: |
1277 case OPERAND_XMM: printf("%%xmm14"); break; | 1274 case OPERAND_TYPE_XMM: printf("%%xmm14"); break; |
1278 case OPERAND_SIZE_256_BIT: | 1275 case OPERAND_TYPE_256_BIT: |
1279 case OPERAND_YMM: printf("%%ymm14"); break; | 1276 case OPERAND_TYPE_YMM: printf("%%ymm14"); break; |
1280 case OPERAND_CONTROL_REGISTER: printf("%%cr14"); break; | 1277 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr14"); break; |
1281 case OPERAND_DEBUG_REGISTER: printf("%%db14"); break; | 1278 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db14"); break; |
1282 default: assert(FALSE); | 1279 default: assert(FALSE); |
1283 } | 1280 } |
1284 break; | 1281 break; |
1285 case REG_R15: switch (operand_type) { | 1282 case REG_R15: switch (operand_type) { |
1286 case OPERAND_SIZE_8_BIT: printf("%%r15b"); break; | 1283 case OPERAND_TYPE_8_BIT: printf("%%r15b"); break; |
1287 case OPERAND_SIZE_16_BIT: printf("%%r15w"); break; | 1284 case OPERAND_TYPE_16_BIT: printf("%%r15w"); break; |
1288 case OPERAND_SIZE_32_BIT: printf("%%r15d"); break; | 1285 case OPERAND_TYPE_32_BIT: printf("%%r15d"); break; |
1289 case OPERAND_SIZE_64_BIT: printf("%%r15"); break; | 1286 case OPERAND_TYPE_64_BIT: printf("%%r15"); break; |
1290 case OPERAND_MMX: printf("%%mm7"); break; | 1287 case OPERAND_TYPE_MMX: printf("%%mm7"); break; |
1291 case OPERAND_FLOAT_SIZE_32_BIT: | 1288 case OPERAND_TYPE_FLOAT_32_BIT: |
1292 case OPERAND_FLOAT_SIZE_64_BIT: | 1289 case OPERAND_TYPE_FLOAT_64_BIT: |
1293 case OPERAND_SIZE_128_BIT: | 1290 case OPERAND_TYPE_128_BIT: |
1294 case OPERAND_XMM: printf("%%xmm15"); break; | 1291 case OPERAND_TYPE_XMM: printf("%%xmm15"); break; |
1295 case OPERAND_SIZE_256_BIT: | 1292 case OPERAND_TYPE_256_BIT: |
1296 case OPERAND_YMM: printf("%%ymm15"); break; | 1293 case OPERAND_TYPE_YMM: printf("%%ymm15"); break; |
1297 case OPERAND_CONTROL_REGISTER: printf("%%cr15"); break; | 1294 case OPERAND_TYPE_CONTROL_REGISTER: printf("%%cr15"); break; |
1298 case OPERAND_DEBUG_REGISTER: printf("%%db15"); break; | 1295 case OPERAND_TYPE_DEBUG_REGISTER: printf("%%db15"); break; |
1299 default: assert(FALSE); | 1296 default: assert(FALSE); |
1300 } | 1297 } |
1301 break; | 1298 break; |
1302 case REG_ST: | 1299 case REG_ST: |
1303 assert(operand_type == OPERAND_ST); | 1300 assert(operand_type == OPERAND_TYPE_ST); |
1304 printf("%%st"); | 1301 printf("%%st"); |
1305 break; | 1302 break; |
1306 case REG_RM: { | 1303 case REG_RM: { |
1307 if (instruction->rm.disp_type != DISPNONE) { | 1304 if (instruction->rm.disp_type != DISPNONE) { |
1308 if ((instruction->rm.disp_type == DISP64) || | 1305 if ((instruction->rm.disp_type == DISP64) || |
1309 (instruction->rm.offset >= 0)) | 1306 (instruction->rm.offset >= 0)) |
1310 printf("0x%"NACL_PRIx64, instruction->rm.offset); | 1307 printf("0x%"NACL_PRIx64, instruction->rm.offset); |
1311 else | 1308 else |
1312 printf("-0x%"NACL_PRIx64, -instruction->rm.offset); | 1309 printf("-0x%"NACL_PRIx64, -instruction->rm.offset); |
1313 } | 1310 } |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1488 } else { | 1485 } else { |
1489 printf("%%es:(%%rdi)"); | 1486 printf("%%es:(%%rdi)"); |
1490 } | 1487 } |
1491 break; | 1488 break; |
1492 case REG_DS_RSI: if (((struct DecodeState *)userdata)->ia32_mode) { | 1489 case REG_DS_RSI: if (((struct DecodeState *)userdata)->ia32_mode) { |
1493 printf("%%ds:(%%esi)"); | 1490 printf("%%ds:(%%esi)"); |
1494 } else { | 1491 } else { |
1495 printf("%%ds:(%%rsi)"); | 1492 printf("%%ds:(%%rsi)"); |
1496 } | 1493 } |
1497 break; | 1494 break; |
1498 case JMP_TO: if (instruction->operands[0].type == OPERAND_SIZE_16_BIT) | 1495 case JMP_TO: if (instruction->operands[0].type == OPERAND_TYPE_16_BIT) |
1499 printf("0x%lx", (long)((end + instruction->rm.offset - | 1496 printf("0x%lx", (long)((end + instruction->rm.offset - |
1500 (((struct DecodeState *)userdata)->offset)) & 0xffff)); | 1497 (((struct DecodeState *)userdata)->offset)) & 0xffff)); |
1501 else | 1498 else |
1502 printf("0x%lx", (long)(end + instruction->rm.offset - | 1499 printf("0x%lx", (long)(end + instruction->rm.offset - |
1503 (((struct DecodeState *)userdata)->offset))); | 1500 (((struct DecodeState *)userdata)->offset))); |
1504 break; | 1501 break; |
1505 case REG_RIP: | 1502 case REG_RIP: |
1506 case REG_RIZ: | 1503 case REG_RIZ: |
1507 case NO_REG: | 1504 case NO_REG: |
1508 assert(FALSE); | 1505 assert(FALSE); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1657 for (index = initial_index; index < argc; ++index) { | 1654 for (index = initial_index; index < argc; ++index) { |
1658 const char *filename = argv[index]; | 1655 const char *filename = argv[index]; |
1659 int rc = DecodeFile(filename, repeat_count); | 1656 int rc = DecodeFile(filename, repeat_count); |
1660 if (!rc) { | 1657 if (!rc) { |
1661 printf("file '%s' can not be fully decoded\n", filename); | 1658 printf("file '%s' can not be fully decoded\n", filename); |
1662 return 1; | 1659 return 1; |
1663 } | 1660 } |
1664 } | 1661 } |
1665 return 0; | 1662 return 0; |
1666 } | 1663 } |
OLD | NEW |