8164103: C2: Broken cmpxchgb encoding on x86

Reviewed-by: kvn, shade, psandoz
This commit is contained in:
Vladimir Ivanov 2016-08-17 22:09:57 +03:00
parent 2eab293b99
commit e3d5b655af

@ -986,7 +986,7 @@ void MachEpilogNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
emit_opcode(cbuf, 0x58 | RBP_enc); emit_opcode(cbuf, 0x58 | RBP_enc);
if (StackReservedPages > 0 && C->has_reserved_stack_access()) { if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
__ reserved_stack_check(); __ reserved_stack_check();
} }
if (do_polling() && C->is_method_compilation()) { if (do_polling() && C->is_method_compilation()) {
@ -7355,7 +7355,7 @@ instruct compareAndSwapB(rRegI res,
"movzbl $res, $res" %} "movzbl $res, $res" %}
opcode(0x0F, 0xB0); opcode(0x0F, 0xB0);
ins_encode(lock_prefix, ins_encode(lock_prefix,
REX_reg_mem(newval, mem_ptr), REX_breg_mem(newval, mem_ptr),
OpcP, OpcS, OpcP, OpcS,
reg_mem(newval, mem_ptr), reg_mem(newval, mem_ptr),
REX_breg(res), Opcode(0x0F), Opcode(0x94), reg(res), // sete REX_breg(res), Opcode(0x0F), Opcode(0x94), reg(res), // sete
@ -7380,7 +7380,7 @@ instruct compareAndSwapS(rRegI res,
opcode(0x0F, 0xB1); opcode(0x0F, 0xB1);
ins_encode(lock_prefix, ins_encode(lock_prefix,
SizePrefix, SizePrefix,
REX_reg_mem(newval, mem_ptr), REX_reg_mem(newval, mem_ptr),
OpcP, OpcS, OpcP, OpcS,
reg_mem(newval, mem_ptr), reg_mem(newval, mem_ptr),
REX_breg(res), Opcode(0x0F), Opcode(0x94), reg(res), // sete REX_breg(res), Opcode(0x0F), Opcode(0x94), reg(res), // sete
@ -7424,7 +7424,7 @@ instruct compareAndExchangeB(
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %}
opcode(0x0F, 0xB0); opcode(0x0F, 0xB0);
ins_encode(lock_prefix, ins_encode(lock_prefix,
REX_reg_mem(newval, mem_ptr), REX_breg_mem(newval, mem_ptr),
OpcP, OpcS, OpcP, OpcS,
reg_mem(newval, mem_ptr) // lock cmpxchg reg_mem(newval, mem_ptr) // lock cmpxchg
); );