--- a/hotspot/src/cpu/x86/vm/x86_64.ad Wed Oct 16 10:52:41 2013 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Tue Nov 05 17:38:04 2013 -0800
@@ -529,7 +529,7 @@
if (rspec.reloc()->type() == relocInfo::oop_type &&
d32 != 0 && d32 != (intptr_t) Universe::non_oop_word()) {
assert(Universe::heap()->is_in_reserved((address)(intptr_t)d32), "should be real oop");
- assert(oop((intptr_t)d32)->is_oop() && (ScavengeRootsInCode || !oop((intptr_t)d32)->is_scavengable()), "cannot embed scavengable oops in code");
+ assert(cast_to_oop((intptr_t)d32)->is_oop() && (ScavengeRootsInCode || !cast_to_oop((intptr_t)d32)->is_scavengable()), "cannot embed scavengable oops in code");
}
#endif
cbuf.relocate(cbuf.insts_mark(), rspec, format);
@@ -556,7 +556,7 @@
if (rspec.reloc()->type() == relocInfo::oop_type &&
d64 != 0 && d64 != (int64_t) Universe::non_oop_word()) {
assert(Universe::heap()->is_in_reserved((address)d64), "should be real oop");
- assert(oop(d64)->is_oop() && (ScavengeRootsInCode || !oop(d64)->is_scavengable()),
+ assert(cast_to_oop(d64)->is_oop() && (ScavengeRootsInCode || !cast_to_oop(d64)->is_scavengable()),
"cannot embed scavengable oops in code");
}
#endif
@@ -1391,7 +1391,7 @@
#ifndef PRODUCT
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
st->print_cr("\tcmpq rax, rscratch1\t # Inline cache check");
@@ -1408,7 +1408,7 @@
{
MacroAssembler masm(&cbuf);
uint insts_size = cbuf.insts_size();
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
masm.load_klass(rscratch1, j_rarg0);
masm.cmpptr(rax, rscratch1);
} else {
@@ -1557,7 +1557,7 @@
}
bool Matcher::narrow_klass_use_complex_address() {
- assert(UseCompressedKlassPointers, "only for compressed klass code");
+ assert(UseCompressedClassPointers, "only for compressed klass code");
return (LogKlassAlignmentInBytes <= 3);
}
@@ -1649,6 +1649,18 @@
return PTR_RBP_REG_mask();
}
+const RegMask Matcher::mathExactI_result_proj_mask() {
+ return INT_RAX_REG_mask();
+}
+
+const RegMask Matcher::mathExactL_result_proj_mask() {
+ return LONG_RAX_REG_mask();
+}
+
+const RegMask Matcher::mathExactI_flags_proj_mask() {
+ return INT_FLAGS_mask();
+}
+
%}
//----------ENCODING BLOCK-----------------------------------------------------
@@ -4133,6 +4145,8 @@
greater_equal(0xD, "ge");
less_equal(0xE, "le");
greater(0xF, "g");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4151,6 +4165,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4170,6 +4186,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4187,6 +4205,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -6922,6 +6942,82 @@
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
+instruct addExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "addl $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "addl $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
+%{
+ match(AddExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(125); // XXX
+ format %{ "addl $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$Address);
+ %}
+
+ ins_pipe(ialu_reg_mem);
+%}
+
+instruct addExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
+%{
+ match(AddExactL dst src);
+ effect(DEF cr);
+
+ format %{ "addq $dst, $src\t# addExact long" %}
+ ins_encode %{
+ __ addq($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr)
+%{
+ match(AddExactL dst src);
+ effect(DEF cr);
+
+ format %{ "addq $dst, $src\t# addExact long" %}
+ ins_encode %{
+ __ addq($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr)
+%{
+ match(AddExactL dst (LoadL src));
+ effect(DEF cr);
+
+ ins_cost(125); // XXX
+ format %{ "addq $dst, $src\t# addExact long" %}
+ ins_encode %{
+ __ addq($dst$$Register, $src$$Address);
+ %}
+
+ ins_pipe(ialu_reg_mem);
+%}
+
instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr)
%{
match(Set dst (AddI dst src));
@@ -7534,6 +7630,80 @@
ins_pipe(ialu_mem_imm);
%}
+instruct subExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
+%{
+ match(SubExactI dst src);
+ effect(DEF cr);
+
+ format %{ "subl $dst, $src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct subExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr)
+%{
+ match(SubExactI dst src);
+ effect(DEF cr);
+
+ format %{ "subl $dst, $src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct subExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
+%{
+ match(SubExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(125);
+ format %{ "subl $dst, $src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$Address);
+ %}
+ ins_pipe(ialu_reg_mem);
+%}
+
+instruct subExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
+%{
+ match(SubExactL dst src);
+ effect(DEF cr);
+
+ format %{ "subq $dst, $src\t# subExact long" %}
+ ins_encode %{
+ __ subq($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct subExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr)
+%{
+ match(SubExactL dst (LoadL src));
+ effect(DEF cr);
+
+ format %{ "subq $dst, $src\t# subExact long" %}
+ ins_encode %{
+ __ subq($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct subExactL_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
+%{
+ match(SubExactI dst src);
+ effect(DEF cr);
+
+ ins_cost(125);
+ format %{ "subq $dst, $src\t# subExact long" %}
+ ins_encode %{
+ __ subq($dst$$Register, $src$$Address);
+ %}
+ ins_pipe(ialu_reg_mem);
+%}
+
instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr)
%{
match(Set dst (SubL dst src));
@@ -7650,6 +7820,30 @@
ins_pipe(ialu_reg);
%}
+instruct negExactI_rReg(rax_RegI dst, rFlagsReg cr)
+%{
+ match(NegExactI dst);
+ effect(KILL cr);
+
+ format %{ "negl $dst\t# negExact int" %}
+ ins_encode %{
+ __ negl($dst$$Register);
+ %}
+ ins_pipe(ialu_reg);
+%}
+
+instruct negExactL_rReg(rax_RegL dst, rFlagsReg cr)
+%{
+ match(NegExactL dst);
+ effect(KILL cr);
+
+ format %{ "negq $dst\t# negExact long" %}
+ ins_encode %{
+ __ negq($dst$$Register);
+ %}
+ ins_pipe(ialu_reg);
+%}
+
//----------Multiplication/Division Instructions-------------------------------
// Integer Multiplication Instructions
@@ -7767,6 +7961,86 @@
ins_pipe(ialu_reg_reg_alu0);
%}
+
+instruct mulExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
+%{
+ match(MulExactI dst src);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "imull $dst, $src\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+%}
+
+
+instruct mulExactI_rReg_imm(rax_RegI dst, rRegI src, immI imm, rFlagsReg cr)
+%{
+ match(MulExactI src imm);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "imull $dst, $src, $imm\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Register, $imm$$constant);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+%}
+
+instruct mulExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr)
+%{
+ match(MulExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(350);
+ format %{ "imull $dst, $src\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Address);
+ %}
+ ins_pipe(ialu_reg_mem_alu0);
+%}
+
+instruct mulExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
+%{
+ match(MulExactL dst src);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "imulq $dst, $src\t# mulExact long" %}
+ ins_encode %{
+ __ imulq($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+%}
+
+instruct mulExactL_rReg_imm(rax_RegL dst, rRegL src, immL32 imm, rFlagsReg cr)
+%{
+ match(MulExactL src imm);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "imulq $dst, $src, $imm\t# mulExact long" %}
+ ins_encode %{
+ __ imulq($dst$$Register, $src$$Register, $imm$$constant);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+%}
+
+instruct mulExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr)
+%{
+ match(MulExactL dst (LoadL src));
+ effect(DEF cr);
+
+ ins_cost(350);
+ format %{ "imulq $dst, $src\t# mulExact long" %}
+ ins_encode %{
+ __ imulq($dst$$Register, $src$$Address);
+ %}
+ ins_pipe(ialu_reg_mem_alu0);
+%}
+
instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div,
rFlagsReg cr)
%{