< prev index next >
src/cpu/aarch64/vm/aarch64.ad
Print this page
rev 10586 : 8153837: aarch64: handle special cases for MaxINode & MinINode
Summary: aarch64: handle special cases for MaxINode & MinINode
Reviewed-by: duke
*** 14030,14049 ****
%}
// ============================================================================
// Max and Min
! instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
%{
match(Set dst (MinI src1 src2));
effect(DEF dst, USE src1, USE src2, KILL cr);
size(8);
ins_cost(INSN_COST * 3);
format %{
! "cmpw $src1 $src2\t signed int\n\t"
"cselw $dst, $src1, $src2 lt\t"
%}
ins_encode %{
__ cmpw(as_Register($src1$$reg),
--- 14030,14049 ----
%}
// ============================================================================
// Max and Min
! instruct minI_reg_reg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
%{
match(Set dst (MinI src1 src2));
effect(DEF dst, USE src1, USE src2, KILL cr);
size(8);
ins_cost(INSN_COST * 3);
format %{
! "cmpw $src1, $src2\t signed int\n\t"
"cselw $dst, $src1, $src2 lt\t"
%}
ins_encode %{
__ cmpw(as_Register($src1$$reg),
*** 14054,14075 ****
Assembler::LT);
%}
ins_pipe(ialu_reg_reg);
%}
- // FROM HERE
! instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
%{
match(Set dst (MaxI src1 src2));
effect(DEF dst, USE src1, USE src2, KILL cr);
size(8);
ins_cost(INSN_COST * 3);
format %{
! "cmpw $src1 $src2\t signed int\n\t"
"cselw $dst, $src1, $src2 gt\t"
%}
ins_encode %{
__ cmpw(as_Register($src1$$reg),
--- 14054,14149 ----
Assembler::LT);
%}
ins_pipe(ialu_reg_reg);
%}
! instruct minI_reg_imm0(iRegINoSp dst, iRegI src1, immI0 src2, rFlagsReg cr)
! %{
! match(Set dst (MinI src1 src2));
!
! effect(DEF dst, USE src1, USE src2, KILL cr);
! size(8);
!
! ins_cost(INSN_COST * 3);
! format %{
! "cmpw $src1, zr\t signed int\n\t"
! "cselw $dst, $src1, zr, lt\t"
! %}
!
! ins_encode %{
! __ cmpw(as_Register($src1$$reg),
! zr);
! __ cselw(as_Register($dst$$reg),
! as_Register($src1$$reg),
! zr,
! Assembler::LT);
! %}
!
! ins_pipe(ialu_reg_reg);
! %}
!
! instruct minI_reg_imm1(iRegINoSp dst, iRegI src1, immI_1 src2, rFlagsReg cr)
! %{
! match(Set dst (MinI src1 src2));
!
! effect(DEF dst, USE src1, USE src2, KILL cr);
! size(8);
!
! ins_cost(INSN_COST * 3);
! format %{
! "cmpw $src1, zr\t signed int\n\t"
! "csincw $dst, $src1, zr, le\t"
! %}
!
! ins_encode %{
! __ cmpw(as_Register($src1$$reg),
! zr);
! __ csincw(as_Register($dst$$reg),
! as_Register($src1$$reg),
! zr,
! Assembler::LE);
! %}
!
! ins_pipe(ialu_reg_reg);
! %}
!
! instruct minI_reg_immM1(iRegINoSp dst, iRegI src1, immI_M1 src2, rFlagsReg cr)
! %{
! match(Set dst (MinI src1 src2));
!
! effect(DEF dst, USE src1, USE src2, KILL cr);
! size(8);
!
! ins_cost(INSN_COST * 3);
! format %{
! "cmpw $src1, zr\t signed int\n\t"
! "csinvw $dst, $src1, zr, lt\t"
! %}
!
! ins_encode %{
! __ cmpw(as_Register($src1$$reg),
! zr);
! __ csinvw(as_Register($dst$$reg),
! as_Register($src1$$reg),
! zr,
! Assembler::LT);
! %}
!
! ins_pipe(ialu_reg_reg);
! %}
!
! instruct maxI_reg_reg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
%{
match(Set dst (MaxI src1 src2));
effect(DEF dst, USE src1, USE src2, KILL cr);
size(8);
ins_cost(INSN_COST * 3);
format %{
! "cmpw $src1, $src2\t signed int\n\t"
"cselw $dst, $src1, $src2 gt\t"
%}
ins_encode %{
__ cmpw(as_Register($src1$$reg),
*** 14081,14090 ****
--- 14155,14239 ----
%}
ins_pipe(ialu_reg_reg);
%}
+ instruct maxI_reg_imm0(iRegINoSp dst, iRegI src1, immI0 src2, rFlagsReg cr)
+ %{
+ match(Set dst (MaxI src1 src2));
+
+ effect(DEF dst, USE src1, USE src2, KILL cr);
+ size(8);
+
+ ins_cost(INSN_COST * 3);
+ format %{
+ "cmpw $src1, zr\t signed int\n\t"
+ "cselw $dst, $src1, zr, gt\t"
+ %}
+
+ ins_encode %{
+ __ cmpw(as_Register($src1$$reg),
+ zr);
+ __ cselw(as_Register($dst$$reg),
+ as_Register($src1$$reg),
+ zr,
+ Assembler::GT);
+ %}
+
+ ins_pipe(ialu_reg_reg);
+ %}
+
+ instruct maxI_reg_imm1(iRegINoSp dst, iRegI src1, immI_1 src2, rFlagsReg cr)
+ %{
+ match(Set dst (MaxI src1 src2));
+
+ effect(DEF dst, USE src1, USE src2, KILL cr);
+ size(8);
+
+ ins_cost(INSN_COST * 3);
+ format %{
+ "cmpw $src1, zr\t signed int\n\t"
+ "csincw $dst, $src1, zr, gt\t"
+ %}
+
+ ins_encode %{
+ __ cmpw(as_Register($src1$$reg),
+ zr);
+ __ csincw(as_Register($dst$$reg),
+ as_Register($src1$$reg),
+ zr,
+ Assembler::GT);
+ %}
+
+ ins_pipe(ialu_reg_reg);
+ %}
+
+ instruct maxI_reg_immM1(iRegINoSp dst, iRegI src1, immI_M1 src2, rFlagsReg cr)
+ %{
+ match(Set dst (MaxI src1 src2));
+
+ effect(DEF dst, USE src1, USE src2, KILL cr);
+ size(8);
+
+ ins_cost(INSN_COST * 3);
+ format %{
+ "cmpw $src1, zr\t signed int\n\t"
+ "csinvw $dst, $src1, zr, ge\t"
+ %}
+
+ ins_encode %{
+ __ cmpw(as_Register($src1$$reg),
+ zr);
+ __ csinvw(as_Register($dst$$reg),
+ as_Register($src1$$reg),
+ zr,
+ Assembler::GE);
+ %}
+
+ ins_pipe(ialu_reg_reg);
+ %}
+
// ============================================================================
// Branch Instructions
// Direct Branch.
instruct branch(label lbl)
< prev index next >