@@ -1093,10 +1093,6 @@ const bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect*
10931093 return false;
10941094}
10951095
1096- const bool Matcher::vector_needs_load_shuffle(BasicType elem_bt, int vlen) {
1097- return false;
1098- }
1099-
11001096const RegMask* Matcher::predicate_reg_mask(void) {
11011097 return nullptr;
11021098}
@@ -4181,7 +4177,8 @@ opclass memory( indirect, indOffset12, indOffset12I2L, indIndex, indIndexI2L,
41814177opclass memory_loadRange(indOffset12, indirect);
41824178
41834179opclass mRegLorI2L(mRegI2L, mRegL);
4184- opclass mRegIorL2I( mRegI, mRegL2I);
4180+ opclass mRegIorL2I(mRegI, mRegL2I);
4181+ opclass mRegLorP(mRegL, mRegP);
41854182
41864183//----------PIPELINE-----------------------------------------------------------
41874184// Rules which define the behavior of the target architectures pipeline.
@@ -8112,6 +8109,26 @@ instruct cmovD_cmpD_reg_reg(regD dst, regD src, regD tmp1, regD tmp2, cmpOp cop
81128109 ins_pipe( pipe_slow );
81138110%}
81148111
8112+ instruct cmovD_cmpF_reg_reg(regD dst, regD src, regF tmp1, regF tmp2, cmpOp cop ) %{
8113+ match(Set dst (CMoveD (Binary cop (CmpF tmp1 tmp2)) (Binary dst src)));
8114+ ins_cost(200);
8115+ format %{
8116+ "CMP$cop $tmp1, $tmp2\t @cmovD_cmpF_reg_reg\n"
8117+ "\tCMOV $dst,$src \t @cmovD_cmpF_reg_reg"
8118+ %}
8119+ ins_encode %{
8120+ FloatRegister reg_op1 = as_FloatRegister($tmp1$$reg);
8121+ FloatRegister reg_op2 = as_FloatRegister($tmp2$$reg);
8122+ FloatRegister dst = as_FloatRegister($dst$$reg);
8123+ FloatRegister src = as_FloatRegister($src$$reg);
8124+ int flag = $cop$$cmpcode;
8125+
8126+ __ cmp_cmov(reg_op1, reg_op2, dst, src, (MacroAssembler::CMCompare) flag, true /* is_float */);
8127+ %}
8128+
8129+ ins_pipe( pipe_slow );
8130+ %}
8131+
81158132instruct cmovF_cmpI_reg_reg(regF dst, regF src, mRegI tmp1, mRegI tmp2, cmpOp cop) %{
81168133 match(Set dst (CMoveF (Binary cop (CmpI tmp1 tmp2)) (Binary dst src)));
81178134 ins_cost(200);
@@ -8133,6 +8150,27 @@ instruct cmovF_cmpI_reg_reg(regF dst, regF src, mRegI tmp1, mRegI tmp2, cmpOp co
81338150 ins_pipe( pipe_slow );
81348151%}
81358152
8153+ instruct cmovF_cmpL_reg_reg(regF dst, regF src, mRegL tmp1, mRegL tmp2, cmpOp cop) %{
8154+ match(Set dst (CMoveF (Binary cop (CmpL tmp1 tmp2)) (Binary dst src)));
8155+ ins_cost(200);
8156+ format %{
8157+ "CMP$cop $tmp1, $tmp2\t @cmovF_cmpL_reg_reg\n"
8158+ "\tCMOV $dst, $src \t @cmovF_cmpL_reg_reg"
8159+ %}
8160+
8161+ ins_encode %{
8162+ Register op1 = $tmp1$$Register;
8163+ Register op2 = $tmp2$$Register;
8164+ FloatRegister dst = as_FloatRegister($dst$$reg);
8165+ FloatRegister src = as_FloatRegister($src$$reg);
8166+ int flag = $cop$$cmpcode;
8167+
8168+ __ cmp_cmov(op1, op2, dst, src, (MacroAssembler::CMCompare) flag);
8169+ %}
8170+
8171+ ins_pipe( pipe_slow );
8172+ %}
8173+
81368174instruct cmovD_cmpI_reg_reg(regD dst, regD src, mRegI tmp1, mRegI tmp2, cmpOp cop) %{
81378175 match(Set dst (CMoveD (Binary cop (CmpI tmp1 tmp2)) (Binary dst src)));
81388176 ins_cost(200);
@@ -8154,12 +8192,13 @@ instruct cmovD_cmpI_reg_reg(regD dst, regD src, mRegI tmp1, mRegI tmp2, cmpOp co
81548192 ins_pipe( pipe_slow );
81558193%}
81568194
8157- instruct cmovD_cmpP_reg_reg (regD dst, regD src, mRegP tmp1, mRegP tmp2, cmpOp cop) %{
8195+ instruct cmovD_cmpLorP_reg_reg (regD dst, regD src, mRegLorP tmp1, mRegLorP tmp2, cmpOp cop) %{
81588196 match(Set dst (CMoveD (Binary cop (CmpP tmp1 tmp2)) (Binary dst src)));
8197+ match(Set dst (CMoveD (Binary cop (CmpL tmp1 tmp2)) (Binary dst src)));
81598198 ins_cost(200);
81608199 format %{
8161- "CMP$cop $tmp1, $tmp2\t @cmovD_cmpP_reg_reg \n"
8162- "\tCMOV $dst, $src \t @cmovD_cmpP_reg_reg "
8200+ "CMP$cop $tmp1, $tmp2\t @cmovD_cmpLorP_reg_reg \n"
8201+ "\tCMOV $dst, $src \t @cmovD_cmpLorP_reg_reg "
81638202 %}
81648203
81658204 ins_encode %{
@@ -8221,6 +8260,26 @@ instruct cmovF_cmpF_reg_reg(regF dst, regF src, regF tmp1, regF tmp2, cmpOp cop
82218260 ins_pipe( pipe_slow );
82228261%}
82238262
8263+ instruct cmovF_cmpD_reg_reg(regF dst, regF src, regD tmp1, regD tmp2, cmpOp cop ) %{
8264+ match(Set dst (CMoveF (Binary cop (CmpD tmp1 tmp2)) (Binary dst src)));
8265+ ins_cost(200);
8266+ format %{
8267+ "CMP$cop $tmp1, $tmp2\t @cmovF_cmpD_reg_reg\n"
8268+ "\tCMOV $dst,$src \t @cmovF_cmpD_reg_reg"
8269+ %}
8270+
8271+ ins_encode %{
8272+ FloatRegister reg_op1 = $tmp1$$FloatRegister;
8273+ FloatRegister reg_op2 = $tmp2$$FloatRegister;
8274+ FloatRegister dst = $dst$$FloatRegister;
8275+ FloatRegister src = $src$$FloatRegister;
8276+ int flag = $cop$$cmpcode;
8277+
8278+ __ cmp_cmov(reg_op1, reg_op2, dst, src, (MacroAssembler::CMCompare) flag, false /* is_float */);
8279+ %}
8280+ ins_pipe( pipe_slow );
8281+ %}
8282+
82248283// Manifest a CmpL result in an integer register. Very painful.
82258284// This is the test to avoid.
82268285instruct cmpL3_reg_zero(mRegI dst, mRegL src1, immL_0 zero) %{
@@ -17207,6 +17266,38 @@ instruct loadconV32(vecY dst, immI_0 src) %{
1720717266 ins_pipe( pipe_slow );
1720817267%}
1720917268
17269+ // ---------------------------- LOAD_SHUFFLE ----------------------------------
17270+
17271+ instruct loadShuffle16B(vecX dst) %{
17272+ predicate(Matcher::vector_length(n) == 16 && Matcher::vector_element_basic_type(n) == T_BYTE);
17273+ match(Set dst (VectorLoadShuffle dst));
17274+ format %{ "vld_shuffle $dst\t# @loadShuffle16B" %}
17275+ ins_encode %{
17276+ // empty
17277+ %}
17278+ ins_pipe( pipe_slow );
17279+ %}
17280+
17281+ instruct loadShuffle32B(vecY dst) %{
17282+ predicate(Matcher::vector_length(n) == 32 && Matcher::vector_element_basic_type(n) == T_BYTE);
17283+ match(Set dst (VectorLoadShuffle dst));
17284+ format %{ "xvld_shuffle $dst\t# @loadShuffle32B" %}
17285+ ins_encode %{
17286+ // empty
17287+ %}
17288+ ins_pipe( pipe_slow );
17289+ %}
17290+
17291+ instruct loadShuffle16S(vecY dst, vecX src) %{
17292+ predicate(Matcher::vector_length(n) == 16 && Matcher::vector_element_basic_type(n) == T_SHORT);
17293+ match(Set dst (VectorLoadShuffle src));
17294+ format %{ "vext2xv.hu.bu $dst, $src\t# @loadShuffle16S" %}
17295+ ins_encode %{
17296+ __ vext2xv_hu_bu($dst$$FloatRegister, $src$$FloatRegister);
17297+ %}
17298+ ins_pipe( pipe_slow );
17299+ %}
17300+
1721017301// ---------------------------- Rearrange -------------------------------------
1721117302
1721217303instruct rearrange16B(vecX dst, vecX src, vecX shuffle) %{
0 commit comments