@@ -411,21 +411,22 @@ instruct storeV_masked_partial(vReg src, vmemA mem, pRegGov pg, pRegGov pgtmp, r
411411 ins_pipe(pipe_slow);
412412%}
413413
414- // maskAll
414+ // maskAll (full or partial predicate size)
415415
416416instruct vmaskAll_immI(pRegGov dst, immI src) %{
417417 predicate(UseSVE > 0);
418418 match(Set dst (MaskAll src));
419419 ins_cost(SVE_COST);
420- format %{ "sve_ptrue /sve_pfalse $dst\t# mask all (sve) (B/H/S)" %}
420+ format %{ "sve_ptrue_lanecnt /sve_pfalse $dst\t# mask all (sve) (B/H/S)" %}
421421 ins_encode %{
422422 int con = (int)$src$$constant;
423423 if (con == 0) {
424424 __ sve_pfalse(as_PRegister($dst$$reg));
425425 } else {
426426 assert(con == -1, "invalid constant value for mask");
427427 BasicType bt = Matcher::vector_element_basic_type(this);
428- __ sve_ptrue(as_PRegister($dst$$reg), __ elemType_to_regVariant(bt));
428+ __ sve_ptrue_lanecnt(as_PRegister($dst$$reg), __ elemType_to_regVariant(bt),
429+ Matcher::vector_length(this));
429430 }
430431 %}
431432 ins_pipe(pipe_slow);
@@ -435,14 +436,22 @@ instruct vmaskAllI(pRegGov dst, iRegIorL2I src, vReg tmp, rFlagsReg cr) %{
435436 predicate(UseSVE > 0);
436437 match(Set dst (MaskAll src));
437438 effect(TEMP tmp, KILL cr);
438- ins_cost(2 * SVE_COST);
439+ ins_cost(3 * SVE_COST);
439440 format %{ "sve_dup $tmp, $src\n\t"
440- "sve_cmpne $dst, $tmp, 0\t# mask all (sve) (B/H/S)" %}
441+ "sve_ptrue_lanecnt $dst\n\t"
442+ "sve_cmpne $dst, $dst, $tmp, 0\t# mask all (sve) (B/H/S)" %}
441443 ins_encode %{
442444 BasicType bt = Matcher::vector_element_basic_type(this);
443445 Assembler::SIMD_RegVariant size = __ elemType_to_regVariant(bt);
446+ uint length_in_bytes = Matcher::vector_length_in_bytes(this);
444447 __ sve_dup(as_FloatRegister($tmp$$reg), size, as_Register($src$$reg));
445- __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size, ptrue, as_FloatRegister($tmp$$reg), 0);
448+ if (length_in_bytes < MaxVectorSize) {
449+ __ sve_ptrue_lanecnt(as_PRegister($dst$$reg), size, Matcher::vector_length(this));
450+ __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size,
451+ as_PRegister($dst$$reg), as_FloatRegister($tmp$$reg), 0);
452+ } else {
453+ __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size, ptrue, as_FloatRegister($tmp$$reg), 0);
454+ }
446455 %}
447456 ins_pipe(pipe_slow);
448457%}
@@ -451,15 +460,16 @@ instruct vmaskAll_immL(pRegGov dst, immL src) %{
451460 predicate(UseSVE > 0);
452461 match(Set dst (MaskAll src));
453462 ins_cost(SVE_COST);
454- format %{ "sve_ptrue /sve_pfalse $dst\t# mask all (sve) (D)" %}
463+ format %{ "sve_ptrue_lanecnt /sve_pfalse $dst\t# mask all (sve) (D)" %}
455464 ins_encode %{
456465 long con = (long)$src$$constant;
457466 if (con == 0) {
458467 __ sve_pfalse(as_PRegister($dst$$reg));
459468 } else {
460469 assert(con == -1, "invalid constant value for mask");
461470 BasicType bt = Matcher::vector_element_basic_type(this);
462- __ sve_ptrue(as_PRegister($dst$$reg), __ elemType_to_regVariant(bt));
471+ __ sve_ptrue_lanecnt(as_PRegister($dst$$reg), __ elemType_to_regVariant(bt),
472+ Matcher::vector_length(this));
463473 }
464474 %}
465475 ins_pipe(pipe_slow);
@@ -469,14 +479,22 @@ instruct vmaskAllL(pRegGov dst, iRegL src, vReg tmp, rFlagsReg cr) %{
469479 predicate(UseSVE > 0);
470480 match(Set dst (MaskAll src));
471481 effect(TEMP tmp, KILL cr);
472- ins_cost(2 * SVE_COST);
482+ ins_cost(3 * SVE_COST);
473483 format %{ "sve_dup $tmp, $src\n\t"
474- "sve_cmpne $dst, $tmp, 0\t# mask all (sve) (D)" %}
484+ "sve_ptrue_lanecnt $dst\n\t"
485+ "sve_cmpne $dst, $dst, $tmp, 0\t# mask all (sve) (D)" %}
475486 ins_encode %{
476487 BasicType bt = Matcher::vector_element_basic_type(this);
477488 Assembler::SIMD_RegVariant size = __ elemType_to_regVariant(bt);
489+ uint length_in_bytes = Matcher::vector_length_in_bytes(this);
478490 __ sve_dup(as_FloatRegister($tmp$$reg), size, as_Register($src$$reg));
479- __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size, ptrue, as_FloatRegister($tmp$$reg), 0);
491+ if (length_in_bytes < MaxVectorSize) {
492+ __ sve_ptrue_lanecnt(as_PRegister($dst$$reg), size, Matcher::vector_length(this));
493+ __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size,
494+ as_PRegister($dst$$reg), as_FloatRegister($tmp$$reg), 0);
495+ } else {
496+ __ sve_cmp(Assembler::NE, as_PRegister($dst$$reg), size, ptrue, as_FloatRegister($tmp$$reg), 0);
497+ }
480498 %}
481499 ins_pipe(pipe_slow);
482500%}
@@ -3084,6 +3102,7 @@ instruct reduce_maxF_masked(vRegF dst, vRegF src1, vReg src2, pRegGov pg) %{
30843102 n->in(1)->in(2)->bottom_type()->is_vect()->length_in_bytes() == MaxVectorSize);
30853103 match(Set dst (MaxReductionV (Binary src1 src2) pg));
30863104 ins_cost(SVE_COST);
3105+ effect(TEMP_DEF dst);
30873106 format %{ "sve_reduce_maxF $dst, $src1, $pg, $src2\t# maxF reduction predicated (sve)" %}
30883107 ins_encode %{
30893108 __ sve_fmaxv(as_FloatRegister($dst$$reg), __ S, as_PRegister($pg$$reg), as_FloatRegister($src2$$reg));
@@ -3098,6 +3117,7 @@ instruct reduce_maxD_masked(vRegD dst, vRegD src1, vReg src2, pRegGov pg) %{
30983117 n->in(1)->in(2)->bottom_type()->is_vect()->length_in_bytes() == MaxVectorSize);
30993118 match(Set dst (MaxReductionV (Binary src1 src2) pg));
31003119 ins_cost(SVE_COST);
3120+ effect(TEMP_DEF dst);
31013121 format %{ "sve_reduce_maxD $dst, $src1, $pg, $src2\t# maxD reduction predicated (sve)" %}
31023122 ins_encode %{
31033123 __ sve_fmaxv(as_FloatRegister($dst$$reg), __ D, as_PRegister($pg$$reg), as_FloatRegister($src2$$reg));
@@ -3380,6 +3400,7 @@ instruct reduce_minF_masked(vRegF dst, vRegF src1, vReg src2, pRegGov pg) %{
33803400 n->in(1)->in(2)->bottom_type()->is_vect()->length_in_bytes() == MaxVectorSize);
33813401 match(Set dst (MinReductionV (Binary src1 src2) pg));
33823402 ins_cost(SVE_COST);
3403+ effect(TEMP_DEF dst);
33833404 format %{ "sve_reduce_minF $dst, $src1, $pg, $src2\t# minF reduction predicated (sve)" %}
33843405 ins_encode %{
33853406 __ sve_fminv(as_FloatRegister($dst$$reg), __ S, as_PRegister($pg$$reg), as_FloatRegister($src2$$reg));
@@ -3394,6 +3415,7 @@ instruct reduce_minD_masked(vRegD dst, vRegD src1, vReg src2, pRegGov pg) %{
33943415 n->in(1)->in(2)->bottom_type()->is_vect()->length_in_bytes() == MaxVectorSize);
33953416 match(Set dst (MinReductionV (Binary src1 src2) pg));
33963417 ins_cost(SVE_COST);
3418+ effect(TEMP_DEF dst);
33973419 format %{ "sve_reduce_minD $dst, $src1, $pg, $src2\t# minD reduction predicated (sve)" %}
33983420 ins_encode %{
33993421 __ sve_fminv(as_FloatRegister($dst$$reg), __ D, as_PRegister($pg$$reg), as_FloatRegister($src2$$reg));
0 commit comments