Skip to content

8390826: RISC-V: Use dedicated vector mask logical instructions - #32480

Open
DingliZhang wants to merge 1 commit into
openjdk:masterfrom
DingliZhang:JDK-8390826
Open

8390826: RISC-V: Use dedicated vector mask logical instructions#32480
DingliZhang wants to merge 1 commit into
openjdk:masterfrom
DingliZhang:JDK-8390826

Conversation

@DingliZhang

@DingliZhang DingliZhang commented Aug 21, 2026

Copy link
Copy Markdown
Member

Hi, please consider.

This is a follow-up to JDK-8390101.

On RISC-V, several VectorMask logical operations involving an all-bits-set mask are currently emitted as sequences of multiple RVV mask instructions. These include:

  • VectorMask.not()
  • VectorMask.and(...).not()
  • VectorMask.or(...).not()
  • VectorMask.xor(...).not()
  • VectorMask.eq()
  • VectorMask.or(other.not())

RVV provides mask logical instructions that can implement these operations directly.

This change adds RISC-V C2 match rules to emit:

  • vmnot.m for mask NOT
  • vmnand.mm for mask NAND
  • vmnor.mm for mask NOR
  • vmxnor.mm for mask XNOR and mask equality
  • vmorn.mm for mask OR-NOT

The rules cover byte, short, int, and long vector element types and replace multi-instruction mask logical sequences with a single RVV mask instruction.

Testing

MaskLogicOperationsBenchmark on sg2044:

                                                                                   Before                 After
