You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/10/15 19:25:50 UTC
svn commit: r584828 -
/harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp
Author: gshimansky
Date: Mon Oct 15 10:25:49 2007
New Revision: 584828
URL: http://svn.apache.org/viewvc?rev=584828&view=rev
Log:
Make disassembler match instructions with various REX prefixes
Modified:
harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp?rev=584828&r1=584827&r2=584828&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/encoder/ia32_em64t/dec_base.cpp Mon Oct 15 10:25:49 2007
@@ -233,14 +233,28 @@
bool DecoderBase::try_mn(Mnemonic mn, const unsigned char ** pbuf, Inst * pinst) {
const unsigned char * save_pbuf = *pbuf;
EncoderBase::OpcodeDesc * opcodes = EncoderBase::opcodes[mn];
+
for (unsigned i=0; !opcodes[i].last; i++) {
const EncoderBase::OpcodeDesc& odesc = opcodes[i];
+ char *opcode_ptr = const_cast<char *>(odesc.opcode);
+ int opcode_len = odesc.opcode_len;
+
*pbuf = save_pbuf;
- if (odesc.opcode_len != 0) {
- if (memcmp(*pbuf, odesc.opcode, odesc.opcode_len)) {
+ if (opcode_len != 0) {
+#ifdef _EM64T_
+ // Match REX prefixes
+ if (((*pbuf)[0] & 0xf0) == 0x40 && opcode_ptr[0] == 0x48)
+ {
+ (*pbuf)++;
+ opcode_ptr++;
+ opcode_len--;
+ }
+#endif
+
+ if (memcmp(*pbuf, opcode_ptr, opcode_len)) {
continue;
}
- *pbuf += odesc.opcode_len;
+ *pbuf += opcode_len;
}
if (odesc.aux0 != 0) {
@@ -257,7 +271,7 @@
}
else {
// Can't have empty opcode
- assert(odesc.opcode_len != 0);
+ assert(opcode_len != 0);
pinst->odesc = &opcodes[i];
return true;
}