Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: src/trusted/validator_ragel/unreviewed/decoder_test.c

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

Powered by Google App Engine
This is Rietveld 408576698