@@ -2301,6 +2301,12 @@ const bool Matcher::match_rule_supported(int opcode) {
23012301 ret_value = false;
23022302 }
23032303 break;
2304+ case Op_ExpandBits:
2305+ case Op_CompressBits:
2306+ if (!(UseSVE > 1 && VM_Version::supports_svebitperm())) {
2307+ ret_value = false;
2308+ }
2309+ break;
23042310 }
23052311
23062312 return ret_value; // Per default match rules are supported.
@@ -17350,6 +17356,157 @@ instruct encode_ascii_array(iRegP_R2 src, iRegP_R1 dst, iRegI_R3 len,
1735017356 ins_pipe(pipe_class_memory);
1735117357%}
1735217358
17359+ //----------------------------- CompressBits/ExpandBits ------------------------
17360+
17361+ instruct compressBitsI_reg(iRegINoSp dst, iRegIorL2I src, iRegIorL2I mask,
17362+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17363+ match(Set dst (CompressBits src mask));
17364+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17365+ format %{ "mov $tsrc, $src\n\t"
17366+ "mov $tmask, $mask\n\t"
17367+ "bext $tdst, $tsrc, $tmask\n\t"
17368+ "mov $dst, $tdst"
17369+ %}
17370+ ins_encode %{
17371+ __ mov($tsrc$$FloatRegister, __ S, 0, $src$$Register);
17372+ __ mov($tmask$$FloatRegister, __ S, 0, $mask$$Register);
17373+ __ sve_bext($tdst$$FloatRegister, __ S, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17374+ __ mov($dst$$Register, $tdst$$FloatRegister, __ S, 0);
17375+ %}
17376+ ins_pipe(pipe_slow);
17377+ %}
17378+
17379+ instruct compressBitsI_memcon(iRegINoSp dst, memory4 mem, immI mask,
17380+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17381+ match(Set dst (CompressBits (LoadI mem) mask));
17382+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17383+ format %{ "ldrs $tsrc, $mem\n\t"
17384+ "ldrs $tmask, $mask\n\t"
17385+ "bext $tdst, $tsrc, $tmask\n\t"
17386+ "mov $dst, $tdst"
17387+ %}
17388+ ins_encode %{
17389+ loadStore(C2_MacroAssembler(&cbuf), &MacroAssembler::ldrs, $tsrc$$FloatRegister, $mem->opcode(),
17390+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 4);
17391+ __ ldrs($tmask$$FloatRegister, $constantaddress($mask));
17392+ __ sve_bext($tdst$$FloatRegister, __ S, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17393+ __ mov($dst$$Register, $tdst$$FloatRegister, __ S, 0);
17394+ %}
17395+ ins_pipe(pipe_slow);
17396+ %}
17397+
17398+ instruct compressBitsL_reg(iRegLNoSp dst, iRegL src, iRegL mask,
17399+ vRegD tdst, vRegD tsrc, vRegD tmask) %{
17400+ match(Set dst (CompressBits src mask));
17401+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17402+ format %{ "mov $tsrc, $src\n\t"
17403+ "mov $tmask, $mask\n\t"
17404+ "bext $tdst, $tsrc, $tmask\n\t"
17405+ "mov $dst, $tdst"
17406+ %}
17407+ ins_encode %{
17408+ __ mov($tsrc$$FloatRegister, __ D, 0, $src$$Register);
17409+ __ mov($tmask$$FloatRegister, __ D, 0, $mask$$Register);
17410+ __ sve_bext($tdst$$FloatRegister, __ D, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17411+ __ mov($dst$$Register, $tdst$$FloatRegister, __ D, 0);
17412+ %}
17413+ ins_pipe(pipe_slow);
17414+ %}
17415+
17416+ instruct compressBitsL_memcon(iRegLNoSp dst, memory8 mem, immL mask,
17417+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17418+ match(Set dst (CompressBits (LoadL mem) mask));
17419+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17420+ format %{ "ldrd $tsrc, $mem\n\t"
17421+ "ldrd $tmask, $mask\n\t"
17422+ "bext $tdst, $tsrc, $tmask\n\t"
17423+ "mov $dst, $tdst"
17424+ %}
17425+ ins_encode %{
17426+ loadStore(C2_MacroAssembler(&cbuf), &MacroAssembler::ldrd, $tsrc$$FloatRegister, $mem->opcode(),
17427+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 8);
17428+ __ ldrd($tmask$$FloatRegister, $constantaddress($mask));
17429+ __ sve_bext($tdst$$FloatRegister, __ D, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17430+ __ mov($dst$$Register, $tdst$$FloatRegister, __ D, 0);
17431+ %}
17432+ ins_pipe(pipe_slow);
17433+ %}
17434+
17435+ instruct expandBitsI_reg(iRegINoSp dst, iRegIorL2I src, iRegIorL2I mask,
17436+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17437+ match(Set dst (ExpandBits src mask));
17438+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17439+ format %{ "mov $tsrc, $src\n\t"
17440+ "mov $tmask, $mask\n\t"
17441+ "bdep $tdst, $tsrc, $tmask\n\t"
17442+ "mov $dst, $tdst"
17443+ %}
17444+ ins_encode %{
17445+ __ mov($tsrc$$FloatRegister, __ S, 0, $src$$Register);
17446+ __ mov($tmask$$FloatRegister, __ S, 0, $mask$$Register);
17447+ __ sve_bdep($tdst$$FloatRegister, __ S, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17448+ __ mov($dst$$Register, $tdst$$FloatRegister, __ S, 0);
17449+ %}
17450+ ins_pipe(pipe_slow);
17451+ %}
17452+
17453+ instruct expandBitsI_memcon(iRegINoSp dst, memory4 mem, immI mask,
17454+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17455+ match(Set dst (ExpandBits (LoadI mem) mask));
17456+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17457+ format %{ "ldrs $tsrc, $mem\n\t"
17458+ "ldrs $tmask, $mask\n\t"
17459+ "bdep $tdst, $tsrc, $tmask\n\t"
17460+ "mov $dst, $tdst"
17461+ %}
17462+ ins_encode %{
17463+ loadStore(C2_MacroAssembler(&cbuf), &MacroAssembler::ldrs, $tsrc$$FloatRegister, $mem->opcode(),
17464+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 4);
17465+ __ ldrs($tmask$$FloatRegister, $constantaddress($mask));
17466+ __ sve_bdep($tdst$$FloatRegister, __ S, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17467+ __ mov($dst$$Register, $tdst$$FloatRegister, __ S, 0);
17468+ %}
17469+ ins_pipe(pipe_slow);
17470+ %}
17471+
17472+ instruct expandBitsL_reg(iRegLNoSp dst, iRegL src, iRegL mask,
17473+ vRegD tdst, vRegD tsrc, vRegD tmask) %{
17474+ match(Set dst (ExpandBits src mask));
17475+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17476+ format %{ "mov $tsrc, $src\n\t"
17477+ "mov $tmask, $mask\n\t"
17478+ "bdep $tdst, $tsrc, $tmask\n\t"
17479+ "mov $dst, $tdst"
17480+ %}
17481+ ins_encode %{
17482+ __ mov($tsrc$$FloatRegister, __ D, 0, $src$$Register);
17483+ __ mov($tmask$$FloatRegister, __ D, 0, $mask$$Register);
17484+ __ sve_bdep($tdst$$FloatRegister, __ D, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17485+ __ mov($dst$$Register, $tdst$$FloatRegister, __ D, 0);
17486+ %}
17487+ ins_pipe(pipe_slow);
17488+ %}
17489+
17490+
17491+ instruct expandBitsL_memcon(iRegINoSp dst, memory8 mem, immL mask,
17492+ vRegF tdst, vRegF tsrc, vRegF tmask) %{
17493+ match(Set dst (ExpandBits (LoadL mem) mask));
17494+ effect(TEMP tdst, TEMP tsrc, TEMP tmask);
17495+ format %{ "ldrd $tsrc, $mem\n\t"
17496+ "ldrd $tmask, $mask\n\t"
17497+ "bdep $tdst, $tsrc, $tmask\n\t"
17498+ "mov $dst, $tdst"
17499+ %}
17500+ ins_encode %{
17501+ loadStore(C2_MacroAssembler(&cbuf), &MacroAssembler::ldrd, $tsrc$$FloatRegister, $mem->opcode(),
17502+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp, 8);
17503+ __ ldrd($tmask$$FloatRegister, $constantaddress($mask));
17504+ __ sve_bdep($tdst$$FloatRegister, __ D, $tsrc$$FloatRegister, $tmask$$FloatRegister);
17505+ __ mov($dst$$Register, $tdst$$FloatRegister, __ D, 0);
17506+ %}
17507+ ins_pipe(pipe_slow);
17508+ %}
17509+
1735317510// ============================================================================
1735417511// This name is KNOWN by the ADLC and cannot be changed.
1735517512// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
0 commit comments