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 {