decoder.cc (10924:d02e9c239892) | decoder.cc (11321:02e930db812d) |
---|---|
1/* 2 * Copyright (c) 2011 Google 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 372 unchanged lines hidden (view full) --- 381 logOpSize = defOp; 382 383 //Set the actual op size 384 emi.opSize = 1 << logOpSize; 385 386 //Figure out the effective address size. This can be overriden to 387 //a fixed value at the decoder level. 388 int logAddrSize; | 1/* 2 * Copyright (c) 2011 Google 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 372 unchanged lines hidden (view full) --- 381 logOpSize = defOp; 382 383 //Set the actual op size 384 emi.opSize = 1 << logOpSize; 385 386 //Figure out the effective address size. This can be overriden to 387 //a fixed value at the decoder level. 388 int logAddrSize; |
389 if(emi.legacy.addr) | 389 if (emi.legacy.addr) |
390 logAddrSize = altAddr; 391 else 392 logAddrSize = defAddr; 393 394 //Set the actual address size 395 emi.addrSize = 1 << logAddrSize; 396 397 //Figure out the effective stack width. This can be overriden to --- 7 unchanged lines hidden (view full) --- 405 immediateSize = SizeTypeToSize[logAddrSize - 1][immType]; 406 else 407 immediateSize = SizeTypeToSize[logOpSize - 1][immType]; 408 409 //Determine what to expect next 410 if (modrmTable[opcode]) { 411 nextState = ModRMState; 412 } else { | 390 logAddrSize = altAddr; 391 else 392 logAddrSize = defAddr; 393 394 //Set the actual address size 395 emi.addrSize = 1 << logAddrSize; 396 397 //Figure out the effective stack width. This can be overriden to --- 7 unchanged lines hidden (view full) --- 405 immediateSize = SizeTypeToSize[logAddrSize - 1][immType]; 406 else 407 immediateSize = SizeTypeToSize[logOpSize - 1][immType]; 408 409 //Determine what to expect next 410 if (modrmTable[opcode]) { 411 nextState = ModRMState; 412 } else { |
413 if(immediateSize) { | 413 if (immediateSize) { |
414 nextState = ImmediateState; 415 } else { 416 instDone = true; 417 nextState = ResetState; 418 } 419 } 420 return nextState; 421} --- 12 unchanged lines hidden (view full) --- 434 logOpSize = defOp; 435 436 //Set the actual op size 437 emi.opSize = 1 << logOpSize; 438 439 //Figure out the effective address size. This can be overriden to 440 //a fixed value at the decoder level. 441 int logAddrSize; | 414 nextState = ImmediateState; 415 } else { 416 instDone = true; 417 nextState = ResetState; 418 } 419 } 420 return nextState; 421} --- 12 unchanged lines hidden (view full) --- 434 logOpSize = defOp; 435 436 //Set the actual op size 437 emi.opSize = 1 << logOpSize; 438 439 //Figure out the effective address size. This can be overriden to 440 //a fixed value at the decoder level. 441 int logAddrSize; |
442 if(emi.legacy.addr) | 442 if (emi.legacy.addr) |
443 logAddrSize = altAddr; 444 else 445 logAddrSize = defAddr; 446 447 //Set the actual address size 448 emi.addrSize = 1 << logAddrSize; 449 450 //Figure out the effective stack width. This can be overriden to --- 53 unchanged lines hidden (view full) --- 504 immediateSize = (emi.opSize == 8) ? 4 : emi.opSize; 505 } 506 507 //If there's an SIB, get that next. 508 //There is no SIB in 16 bit mode. 509 if (modRM.rm == 4 && modRM.mod != 3) { 510 // && in 32/64 bit mode) 511 nextState = SIBState; | 443 logAddrSize = altAddr; 444 else 445 logAddrSize = defAddr; 446 447 //Set the actual address size 448 emi.addrSize = 1 << logAddrSize; 449 450 //Figure out the effective stack width. This can be overriden to --- 53 unchanged lines hidden (view full) --- 504 immediateSize = (emi.opSize == 8) ? 4 : emi.opSize; 505 } 506 507 //If there's an SIB, get that next. 508 //There is no SIB in 16 bit mode. 509 if (modRM.rm == 4 && modRM.mod != 3) { 510 // && in 32/64 bit mode) 511 nextState = SIBState; |
512 } else if(displacementSize) { | 512 } else if (displacementSize) { |
513 nextState = DisplacementState; | 513 nextState = DisplacementState; |
514 } else if(immediateSize) { | 514 } else if (immediateSize) { |
515 nextState = ImmediateState; 516 } else { 517 instDone = true; 518 nextState = ResetState; 519 } 520 //The ModRM byte is consumed no matter what 521 consumeByte(); 522 emi.modRM = modRM; --- 9 unchanged lines hidden (view full) --- 532 State nextState = ErrorState; 533 emi.sib = nextByte; 534 DPRINTF(Decoder, "Found SIB byte %#x.\n", nextByte); 535 consumeByte(); 536 if (emi.modRM.mod == 0 && emi.sib.base == 5) 537 displacementSize = 4; 538 if (displacementSize) { 539 nextState = DisplacementState; | 515 nextState = ImmediateState; 516 } else { 517 instDone = true; 518 nextState = ResetState; 519 } 520 //The ModRM byte is consumed no matter what 521 consumeByte(); 522 emi.modRM = modRM; --- 9 unchanged lines hidden (view full) --- 532 State nextState = ErrorState; 533 emi.sib = nextByte; 534 DPRINTF(Decoder, "Found SIB byte %#x.\n", nextByte); 535 consumeByte(); 536 if (emi.modRM.mod == 0 && emi.sib.base == 5) 537 displacementSize = 4; 538 if (displacementSize) { 539 nextState = DisplacementState; |
540 } else if(immediateSize) { | 540 } else if (immediateSize) { |
541 nextState = ImmediateState; 542 } else { 543 instDone = true; 544 nextState = ResetState; 545 } 546 return nextState; 547} 548 --- 6 unchanged lines hidden (view full) --- 555 556 getImmediate(immediateCollected, 557 emi.displacement, 558 displacementSize); 559 560 DPRINTF(Decoder, "Collecting %d byte displacement, got %d bytes.\n", 561 displacementSize, immediateCollected); 562 | 541 nextState = ImmediateState; 542 } else { 543 instDone = true; 544 nextState = ResetState; 545 } 546 return nextState; 547} 548 --- 6 unchanged lines hidden (view full) --- 555 556 getImmediate(immediateCollected, 557 emi.displacement, 558 displacementSize); 559 560 DPRINTF(Decoder, "Collecting %d byte displacement, got %d bytes.\n", 561 displacementSize, immediateCollected); 562 |
563 if(displacementSize == immediateCollected) { | 563 if (displacementSize == immediateCollected) { |
564 //Reset this for other immediates. 565 immediateCollected = 0; 566 //Sign extend the displacement 567 switch(displacementSize) 568 { 569 case 1: 570 emi.displacement = sext<8>(emi.displacement); 571 break; 572 case 2: 573 emi.displacement = sext<16>(emi.displacement); 574 break; 575 case 4: 576 emi.displacement = sext<32>(emi.displacement); 577 break; 578 default: 579 panic("Undefined displacement size!\n"); 580 } 581 DPRINTF(Decoder, "Collected displacement %#x.\n", 582 emi.displacement); | 564 //Reset this for other immediates. 565 immediateCollected = 0; 566 //Sign extend the displacement 567 switch(displacementSize) 568 { 569 case 1: 570 emi.displacement = sext<8>(emi.displacement); 571 break; 572 case 2: 573 emi.displacement = sext<16>(emi.displacement); 574 break; 575 case 4: 576 emi.displacement = sext<32>(emi.displacement); 577 break; 578 default: 579 panic("Undefined displacement size!\n"); 580 } 581 DPRINTF(Decoder, "Collected displacement %#x.\n", 582 emi.displacement); |
583 if(immediateSize) { | 583 if (immediateSize) { |
584 nextState = ImmediateState; 585 } else { 586 instDone = true; 587 nextState = ResetState; 588 } 589 590 emi.dispSize = displacementSize; 591 } --- 11 unchanged lines hidden (view full) --- 603 604 getImmediate(immediateCollected, 605 emi.immediate, 606 immediateSize); 607 608 DPRINTF(Decoder, "Collecting %d byte immediate, got %d bytes.\n", 609 immediateSize, immediateCollected); 610 | 584 nextState = ImmediateState; 585 } else { 586 instDone = true; 587 nextState = ResetState; 588 } 589 590 emi.dispSize = displacementSize; 591 } --- 11 unchanged lines hidden (view full) --- 603 604 getImmediate(immediateCollected, 605 emi.immediate, 606 immediateSize); 607 608 DPRINTF(Decoder, "Collecting %d byte immediate, got %d bytes.\n", 609 immediateSize, immediateCollected); 610 |
611 if(immediateSize == immediateCollected) | 611 if (immediateSize == immediateCollected) |
612 { 613 //Reset this for other immediates. 614 immediateCollected = 0; 615 616 //XXX Warning! The following is an observed pattern and might 617 //not always be true! 618 619 //Instructions which use 64 bit operands but 32 bit immediates --- 83 unchanged lines hidden --- | 612 { 613 //Reset this for other immediates. 614 immediateCollected = 0; 615 616 //XXX Warning! The following is an observed pattern and might 617 //not always be true! 618 619 //Instructions which use 64 bit operands but 32 bit immediates --- 83 unchanged lines hidden --- |