Benchmark                                        (size)   Mode  Cnt      Score      Error      Score      Error   Units
MaskLogicOperationsBenchmark.byteMaskEq             256  thrpt   10   9018.332 ±   80.876  12940.779 ± 1240.139  ops/ms
MaskLogicOperationsBenchmark.byteMaskEq             512  thrpt   10   4542.277 ±  474.059   6833.785 ±  852.424  ops/ms
MaskLogicOperationsBenchmark.byteMaskEq            1024  thrpt   10   2485.999 ±   23.447   3783.676 ±   37.133  ops/ms
MaskLogicOperationsBenchmark.byteMaskNand           256  thrpt   10   9239.545 ±   76.134  13712.414 ±   87.500  ops/ms
MaskLogicOperationsBenchmark.byteMaskNand           512  thrpt   10   4865.590 ±   33.147   7037.323 ±  138.414  ops/ms
MaskLogicOperationsBenchmark.byteMaskNand          1024  thrpt   10   2498.022 ±   32.932   3757.491 ±   68.019  ops/ms
MaskLogicOperationsBenchmark.byteMaskNor            256  thrpt   10   9234.898 ±   60.028  13362.605 ±  803.210  ops/ms
MaskLogicOperationsBenchmark.byteMaskNor            512  thrpt   10   4564.248 ±  389.177   7175.499 ±  183.598  ops/ms
MaskLogicOperationsBenchmark.byteMaskNor           1024  thrpt   10   2391.446 ±  128.692   3801.884 ±   61.826  ops/ms
MaskLogicOperationsBenchmark.byteMaskNot            256  thrpt   10  12136.710 ±   42.704  12737.138 ±  583.812  ops/ms
MaskLogicOperationsBenchmark.byteMaskNot            512  thrpt   10   6355.718 ±   31.723   7303.202 ±  163.445  ops/ms
MaskLogicOperationsBenchmark.byteMaskNot           1024  thrpt   10   3184.678 ±   46.596   3769.555 ±   29.849  ops/ms
MaskLogicOperationsBenchmark.byteMaskOrNot          256  thrpt   10   8601.007 ±  719.879  12740.624 ± 1507.283  ops/ms
MaskLogicOperationsBenchmark.byteMaskOrNot          512  thrpt   10   4809.177 ±   16.371   7144.403 ±  253.849  ops/ms
MaskLogicOperationsBenchmark.byteMaskOrNot         1024  thrpt   10   2506.743 ±    4.472   3686.264 ±  158.669  ops/ms
MaskLogicOperationsBenchmark.byteMaskXnor           256  thrpt   10   9185.579 ±   50.773  13342.889 ±  784.611  ops/ms
MaskLogicOperationsBenchmark.byteMaskXnor           512  thrpt   10   4711.714 ±  233.564   6452.076 ±  638.762  ops/ms
MaskLogicOperationsBenchmark.byteMaskXnor          1024  thrpt   10   2494.493 ±   15.519   3572.480 ±  297.684  ops/ms
MaskLogicOperationsBenchmark.intMaskEq              256  thrpt   10   2073.400 ±    5.135   2472.091 ±    5.428  ops/ms
MaskLogicOperationsBenchmark.intMaskEq              512  thrpt   10   1048.405 ±    2.645   1248.988 ±    4.087  ops/ms
MaskLogicOperationsBenchmark.intMaskEq             1024  thrpt   10    526.488 ±    1.489    622.896 ±    2.938  ops/ms
MaskLogicOperationsBenchmark.intMaskNand            256  thrpt   10   2075.758 ±    1.353   2473.220 ±    4.782  ops/ms
MaskLogicOperationsBenchmark.intMaskNand            512  thrpt   10   1048.032 ±    1.180   1241.512 ±   16.265  ops/ms
MaskLogicOperationsBenchmark.intMaskNand           1024  thrpt   10    524.105 ±    2.618    625.106 ±    0.575  ops/ms
MaskLogicOperationsBenchmark.intMaskNor             256  thrpt   10   2068.138 ±    9.930   2475.528 ±    1.095  ops/ms
MaskLogicOperationsBenchmark.intMaskNor             512  thrpt   10   1050.866 ±    0.736   1251.790 ±    1.883  ops/ms
MaskLogicOperationsBenchmark.intMaskNor            1024  thrpt   10    525.298 ±    0.986    624.895 ±    1.216  ops/ms
MaskLogicOperationsBenchmark.intMaskNot             256  thrpt   10   2458.427 ±    1.948   2457.549 ±    1.885  ops/ms
MaskLogicOperationsBenchmark.intMaskNot             512  thrpt   10   1228.623 ±   24.188   1247.589 ±    0.984  ops/ms
MaskLogicOperationsBenchmark.intMaskNot            1024  thrpt   10    622.576 ±    4.406    619.530 ±    9.084  ops/ms
MaskLogicOperationsBenchmark.intMaskOrNot           256  thrpt   10   2075.500 ±    3.012   2476.428 ±    4.104  ops/ms
MaskLogicOperationsBenchmark.intMaskOrNot           512  thrpt   10   1046.363 ±    5.886   1252.890 ±    1.730  ops/ms
MaskLogicOperationsBenchmark.intMaskOrNot          1024  thrpt   10    526.056 ±    1.562    623.275 ±    2.857  ops/ms
MaskLogicOperationsBenchmark.intMaskXnor            256  thrpt   10   2070.466 ±    3.526   2446.226 ±   46.126  ops/ms
MaskLogicOperationsBenchmark.intMaskXnor            512  thrpt   10   1048.819 ±    0.994   1251.266 ±    0.943  ops/ms
MaskLogicOperationsBenchmark.intMaskXnor           1024  thrpt   10    526.267 ±    0.390    624.913 ±    1.733  ops/ms
MaskLogicOperationsBenchmark.longMaskEq             256  thrpt   10   1050.306 ±    0.165   1242.028 ±   13.283  ops/ms
MaskLogicOperationsBenchmark.longMaskEq             512  thrpt   10    526.768 ±    0.426    624.142 ±    1.280  ops/ms
MaskLogicOperationsBenchmark.longMaskEq            1024  thrpt   10    265.019 ±    0.122    314.233 ±    0.403  ops/ms
MaskLogicOperationsBenchmark.longMaskNand           256  thrpt   10   1048.286 ±    0.469   1242.337 ±   11.585  ops/ms
MaskLogicOperationsBenchmark.longMaskNand           512  thrpt   10    525.610 ±    0.431    622.427 ±    1.666  ops/ms
MaskLogicOperationsBenchmark.longMaskNand          1024  thrpt   10    264.681 ±    0.603    314.074 ±    0.154  ops/ms
MaskLogicOperationsBenchmark.longMaskNor            256  thrpt   10   1048.055 ±    0.543   1226.660 ±    9.794  ops/ms
MaskLogicOperationsBenchmark.longMaskNor            512  thrpt   10    526.016 ±    1.356    622.087 ±    0.759  ops/ms
MaskLogicOperationsBenchmark.longMaskNor           1024  thrpt   10    264.539 ±    0.557    314.372 ±    0.261  ops/ms
MaskLogicOperationsBenchmark.longMaskNot            256  thrpt   10   1241.258 ±    1.260   1245.741 ±    1.758  ops/ms
MaskLogicOperationsBenchmark.longMaskNot            512  thrpt   10    617.119 ±    6.206    620.890 ±    6.075  ops/ms
MaskLogicOperationsBenchmark.longMaskNot           1024  thrpt   10    312.830 ±    0.392    314.514 ±    0.156  ops/ms
MaskLogicOperationsBenchmark.longMaskOrNot          256  thrpt   10   1048.181 ±    2.636   1234.480 ±    8.663  ops/ms
MaskLogicOperationsBenchmark.longMaskOrNot          512  thrpt   10    525.119 ±    2.451    622.650 ±    0.313  ops/ms
MaskLogicOperationsBenchmark.longMaskOrNot         1024  thrpt   10    264.993 ±    0.202    313.970 ±    0.279  ops/ms
MaskLogicOperationsBenchmark.longMaskXnor           256  thrpt   10   1047.809 ±    2.390   1242.589 ±   12.864  ops/ms
MaskLogicOperationsBenchmark.longMaskXnor           512  thrpt   10    526.626 ±    0.165    622.408 ±    0.373  ops/ms
MaskLogicOperationsBenchmark.longMaskXnor          1024  thrpt   10    264.869 ±    0.162    314.150 ±    0.425  ops/ms
MaskLogicOperationsBenchmark.shortMaskEq            256  thrpt   10   4001.589 ±  111.097   4714.846 ±  166.680  ops/ms
MaskLogicOperationsBenchmark.shortMaskEq            512  thrpt   10   2044.530 ±   18.828   2439.317 ±   37.263  ops/ms
MaskLogicOperationsBenchmark.shortMaskEq           1024  thrpt   10   1048.464 ±    3.533   1250.140 ±    3.277  ops/ms
MaskLogicOperationsBenchmark.shortMaskNand          256  thrpt   10   3890.173 ±   19.906   4681.852 ±  189.127  ops/ms
MaskLogicOperationsBenchmark.shortMaskNand          512  thrpt   10   2015.875 ±   73.932   2445.336 ±   48.702  ops/ms
MaskLogicOperationsBenchmark.shortMaskNand         1024  thrpt   10   1048.948 ±    2.185   1241.862 ±    5.956  ops/ms
MaskLogicOperationsBenchmark.shortMaskNor           256  thrpt   10   3923.436 ±   94.933   4802.069 ±   12.117  ops/ms
MaskLogicOperationsBenchmark.shortMaskNor           512  thrpt   10   2068.695 ±    6.650   2413.735 ±   18.584  ops/ms
MaskLogicOperationsBenchmark.shortMaskNor          1024  thrpt   10   1049.849 ±    1.759   1247.690 ±    4.547  ops/ms
MaskLogicOperationsBenchmark.shortMaskNot           256  thrpt   10   4710.153 ±   50.733   4680.382 ±   86.138  ops/ms
MaskLogicOperationsBenchmark.shortMaskNot           512  thrpt   10   2443.089 ±   25.180   2357.752 ±   41.659  ops/ms
MaskLogicOperationsBenchmark.shortMaskNot          1024  thrpt   10   1210.572 ±   43.238   1239.140 ±    8.773  ops/ms
MaskLogicOperationsBenchmark.shortMaskOrNot         256  thrpt   10   4012.940 ±   11.516   4707.418 ±  170.822  ops/ms
MaskLogicOperationsBenchmark.shortMaskOrNot         512  thrpt   10   2044.855 ±   58.208   2461.608 ±    9.438  ops/ms
MaskLogicOperationsBenchmark.shortMaskOrNot        1024  thrpt   10   1040.237 ±    6.151   1243.464 ±    3.754  ops/ms
MaskLogicOperationsBenchmark.shortMaskXnor          256  thrpt   10   3846.149 ±   96.289   4573.799 ±  329.342  ops/ms
MaskLogicOperationsBenchmark.shortMaskXnor          512  thrpt   10   2036.955 ±    7.014   2435.019 ±   41.906  ops/ms
MaskLogicOperationsBenchmark.shortMaskXnor         1024  thrpt   10   1050.702 ±    3.196   1252.520 ±    0.873  ops/ms
  • compiler/vectorapi/AllBitsSetVectorMatchRuleTest.java passed on sg2044
  • test/jdk/jdk/incubator/vector passed on sg2044
  • tier1 on sg2044


