< 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


14015 
14016 instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegIorL2I src, immI0 zero, rFlagsReg cr)
14017 %{
14018   match(Set dst (CmpLTMask src zero));
14019   effect(KILL cr);
14020 
14021   ins_cost(INSN_COST);
14022 
14023   format %{ "asrw $dst, $src, #31\t# cmpLTMask0" %}
14024 
14025   ins_encode %{
14026     __ asrw(as_Register($dst$$reg), as_Register($src$$reg), 31);
14027   %}
14028 
14029   ins_pipe(ialu_reg_shift);
14030 %}
14031 
14032 // ============================================================================
14033 // Max and Min
14034 
14035 instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
14036 %{
14037   match(Set dst (MinI src1 src2));
14038 
14039   effect(DEF dst, USE src1, USE src2, KILL cr);
14040   size(8);
14041 
14042   ins_cost(INSN_COST * 3);
14043   format %{
14044     "cmpw $src1 $src2\t signed int\n\t"
14045     "cselw $dst, $src1, $src2 lt\t"
14046   %}
14047 
14048   ins_encode %{
14049     __ cmpw(as_Register($src1$$reg),
14050             as_Register($src2$$reg));
14051     __ cselw(as_Register($dst$$reg),
14052              as_Register($src1$$reg),
14053              as_Register($src2$$reg),
14054              Assembler::LT);
14055   %}
14056 
14057   ins_pipe(ialu_reg_reg);
14058 %}
14059 // FROM HERE
14060 
14061 instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)











































































14062 %{
14063   match(Set dst (MaxI src1 src2));
14064 
14065   effect(DEF dst, USE src1, USE src2, KILL cr);
14066   size(8);
14067 
14068   ins_cost(INSN_COST * 3);
14069   format %{
14070     "cmpw $src1 $src2\t signed int\n\t"
14071     "cselw $dst, $src1, $src2 gt\t"
14072   %}
14073 
14074   ins_encode %{
14075     __ cmpw(as_Register($src1$$reg),
14076             as_Register($src2$$reg));
14077     __ cselw(as_Register($dst$$reg),
14078              as_Register($src1$$reg),
14079              as_Register($src2$$reg),
14080              Assembler::GT);











































































14081   %}
14082 
14083   ins_pipe(ialu_reg_reg);
14084 %}
14085 
14086 // ============================================================================
14087 // Branch Instructions
14088 
14089 // Direct Branch.
14090 instruct branch(label lbl)
14091 %{
14092   match(Goto);
14093 
14094   effect(USE lbl);
14095 
14096   ins_cost(BRANCH_COST);
14097   format %{ "b  $lbl" %}
14098 
14099   ins_encode(aarch64_enc_b(lbl));
14100 




14015 
14016 instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegIorL2I src, immI0 zero, rFlagsReg cr)
14017 %{
14018   match(Set dst (CmpLTMask src zero));
14019   effect(KILL cr);
14020 
14021   ins_cost(INSN_COST);
14022 
14023   format %{ "asrw $dst, $src, #31\t# cmpLTMask0" %}
14024 
14025   ins_encode %{
14026     __ asrw(as_Register($dst$$reg), as_Register($src$$reg), 31);
14027   %}
14028 
14029   ins_pipe(ialu_reg_shift);
14030 %}
14031 
14032 // ============================================================================
14033 // Max and Min
14034 
14035 instruct minI_reg_reg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
14036 %{
14037   match(Set dst (MinI src1 src2));
14038 
14039   effect(DEF dst, USE src1, USE src2, KILL cr);
14040   size(8);
14041 
14042   ins_cost(INSN_COST * 3);
14043   format %{
14044     "cmpw $src1, $src2\t signed int\n\t"
14045     "cselw $dst, $src1, $src2 lt\t"
14046   %}
14047 
14048   ins_encode %{
14049     __ cmpw(as_Register($src1$$reg),
14050             as_Register($src2$$reg));
14051     __ cselw(as_Register($dst$$reg),
14052              as_Register($src1$$reg),
14053              as_Register($src2$$reg),
14054              Assembler::LT);
14055   %}
14056 
14057   ins_pipe(ialu_reg_reg);
14058 %}

