< prev index next >
src/hotspot/cpu/x86/x86_64.ad
Print this page
*** 528,543 ****
--- 528,550 ----
source_hpp %{
#if INCLUDE_ZGC
#include "gc/z/zBarrierSetAssembler.hpp"
#endif
+
+ extern unsigned long followed_by_equals;
+ extern unsigned long not_followed_by_equals;
+
%}
//----------SOURCE BLOCK-------------------------------------------------------
// This is a block of C++ code which provides values, functions, and
// definitions necessary in the rest of the architecture description
source %{
+ unsigned long followed_by_equals = 0;
+ unsigned long not_followed_by_equals = 0;
+
#define RELOC_IMM64 Assembler::imm_operand
#define RELOC_DISP32 Assembler::disp32_operand
#define __ _masm.
*** 11586,11613 ****
%}
instruct compP_rReg(rFlagsRegU cr, rRegP op1, rRegP op2)
%{
match(Set cr (CmpP op1 op2));
format %{ "cmpq $op1, $op2\t# ptr" %}
! opcode(0x3B); /* Opcode 3B /r */
! ins_encode(REX_reg_reg_wide(op1, op2), OpcP, reg_reg(op1, op2));
ins_pipe(ialu_cr_reg_reg);
%}
instruct compP_rReg_mem(rFlagsRegU cr, rRegP op1, memory op2)
%{
match(Set cr (CmpP op1 (LoadP op2)));
ins_cost(500); // XXX
format %{ "cmpq $op1, $op2\t# ptr" %}
! opcode(0x3B); /* Opcode 3B /r */
! ins_encode(REX_reg_mem_wide(op1, op2), OpcP, reg_mem(op1, op2));
ins_pipe(ialu_cr_reg_mem);
%}
// // // Cisc-spilled version of cmpP_rReg
// //instruct compP_mem_rReg(rFlagsRegU cr, memory op1, rRegP op2)
// //%{
// // match(Set cr (CmpP (LoadP op1) op2));
// //
--- 11593,11687 ----
%}
instruct compP_rReg(rFlagsRegU cr, rRegP op1, rRegP op2)
%{
match(Set cr (CmpP op1 op2));
+ predicate(!((CmpPNode*)n)->followed_by_equals() && !((CmpPNode*)n)->not_followed_by_equals());
format %{ "cmpq $op1, $op2\t# ptr" %}
! ins_encode %{
! __ cmpq($op1$$Register, $op2$$Register);
! %}
ins_pipe(ialu_cr_reg_reg);
%}
instruct compP_rReg_mem(rFlagsRegU cr, rRegP op1, memory op2)
%{
match(Set cr (CmpP op1 (LoadP op2)));
+ predicate(!((CmpPNode*)n)->followed_by_equals() && !((CmpPNode*)n)->not_followed_by_equals());
ins_cost(500); // XXX
format %{ "cmpq $op1, $op2\t# ptr" %}
! ins_encode %{
! __ cmpq($op1$$Register, $op2$$Address);
! %}
ins_pipe(ialu_cr_reg_mem);
%}
+ instruct compP_rReg_followed_by_equals(rFlagsRegU cr, rRegP op1, rRegP op2, rRegP tmp)
+ %{
+ match(Set cr (CmpP op1 op2));
+ predicate(((CmpPNode*)n)->followed_by_equals());
+ effect(TEMP tmp);
+
+ format %{ "cmpq $op1, $op2\t# ptr" %}
+ ins_encode %{
+ __ lea($tmp$$Register, ExternalAddress((address)&followed_by_equals));
+ __ lock(); __ addq(Address($tmp$$Register, 0), 1);
+ __ cmpq($op1$$Register, $op2$$Register);
+ %}
+ ins_pipe(ialu_cr_reg_reg);
+ %}
+
+ instruct compP_rReg_mem_followed_by_equals(rFlagsRegU cr, rRegP op1, memory op2, rRegP tmp)
+ %{
+ match(Set cr (CmpP op1 (LoadP op2)));
+ predicate(((CmpPNode*)n)->followed_by_equals());
+ effect(TEMP tmp);
+
+ ins_cost(500); // XXX
+ format %{ "cmpq $op1, $op2\t# ptr" %}
+ ins_encode %{
+ __ lea($tmp$$Register, ExternalAddress((address)&followed_by_equals));
+ __ lock(); __ addq(Address($tmp$$Register, 0), 1);
+ __ cmpq($op1$$Register, $op2$$Address);
+ %}
+ ins_pipe(ialu_cr_reg_mem);
+ %}
+
+ instruct compP_rReg_not_followed_by_equals(rFlagsRegU cr, rRegP op1, rRegP op2, rRegP tmp)
+ %{
+ match(Set cr (CmpP op1 op2));
+ predicate(((CmpPNode*)n)->not_followed_by_equals());
+ effect(TEMP tmp);
+
+ format %{ "cmpq $op1, $op2\t# ptr" %}
+ ins_encode %{
+ __ lea($tmp$$Register, ExternalAddress((address)¬_followed_by_equals));
+ __ lock(); __ addq(Address($tmp$$Register, 0), 1);
+ __ cmpq($op1$$Register, $op2$$Register);
+ %}
+ ins_pipe(ialu_cr_reg_reg);
+ %}
+
+ instruct compP_rReg_mem_not_followed_by_equals(rFlagsRegU cr, rRegP op1, memory op2, rRegP tmp)
+ %{
+ match(Set cr (CmpP op1 (LoadP op2)));
+ predicate(((CmpPNode*)n)->not_followed_by_equals());
+ effect(TEMP tmp);
+
+ ins_cost(500); // XXX
+ format %{ "cmpq $op1, $op2\t# ptr" %}
+ ins_encode %{
+ __ lea($tmp$$Register, ExternalAddress((address)¬_followed_by_equals));
+ __ lock(); __ addq(Address($tmp$$Register, 0), 1);
+ __ cmpq($op1$$Register, $op2$$Address);
+ %}
+ ins_pipe(ialu_cr_reg_mem);
+ %}
+
+
// // // Cisc-spilled version of cmpP_rReg
// //instruct compP_mem_rReg(rFlagsRegU cr, memory op1, rRegP op2)
// //%{
// // match(Set cr (CmpP (LoadP op1) op2));
// //
< prev index next >