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
|