diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index aed84b0e5b7..7c1eb99bf58 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -8462,44 +8462,34 @@ instruct xchgN( memory mem, rRegN newval) %{ //----------Abs Instructions------------------------------------------- // Integer Absolute Instructions -instruct absI_rReg(rRegI dst, rRegI src, rRegI tmp, rFlagsReg cr) +instruct absI_rReg(rRegI dst, rRegI src, rFlagsReg cr) %{ match(Set dst (AbsI src)); - effect(TEMP dst, TEMP tmp, KILL cr); - format %{ "movl $tmp, $src\n\t" - "sarl $tmp, 31\n\t" - "movl $dst, $src\n\t" - "xorl $dst, $tmp\n\t" - "subl $dst, $tmp\n" - %} + effect(TEMP dst, KILL cr); + format %{ "xorl $dst, $dst\t# abs int\n\t" + "subl $dst, $src\n\t" + "cmovll $dst, $src" %} ins_encode %{ - __ movl($tmp$$Register, $src$$Register); - __ sarl($tmp$$Register, 31); - __ movl($dst$$Register, $src$$Register); - __ xorl($dst$$Register, $tmp$$Register); - __ subl($dst$$Register, $tmp$$Register); + __ xorl($dst$$Register, $dst$$Register); + __ subl($dst$$Register, $src$$Register); + __ cmovl(Assembler::less, $dst$$Register, $src$$Register); %} ins_pipe(ialu_reg_reg); %} // Long Absolute Instructions -instruct absL_rReg(rRegL dst, rRegL src, rRegL tmp, rFlagsReg cr) +instruct absL_rReg(rRegL dst, rRegL src, rFlagsReg cr) %{ match(Set dst (AbsL src)); - effect(TEMP dst, TEMP tmp, KILL cr); - format %{ "movq $tmp, $src\n\t" - "sarq $tmp, 63\n\t" - "movq $dst, $src\n\t" - "xorq $dst, $tmp\n\t" - "subq $dst, $tmp\n" - %} + effect(TEMP dst, KILL cr); + format %{ "xorl $dst, $dst\t# abs long\n\t" + "subq $dst, $src\n\t" + "cmovlq $dst, $src" %} ins_encode %{ - __ movq($tmp$$Register, $src$$Register); - __ sarq($tmp$$Register, 63); - __ movq($dst$$Register, $src$$Register); - __ xorq($dst$$Register, $tmp$$Register); - __ subq($dst$$Register, $tmp$$Register); + __ xorl($dst$$Register, $dst$$Register); + __ subq($dst$$Register, $src$$Register); + __ cmovq(Assembler::less, $dst$$Register, $src$$Register); %} ins_pipe(ialu_reg_reg);