RFR: 8282966: AArch64: Optimize VectorMask.toLong with SVE2

Eric Liu eliu at openjdk.java.net
Thu Apr 21 12:24:46 UTC 2022


This patch optimizes the backend implementation of VectorMaskToLong for
AArch64, given a more efficient approach to mov value bits from
predicate register to general purpose register as x86 PMOVMSK[1] does,
by using BEXT[2] which is available in SVE2.

With this patch, the final code (input mask is byte type with
SPECIESE_512, generated on an SVE vector reg size of 512-bit QEMU
emulator) changes as below:

Before:

        mov     z16.b, p0/z, #1
        fmov    x0, d16
        orr     x0, x0, x0, lsr #7
        orr     x0, x0, x0, lsr #14
        orr     x0, x0, x0, lsr #28
        and     x0, x0, #0xff
        fmov    x8, v16.d[1]
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #8

        orr     x8, xzr, #0x2
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #16

        orr     x8, xzr, #0x3
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #24

        orr     x8, xzr, #0x4
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #32

        mov     x8, #0x5
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #40

        orr     x8, xzr, #0x6
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #48

        orr     x8, xzr, #0x7
        whilele p1.d, xzr, x8
        lastb   x8, p1, z16.d
        orr     x8, x8, x8, lsr #7
        orr     x8, x8, x8, lsr #14
        orr     x8, x8, x8, lsr #28
        and     x8, x8, #0xff
        orr     x0, x0, x8, lsl #56

After:

        mov     z16.b, p0/z, #1
        mov     z17.b, #1
        bext    z16.d, z16.d, z17.d
        mov     z17.d, #0
        uzp1    z16.s, z16.s, z17.s
        uzp1    z16.h, z16.h, z17.h
        uzp1    z16.b, z16.b, z17.b
        mov     x0, v16.d[0]

[1] https://www.felixcloutier.com/x86/pmovmskb
[2] https://developer.arm.com/documentation/ddi0602/2020-12/SVE-Instructions/BEXT--Gather-lower-bits-from-positions-selected-by-bitmask-

-------------

Commit messages:
 - 8282966: AArch64: Optimize VectorMask.toLong with SVE2

Changes: https://git.openjdk.java.net/jdk/pull/8337/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=8337&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8282966
  Stats: 144 lines in 7 files changed: 102 ins; 3 del; 39 mod
  Patch: https://git.openjdk.java.net/jdk/pull/8337.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/8337/head:pull/8337

PR: https://git.openjdk.java.net/jdk/pull/8337


More information about the hotspot-compiler-dev mailing list