Progress

  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue
  • Change must be properly reviewed (2 reviews required, with at least 1 Reviewer, 1 Author)

Issue

  • JDK-8390826: RISC-V: Use dedicated vector mask logical instructions (Enhancement - P4)

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/32480/head:pull/32480
$ git checkout pull/32480

Update a local copy of the PR:
$ git checkout pull/32480
$ git pull https://git.openjdk.org/jdk.git pull/32480/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 32480

View PR using the GUI difftool:
$ git pr show -t 32480

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/32480.diff

Using Webrev

Link to Webrev Comment

@bridgekeeper

bridgekeeper Bot commented Aug 21, 2026

Copy link
Copy Markdown

👋 Welcome back dzhang! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk

openjdk Bot commented Aug 21, 2026

Copy link
Copy Markdown

❗ This change is not yet ready to be integrated.
See the Progress checklist in the description for automated requirements.

@openjdk openjdk Bot added hotspot-compiler hotspot-compiler-dev@openjdk.org core-libs core-libs-dev@openjdk.org labels Aug 21, 2026
@openjdk

openjdk Bot commented Aug 21, 2026

Copy link
Copy Markdown

@DingliZhang The following labels will be automatically applied to this pull request:

  • core-libs
  • hotspot-compiler

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing lists. If you would like to change these labels, use the /label pull request command.

