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