14059 
14060 instruct minI_reg_imm0(iRegINoSp dst, iRegI src1, immI0 src2, rFlagsReg cr)
14061 %{
14062   match(Set dst (MinI src1 src2));
14063 
14064   effect(DEF dst, USE src1, USE src2, KILL cr);
14065   size(8);
14066 
14067   ins_cost(INSN_COST * 3);
14068   format %{
14069     "cmpw $src1, zr\t signed int\n\t"
14070     "cselw $dst, $src1, zr, lt\t"
14071   %}
14072 
14073   ins_encode %{
14074     __ cmpw(as_Register($src1$$reg),
14075             zr);
14076     __ cselw(as_Register($dst$$reg),
14077              as_Register($src1$$reg),
14078              zr,
14079              Assembler::LT);
14080   %}
14081 
14082   ins_pipe(ialu_reg_reg);
14083 %}
14084 
14085 instruct minI_reg_imm1(iRegINoSp dst, iRegI src1, immI_1 src2, rFlagsReg cr)
14086 %{
14087   match(Set dst (MinI src1 src2));
14088 
14089   effect(DEF dst, USE src1, USE src2, KILL cr);
14090   size(8);
14091 
14092   ins_cost(INSN_COST * 3);
14093   format %{
14094     "cmpw $src1, zr\t signed int\n\t"
14095     "csincw $dst, $src1, zr, le\t"
14096   %}
14097 
14098   ins_encode %{
14099     __ cmpw(as_Register($src1$$reg),
14100             zr);
14101     __ csincw(as_Register($dst$$reg),
14102               as_Register($src1$$reg),
14103               zr,
14104               Assembler::LE);
14105   %}
14106 
14107   ins_pipe(ialu_reg_reg);
14108 %}
14109 
14110 instruct minI_reg_immM1(iRegINoSp dst, iRegI src1, immI_M1 src2, rFlagsReg cr)
14111 %{
14112   match(Set dst (MinI src1 src2));
14113 
14114   effect(DEF dst, USE src1, USE src2, KILL cr);
14115   size(8);
14116 
14117   ins_cost(INSN_COST * 3);
14118   format %{
14119     "cmpw $src1, zr\t signed int\n\t"
14120     "csinvw $dst, $src1, zr, lt\t"
14121   %}
14122 
14123   ins_encode %{
14124     __ cmpw(as_Register($src1$$reg),
14125             zr);
14126     __ csinvw(as_Register($dst$$reg),
14127               as_Register($src1$$reg),
14128               zr,
14129               Assembler::LT);
14130   %}
14131 
14132   ins_pipe(ialu_reg_reg);
14133 %}
14134 
14135 instruct maxI_reg_reg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
14136 %{
14137   match(Set dst (MaxI src1 src2));
14138 
14139   effect(DEF dst, USE src1, USE src2, KILL cr);
14140   size(8);
14141 
14142   ins_cost(INSN_COST * 3);
14143   format %{
14144     "cmpw $src1, $src2\t signed int\n\t"
14145     "cselw $dst, $src1, $src2 gt\t"
14146   %}
14147 
14148   ins_encode %{
14149     __ cmpw(as_Register($src1$$reg),
14150             as_Register($src2$$reg));
14151     __ cselw(as_Register($dst$$reg),
14152              as_Register($src1$$reg),
14153              as_Register($src2$$reg),
14154              Assembler::GT);
14155   %}
14156 
14157   ins_pipe(ialu_reg_reg);
14158 %}
14159 
14160 instruct maxI_reg_imm0(iRegINoSp dst, iRegI src1, immI0 src2, rFlagsReg cr)
14161 %{
14162   match(Set dst (MaxI src1 src2));
14163 
14164   effect(DEF dst, USE src1, USE src2, KILL cr);
14165   size(8);
14166 
14167   ins_cost(INSN_COST * 3);
14168   format %{
14169     "cmpw $src1, zr\t signed int\n\t"
14170     "cselw $dst, $src1, zr, gt\t"
14171   %}
14172 
14173   ins_encode %{
14174     __ cmpw(as_Register($src1$$reg),
14175             zr);
14176     __ cselw(as_Register($dst$$reg),
14177              as_Register($src1$$reg),
14178              zr,
14179              Assembler::GT);
14180   %}
14181 
14182   ins_pipe(ialu_reg_reg);
14183 %}
14184 
14185 instruct maxI_reg_imm1(iRegINoSp dst, iRegI src1, immI_1 src2, rFlagsReg cr)
14186 %{
14187   match(Set dst (MaxI src1 src2));
14188 
14189   effect(DEF dst, USE src1, USE src2, KILL cr);
14190   size(8);
14191 
14192   ins_cost(INSN_COST * 3);
14193   format %{
14194     "cmpw $src1, zr\t signed int\n\t"
14195     "csincw $dst, $src1, zr, gt\t"
14196   %}
14197 
14198   ins_encode %{
14199     __ cmpw(as_Register($src1$$reg),
14200             zr);
14201     __ csincw(as_Register($dst$$reg),
14202               as_Register($src1$$reg),
14203               zr,
14204               Assembler::GT);
14205   %}
14206 
14207   ins_pipe(ialu_reg_reg);
14208 %}
14209 
14210 instruct maxI_reg_immM1(iRegINoSp dst, iRegI src1, immI_M1 src2, rFlagsReg cr)
14211 %{
14212   match(Set dst (MaxI src1 src2));
14213 
14214   effect(DEF dst, USE src1, USE src2, KILL cr);
14215   size(8);
14216 
14217   ins_cost(INSN_COST * 3);
14218   format %{
14219     "cmpw $src1, zr\t signed int\n\t"
14220     "csinvw $dst, $src1, zr, ge\t"
14221   %}
14222 
14223   ins_encode %{
14224     __ cmpw(as_Register($src1$$reg),
14225             zr);
14226     __ csinvw(as_Register($dst$$reg),
14227               as_Register($src1$$reg),
14228               zr,
14229               Assembler::GE);
14230   %}
14231 
14232   ins_pipe(ialu_reg_reg);
14233 %}
14234 
14235 // ============================================================================
14236 // Branch Instructions
14237 
14238 // Direct Branch.
14239 instruct branch(label lbl)
14240 %{
14241   match(Goto);
14242 
14243   effect(USE lbl);
14244 
14245   ins_cost(BRANCH_COST);
14246   format %{ "b  $lbl" %}
14247 
14248   ins_encode(aarch64_enc_b(lbl));
14249 


< prev index next >