@openjdk

openjdk Bot commented Aug 21, 2026

Copy link
Copy Markdown

The total number of required reviews for this PR has been set to 2 based on the presence of this label: hotspot-compiler. This can be overridden with the /reviewers command.

@openjdk openjdk Bot added the rfr Pull request is ready for review label Aug 21, 2026
@mlbridge

mlbridge Bot commented Aug 21, 2026

Copy link
Copy Markdown

Webrevs


instruct vmask_xnorI(vRegMask dst, vRegMask src1, vRegMask src2, immI_M1 m1) %{
match(Set dst (XorVMask (XorVMask src1 src2) (MaskAll m1)));
match(Set dst (XorVMask src1 (XorVMask src2 (MaskAll m1))));

@RealFYang RealFYang Aug 24, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question: There are two matchings for this instruct. But seems the newly-add IR test only covered one of them, right? I am wondering if we really need both of them.


instruct vmask_xnorL(vRegMask dst, vRegMask src1, vRegMask src2, immL_M1 m1) %{
match(Set dst (XorVMask (XorVMask src1 src2) (MaskAll m1)));
match(Set dst (XorVMask src1 (XorVMask src2 (MaskAll m1))));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core-libs core-libs-dev@openjdk.org hotspot-compiler hotspot-compiler-dev@openjdk.org rfr Pull request is ready for review

Development

Successfully merging this pull request may close these issues.

2 participants