Mercurial > hg > truffle
diff src/cpu/x86/vm/assembler_x86.cpp @ 16064:03eda0a202e9
Better fix for prefix byte for AMD64 byte instructions
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Fri, 06 Jun 2014 11:06:42 -0700 |
parents | 692c25719837 |
children | 77cb0f0e5e3f |
line wrap: on
line diff
--- a/src/cpu/x86/vm/assembler_x86.cpp Fri Jun 06 18:18:04 2014 +0200 +++ b/src/cpu/x86/vm/assembler_x86.cpp Fri Jun 06 11:06:42 2014 -0700 @@ -1824,7 +1824,7 @@ void Assembler::movsbl(Register dst, Register src) { // movsxb NOT_LP64(assert(src->has_byte_register(), "must have byte register")); - int encode = prefix_and_encode(dst->encoding(), src->encoding(), true); + int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true); emit_int8(0x0F); emit_int8((unsigned char)0xBE); emit_int8((unsigned char)(0xC0 | encode)); @@ -1916,8 +1916,13 @@ } void Assembler::movzbl(Register dst, Register src) { // movzxb - NOT_LP64(assert(src->has_byte_register(), "must have byte register")); - int encode = prefix_and_encode(dst->encoding(), src->encoding(), true); +#ifdef _LP64 + // Requires the REX.W prefix to be able to access source register rsi and rdi + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); +#else + assert(src->has_byte_register(), "must have byte register"); + int encode = prefix_and_encode(dst->encoding(), src->encoding()); +#endif emit_int8(0x0F); emit_int8((unsigned char)0xB6); emit_int8(0xC0 | encode); @@ -4562,12 +4567,12 @@ return reg_enc; } -int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) { +int Assembler::prefix_and_encode(int dst_enc, bool dst_is_byte, int src_enc, bool src_is_byte) { if (dst_enc < 8) { if (src_enc >= 8) { prefix(REX_B); src_enc -= 8; - } else if (byteinst && (src_enc >= 4 || dst_enc >= 4)) { + } else if ((src_is_byte && src_enc >= 4) || (dst_is_byte && dst_enc >= 4)) { prefix(REX); } } else {