RFR: 8302908: RISC-V: Support vector add mask instructions for Vector API
Dingli Zhang
dzhang at openjdk.org
Tue Feb 21 06:24:21 UTC 2023
HI,
We have added support for vector add mask instructions, please take a look and have some reviews. Thanks a lot.
This patch will add support of `VectorLoadMask`, `AddVB`, `AddVS`, `AddVI`, `AddVL`, `AddVF`, `AddVD` for RISC-V and was implemented by referring to RVV v1.0 [1].
`VectorLoadMask` will generate the corresponding mask vector for the vector addition operation in mask form.
AddMaskTestMerge case:
import jdk.incubator.vector.IntVector;
import jdk.incubator.vector.VectorMask;
import jdk.incubator.vector.VectorOperators;
import jdk.incubator.vector.VectorSpecies;
public class AddMaskTestMerge {
static final VectorSpecies<Integer> SPECIES = IntVector.SPECIES_128;
static final int SIZE = 1024;
static int[] a = new int[SIZE];
static int[] b = new int[SIZE];
static int[] r = new int[SIZE];
static boolean[] c = new boolean[]{true,false,true,false,true,false,true,false};
static {
for (int i = 0; i < SIZE; i++) {
a[i] = i;
b[i] = i;
}
}
static void workload(int idx) {
VectorMask<Integer> vmask = VectorMask.fromArray(SPECIES, c, 0);
IntVector av = IntVector.fromArray(SPECIES, a, idx);
IntVector bv = IntVector.fromArray(SPECIES, b, idx);
av.lanewise(VectorOperators.ADD, bv, vmask).intoArray(r, idx);
}
public static void main(String[] args) {
for (int i = 0; i < 30_0000; i++) {
for (int j = 0; j < SIZE; j += SPECIES.length()) {
workload(j);
}
}
}
}
This test cases are reduced from existing jtreg vector tests Int128VectorTests.java [2].
Before this patch, the compilation log will not print RVV-related instructions. Now the compilation log is as follows:
0ae B10: # out( B25 B11 ) <- in( B9 ) Freq: 0.999991
0ae loadV V1, [R31] # vector (rvv)
0b6 vloadmask V0, V2 # KILL cr
0be vadd.vv V3, V1, V0 #@vaddI_masked
0c6 lwu R28, [R7, #124] # loadN, compressed ptr, #@loadN ! Field: AddMaskTestMerge.r
0ca decode_heap_oop R28, R28 #@decodeHeapOop
0cc lwu R7, [R28, #12] # range, #@loadRange
0d0 NullCheck R28
And the jit code is as follows:
0x000000400c8109ae: vsetivli t0,4,e32,m1,tu,mu
0x000000400c8109b2: vle32.v v1,(t6) ;*invokestatic store {reexecute=0 rethrow=0 return_oop=0}
; - jdk.incubator.vector.IntVector::intoArray at 43 (line 3228)
; - AddMaskTestMerge::workload at 46 (line 25)
0x000000400c8109b6: vsetivli t0,4,e8,m1,tu,mu
0x000000400c8109ba: vmsne.vx v0,v2,zero ;*invokestatic load {reexecute=0 rethrow=0 return_oop=0}
; - jdk.incubator.vector.VectorMask::fromArray at 47 (line 208)
; - AddMaskTestMerge::workload at 7 (line 22)
0x000000400c8109be: vsetivli t0,4,e32,m1,tu,mu
0x000000400c8109c2: vadd.vv v3,v3,v1,v0.t ;*invokestatic binaryOp {reexecute=0 rethrow=0 return_oop=0}
; - jdk.incubator.vector.IntVector::lanewiseTemplate at 192 (line 834)
; - jdk.incubator.vector.Int128Vector::lanewise at 9 (line 291)
; - jdk.incubator.vector.Int128Vector::lanewise at 4 (line 41)
; - AddMaskTestMerge::workload at 39 (line 25)
[1] https://github.com/riscv/riscv-v-spec/blob/v1.0/v-spec.adoc
[2] https://github.com/openjdk/jdk/blob/master/test/jdk/jdk/incubator/vector/Int128VectorTests.java
### Testing:
qemu with UseRVV:
- [x] Tier1 tests (release)
- [x] Tier2 tests (release)
- [x] Tier3 tests (release)
- [x] test/jdk/jdk/incubator/vector (release/fastdebug)
Unmatched:
- [x] Tier1 tests (release)
- [ ] Tier2 tests (release)
-------------
Commit messages:
- RISC-V: Support vector add mask instructions for Vector API
Changes: https://git.openjdk.org/jdk/pull/12682/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=12682&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8302908
Stats: 122 lines in 3 files changed: 116 ins; 1 del; 5 mod
Patch: https://git.openjdk.org/jdk/pull/12682.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/12682/head:pull/12682
PR: https://git.openjdk.org/jdk/pull/12682
More information about the hotspot-compiler-dev
mailing list