comparison 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
comparison
equal deleted inserted replaced
16063:1d2c8c963d98 16064:03eda0a202e9
1822 emit_operand(dst, src); 1822 emit_operand(dst, src);
1823 } 1823 }
1824 1824
1825 void Assembler::movsbl(Register dst, Register src) { // movsxb 1825 void Assembler::movsbl(Register dst, Register src) { // movsxb
1826 NOT_LP64(assert(src->has_byte_register(), "must have byte register")); 1826 NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
1827 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true); 1827 int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true);
1828 emit_int8(0x0F); 1828 emit_int8(0x0F);
1829 emit_int8((unsigned char)0xBE); 1829 emit_int8((unsigned char)0xBE);
1830 emit_int8((unsigned char)(0xC0 | encode)); 1830 emit_int8((unsigned char)(0xC0 | encode));
1831 } 1831 }
1832 1832
1914 emit_int8((unsigned char)0xB6); 1914 emit_int8((unsigned char)0xB6);
1915 emit_operand(dst, src); 1915 emit_operand(dst, src);
1916 } 1916 }
1917 1917
1918 void Assembler::movzbl(Register dst, Register src) { // movzxb 1918 void Assembler::movzbl(Register dst, Register src) { // movzxb
1919 NOT_LP64(assert(src->has_byte_register(), "must have byte register")); 1919 #ifdef _LP64
1920 int encode = prefix_and_encode(dst->encoding(), src->encoding(), true); 1920 // Requires the REX.W prefix to be able to access source register rsi and rdi
1921 int encode = prefixq_and_encode(dst->encoding(), src->encoding());
1922 #else
1923 assert(src->has_byte_register(), "must have byte register");
1924 int encode = prefix_and_encode(dst->encoding(), src->encoding());
1925 #endif
1921 emit_int8(0x0F); 1926 emit_int8(0x0F);
1922 emit_int8((unsigned char)0xB6); 1927 emit_int8((unsigned char)0xB6);
1923 emit_int8(0xC0 | encode); 1928 emit_int8(0xC0 | encode);
1924 } 1929 }
1925 1930
4560 reg_enc -= 8; 4565 reg_enc -= 8;
4561 } 4566 }
4562 return reg_enc; 4567 return reg_enc;
4563 } 4568 }
4564 4569
4565 int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) { 4570 int Assembler::prefix_and_encode(int dst_enc, bool dst_is_byte, int src_enc, bool src_is_byte) {
4566 if (dst_enc < 8) { 4571 if (dst_enc < 8) {
4567 if (src_enc >= 8) { 4572 if (src_enc >= 8) {
4568 prefix(REX_B); 4573 prefix(REX_B);
4569 src_enc -= 8; 4574 src_enc -= 8;
4570 } else if (byteinst && (src_enc >= 4 || dst_enc >= 4)) { 4575 } else if ((src_is_byte && src_enc >= 4) || (dst_is_byte && dst_enc >= 4)) {
4571 prefix(REX); 4576 prefix(REX);
4572 } 4577 }
4573 } else { 4578 } else {
4574 if (src_enc < 8) { 4579 if (src_enc < 8) {
4575 prefix(REX_R); 4580 prefix(REX_R);