src/cpu/x86/vm/x86_32.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/cpu/x86/vm/x86_32.ad
src/cpu/x86/vm/x86_32.ad
Print this page
rev 5513 : 8026844: Various Math functions needs intrinsification
Reviewed-by: duke
*** 1536,1545 ****
--- 1536,1550 ----
const RegMask Matcher::mathExactI_result_proj_mask() {
return EAX_REG_mask();
}
+ const RegMask Matcher::mathExactL_result_proj_mask() {
+ ShouldNotReachHere();
+ return RegMask();
+ }
+
const RegMask Matcher::mathExactI_flags_proj_mask() {
return INT_FLAGS_mask();
}
// Returns true if the high 32 bits of the value is known to be zero.
*** 7517,7527 ****
%}
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
! instruct addExactI_rReg(eAXRegI dst, rRegI src, eFlagsReg cr)
%{
match(AddExactI dst src);
effect(DEF cr);
format %{ "ADD $dst, $src\t# addExact int" %}
--- 7522,7532 ----
%}
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
! instruct addExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
%{
match(AddExactI dst src);
effect(DEF cr);
format %{ "ADD $dst, $src\t# addExact int" %}
*** 7529,7539 ****
__ addl($dst$$Register, $src$$Register);
%}
ins_pipe(ialu_reg_reg);
%}
! instruct addExactI_rReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
%{
match(AddExactI dst src);
effect(DEF cr);
format %{ "ADD $dst, $src\t# addExact int" %}
--- 7534,7544 ----
__ addl($dst$$Register, $src$$Register);
%}
ins_pipe(ialu_reg_reg);
%}
! instruct addExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
%{
match(AddExactI dst src);
effect(DEF cr);
format %{ "ADD $dst, $src\t# addExact int" %}
*** 7541,7550 ****
--- 7546,7569 ----
__ addl($dst$$Register, $src$$constant);
%}
ins_pipe(ialu_reg_reg);
%}
+ instruct addExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
+ %{
+ match(AddExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(125);
+ format %{ "ADD $dst,$src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$Address);
+ %}
+ ins_pipe( ialu_reg_mem );
+ %}
+
+
// Integer Addition Instructions
instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (AddI dst src));
effect(KILL cr);
*** 7849,7858 ****
--- 7868,7915 ----
%}
ins_pipe( pipe_cmpxchg );
%}
//----------Subtraction Instructions-------------------------------------------
+
+ instruct subExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
+ %{
+ match(SubExactI dst src);
+ effect(DEF cr);
+
+ format %{ "SUB $dst, $src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+ %}
+
+ instruct subExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
+ %{
+ match(SubExactI dst src);
+ effect(DEF cr);
+
+ format %{ "SUB $dst, $src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+ %}
+
+ instruct subExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
+ %{
+ match(SubExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(125);
+ format %{ "SUB $dst,$src\t# subExact int" %}
+ ins_encode %{
+ __ subl($dst$$Register, $src$$Address);
+ %}
+ ins_pipe( ialu_reg_mem );
+ %}
+
// Integer Subtraction Instructions
instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (SubI dst src));
effect(KILL cr);
*** 7917,7926 ****
--- 7974,7993 ----
opcode(0xF7,0x03); // Opcode F7 /3
ins_encode( OpcP, RegOpc( dst ) );
ins_pipe( ialu_reg );
%}
+ instruct negExactI_eReg(eAXRegI dst, eFlagsReg cr) %{
+ match(NegExactI dst);
+ effect(DEF cr);
+
+ format %{ "NEG $dst\t# negExact int"%}
+ ins_encode %{
+ __ negl($dst$$Register);
+ %}
+ ins_pipe(ialu_reg);
+ %}
//----------Multiplication/Division Instructions-------------------------------
// Integer Multiplication Instructions
// Multiply Register
instruct mulI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
*** 8129,8138 ****
--- 8196,8245 ----
"ADD EDX,$tmp" %}
ins_encode( long_multiply_con( dst, src, tmp ) );
ins_pipe( pipe_slow );
%}
+ instruct mulExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
+ %{
+ match(MulExactI dst src);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "IMUL $dst, $src\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+ %}
+
+ instruct mulExactI_eReg_imm(eAXRegI dst, rRegI src, immI imm, eFlagsReg cr)
+ %{
+ match(MulExactI src imm);
+ effect(DEF cr);
+
+ ins_cost(300);
+ format %{ "IMUL $dst, $src, $imm\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Register, $imm$$constant);
+ %}
+ ins_pipe(ialu_reg_reg_alu0);
+ %}
+
+ instruct mulExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
+ %{
+ match(MulExactI dst (LoadI src));
+ effect(DEF cr);
+
+ ins_cost(350);
+ format %{ "IMUL $dst, $src\t# mulExact int" %}
+ ins_encode %{
+ __ imull($dst$$Register, $src$$Address);
+ %}
+ ins_pipe(ialu_reg_mem_alu0);
+ %}
+
+
// Integer DIV with Register
instruct divI_eReg(eAXRegI rax, eDXRegI rdx, eCXRegI div, eFlagsReg cr) %{
match(Set rax (DivI rax div));
effect(KILL rdx, KILL cr);
size(26);
src/cpu/x86/vm/x86_32.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File