src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/x86/vm/x86_64.ad Fri Oct 18 10:43:02 2013
--- new/src/cpu/x86/vm/x86_64.ad Fri Oct 18 10:43:02 2013
*** 1651,1660 ****
--- 1651,1664 ----
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();
}
%}
*** 6960,6969 ****
--- 6964,7025 ----
__ 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));
effect(KILL cr);
*** 7572,7581 ****
--- 7628,7711 ----
opcode(0x81); /* Opcode 81 /5 id */
ins_encode(REX_mem(dst), OpcSE(src), RM_opc_mem(0x05, dst), Con8or32(src));
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));
effect(KILL cr);
*** 7688,7697 ****
--- 7818,7851 ----
opcode(0xF7, 0x03); // Opcode F7 /3
ins_encode(REX_mem_wide(dst), OpcP, RM_opc_mem(secondary, dst));
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
// Multiply Register
*** 7805,7814 ****
--- 7959,8020 ----
opcode(0xF7, 0x5); /* Opcode F7 /5 */
ins_encode(REX_reg_wide(src), OpcP, reg_opc(src));
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 mulExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr)
+ %{
+ match(MulExactL dst src);
+ effect(KILL 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(KILL 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 divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div,
rFlagsReg cr)
%{
match(Set rax (DivI rax div));
effect(KILL rdx, KILL cr);
src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File