Mercurial > hg > truffle
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); |