8305783: x86_64: Optimize AbsI and AbsL

Reviewed-by: jkarthikeyan, thartmann
This commit is contained in:
Quan Anh Mai
2023-04-12 13:48:52 +00:00
parent d8af7a6014
commit 99a9dbc8f1

View File

@@ -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);