mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-15 13:59:40 +01:00
Compare commits
488 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b9b176c67 | ||
|
|
0cc8e5beed | ||
|
|
f2920533e9 | ||
|
|
62c9530c05 | ||
|
|
1f2922ad85 | ||
|
|
2cd1ba6a52 | ||
|
|
1733d2ea24 | ||
|
|
66971600f7 | ||
|
|
725314fb73 | ||
|
|
ec6c35c4ac | ||
|
|
b5c267fc8a | ||
|
|
ec56c72b51 | ||
|
|
f7121de4a0 | ||
|
|
577de17d24 | ||
|
|
83b3c9b3ee | ||
|
|
7d1a48807a | ||
|
|
c3c1d5bd12 | ||
|
|
8892d45b9f | ||
|
|
11e28bd619 | ||
|
|
d51aaf6304 | ||
|
|
f57c7223cf | ||
|
|
f0024f585d | ||
|
|
fd8adf3083 | ||
|
|
a1d65eb6d8 | ||
|
|
b6d364ad88 | ||
|
|
64c3642c57 | ||
|
|
e999dfcb40 | ||
|
|
84deeb6cd5 | ||
|
|
fb07bbe7b2 | ||
|
|
d1e676360d | ||
|
|
c1281e6b45 | ||
|
|
a6bdee48f3 | ||
|
|
951b5f8ecb | ||
|
|
fe0eec7e20 | ||
|
|
4df04f0ec9 | ||
|
|
3066d49cc1 | ||
|
|
7a300b63b5 | ||
|
|
628348d3e9 | ||
|
|
72ba8178a8 | ||
|
|
b39b876493 | ||
|
|
69586e7bdf | ||
|
|
f0bae7939a | ||
|
|
6ad78ca8a5 | ||
|
|
422020c4d6 | ||
|
|
0d5f5e15d4 | ||
|
|
af9cd975ce | ||
|
|
8950d68ddb | ||
|
|
65d6bc1d4c | ||
|
|
525c0cd09f | ||
|
|
2e748c998e | ||
|
|
70f4a4e18e | ||
|
|
ed3272cc44 | ||
|
|
6d1856234f | ||
|
|
91d8ea79d9 | ||
|
|
a65a89522d | ||
|
|
62b3293df0 | ||
|
|
885e9b76d6 | ||
|
|
32ddcf504c | ||
|
|
c313d451a5 | ||
|
|
781f368d42 | ||
|
|
33324a59cc | ||
|
|
10066cd4ef | ||
|
|
bde87895c8 | ||
|
|
b5995a76f7 | ||
|
|
95310eab6c | ||
|
|
39b756a0d1 | ||
|
|
12b89cd2ee | ||
|
|
746a08686b | ||
|
|
ffe3bb6763 | ||
|
|
e709842eae | ||
|
|
7a798d3ceb | ||
|
|
6d36eb78ad | ||
|
|
9d1a6d1484 | ||
|
|
3059c3b69e | ||
|
|
929af9ed03 | ||
|
|
e7fdac9d5c | ||
|
|
3d32c460eb | ||
|
|
2d5cb97288 | ||
|
|
6212264cc6 | ||
|
|
32eb5290c2 | ||
|
|
c702dcabf8 | ||
|
|
c432dc008b | ||
|
|
fb822e49f2 | ||
|
|
00bb6bf509 | ||
|
|
bccd823c8e | ||
|
|
8c003d83c4 | ||
|
|
67f29b16ef | ||
|
|
1c1cb048cd | ||
|
|
b65e5eb14e | ||
|
|
6d2f6408e4 | ||
|
|
c17059dee7 | ||
|
|
96607df7f0 | ||
|
|
edfee7f348 | ||
|
|
8b9bf75880 | ||
|
|
3d8236367d | ||
|
|
2a01c798d3 | ||
|
|
fbaaac63d4 | ||
|
|
791b427f44 | ||
|
|
bcaad515fd | ||
|
|
5acd37fa96 | ||
|
|
f5e6d111b1 | ||
|
|
bcb340da09 | ||
|
|
3696765b7d | ||
|
|
5a74c2a67e | ||
|
|
52523d33dd | ||
|
|
df370d725e | ||
|
|
0d8543d677 | ||
|
|
c9cacfb25d | ||
|
|
bde650f21e | ||
|
|
be943a9fd6 | ||
|
|
d3b2ac1507 | ||
|
|
72f199024d | ||
|
|
c84af49386 | ||
|
|
fd372629f7 | ||
|
|
76afa02dab | ||
|
|
2003610b3b | ||
|
|
a474b37212 | ||
|
|
68b5aab020 | ||
|
|
f54a336cb7 | ||
|
|
f4d08ccf80 | ||
|
|
9049402a1b | ||
|
|
f1b73350c2 | ||
|
|
8700de66e4 | ||
|
|
6c0bebccb0 | ||
|
|
437342b93e | ||
|
|
39005e27d6 | ||
|
|
2865afe759 | ||
|
|
6997bfc68d | ||
|
|
16be38887f | ||
|
|
0081d8c07f | ||
|
|
5f7141982c | ||
|
|
05330227be | ||
|
|
05dad67cc2 | ||
|
|
9efdd242fb | ||
|
|
81df265e41 | ||
|
|
a6c0b10704 | ||
|
|
5c874c19cb | ||
|
|
b6233c3de7 | ||
|
|
bfd2afe5ad | ||
|
|
4c1a0fc58f | ||
|
|
a2b117ae02 | ||
|
|
8e534598b5 | ||
|
|
aeb304b29e | ||
|
|
a22ae909bc | ||
|
|
806ffb1085 | ||
|
|
52f787f675 | ||
|
|
cbfddf4e1d | ||
|
|
57fad67781 | ||
|
|
ff8cc268fd | ||
|
|
dadd9cd1e8 | ||
|
|
de237fb058 | ||
|
|
51dbd36c74 | ||
|
|
ffa33d7b80 | ||
|
|
4e5323538c | ||
|
|
19287eeeb2 | ||
|
|
8b29e127c2 | ||
|
|
7be9f1d054 | ||
|
|
b8dafa642e | ||
|
|
f2a4ed680b | ||
|
|
22642ff0aa | ||
|
|
b89172149d | ||
|
|
bf666bc0c7 | ||
|
|
de97c0eb4b | ||
|
|
f70667ea68 | ||
|
|
2063bb8ffa | ||
|
|
d8b63370f3 | ||
|
|
43d2d68da5 | ||
|
|
b058063c40 | ||
|
|
19c9388c20 | ||
|
|
b533272ecb | ||
|
|
1007618f6f | ||
|
|
790871e908 | ||
|
|
0216f5de55 | ||
|
|
21f647310b | ||
|
|
e2d6023cb9 | ||
|
|
2fd775f69c | ||
|
|
ee4d9aa4c1 | ||
|
|
5045839cb2 | ||
|
|
44a9392eca | ||
|
|
59062402b9 | ||
|
|
e01f6da1b8 | ||
|
|
8abaf11965 | ||
|
|
67204994dc | ||
|
|
bf7bd9a16c | ||
|
|
c1a568c9c4 | ||
|
|
1cc6fbd9b0 | ||
|
|
ed238e8b88 | ||
|
|
fac49b8375 | ||
|
|
fff750c99d | ||
|
|
a2544568f9 | ||
|
|
36f4b34f19 | ||
|
|
b363472265 | ||
|
|
edc0ebb780 | ||
|
|
a03eb6d3f6 | ||
|
|
f5b757ced6 | ||
|
|
1f4474f677 | ||
|
|
dd0694b9cb | ||
|
|
bf813be0f3 | ||
|
|
c84c0ab52d | ||
|
|
f368a0c12e | ||
|
|
a45b5b4921 | ||
|
|
7e0a4ed629 | ||
|
|
34f85ee94e | ||
|
|
62fd26f094 | ||
|
|
8c238eddce | ||
|
|
cd0fe37741 | ||
|
|
45c65e6b1a | ||
|
|
8643cc2133 | ||
|
|
e66a76f524 | ||
|
|
ba3c3bbd87 | ||
|
|
922f8e44ee | ||
|
|
1515bd7c9d | ||
|
|
bdee968e3e | ||
|
|
71d9a83dec | ||
|
|
d83ea92085 | ||
|
|
5cf7947ccd | ||
|
|
dc7d3b182d | ||
|
|
84cf4cb350 | ||
|
|
9e9c05f0ee | ||
|
|
c54bca6f7f | ||
|
|
95a91682c3 | ||
|
|
999e556be4 | ||
|
|
8b6293f6bf | ||
|
|
e33031b850 | ||
|
|
c5e7245096 | ||
|
|
65a0672791 | ||
|
|
e22ab10991 | ||
|
|
be900f1253 | ||
|
|
68c4286026 | ||
|
|
7dc9dd6fdf | ||
|
|
ed18222365 | ||
|
|
3e19bf88d5 | ||
|
|
ba23025cd8 | ||
|
|
7c3a39f400 | ||
|
|
e72723dc5c | ||
|
|
66520be7a7 | ||
|
|
82a63a03c0 | ||
|
|
8d9814a521 | ||
|
|
0ff2deab5d | ||
|
|
8e12053e03 | ||
|
|
e4389d8dc2 | ||
|
|
49e6121347 | ||
|
|
4ea7b36447 | ||
|
|
93bedd7aba | ||
|
|
b78896b9aa | ||
|
|
e10d14004f | ||
|
|
c2e77e2f17 | ||
|
|
9fd855ed47 | ||
|
|
b8ae4a8c09 | ||
|
|
e5aed6be7a | ||
|
|
b922f8d459 | ||
|
|
35e9662767 | ||
|
|
cb1d25fcfa | ||
|
|
2b7fc0506a | ||
|
|
af942a693b | ||
|
|
26de9e247a | ||
|
|
b530c0281b | ||
|
|
e70cb4e6c7 | ||
|
|
d89602a53f | ||
|
|
3bd9042054 | ||
|
|
525063be90 | ||
|
|
c1282b57f5 | ||
|
|
5ba69e1734 | ||
|
|
c96cbe481c | ||
|
|
a7db4feceb | ||
|
|
b86c3b7a68 | ||
|
|
475306b757 | ||
|
|
f016934184 | ||
|
|
2174f6646e | ||
|
|
16170678a7 | ||
|
|
2806adee2d | ||
|
|
ec38505720 | ||
|
|
d2d58dd6a8 | ||
|
|
b2a39c5767 | ||
|
|
679f526d89 | ||
|
|
2e472fe7ea | ||
|
|
88dafe564f | ||
|
|
8d9479910f | ||
|
|
9847086466 | ||
|
|
40861761c2 | ||
|
|
88378ed058 | ||
|
|
8569227473 | ||
|
|
f4ca41ad75 | ||
|
|
376051a9be | ||
|
|
a5071e010b | ||
|
|
28d8149c69 | ||
|
|
e9f7db3045 | ||
|
|
aba19334ea | ||
|
|
f3be138eb8 | ||
|
|
bc05893f82 | ||
|
|
dd8ae61643 | ||
|
|
ee98d26218 | ||
|
|
886386c039 | ||
|
|
438ab7c115 | ||
|
|
52c7ff1d81 | ||
|
|
ff499ef79f | ||
|
|
37a61720b6 | ||
|
|
7d42aa1513 | ||
|
|
6e9671a8a8 | ||
|
|
52a6c37558 | ||
|
|
075fed91bd | ||
|
|
30f93a29c2 | ||
|
|
4cf131a101 | ||
|
|
7286f5291d | ||
|
|
07fce8eff2 | ||
|
|
176606d0cb | ||
|
|
8ae309ebac | ||
|
|
841ab487f8 | ||
|
|
61ebe3b0c4 | ||
|
|
ca9635df33 | ||
|
|
8a4dc79e1a | ||
|
|
d78e8dab93 | ||
|
|
24823ba647 | ||
|
|
d47393bd82 | ||
|
|
387828a3f7 | ||
|
|
c4a83bd6f6 | ||
|
|
827c71dac9 | ||
|
|
2acb5bd992 | ||
|
|
c8fa3e21e6 | ||
|
|
57a65fe436 | ||
|
|
c90768c93b | ||
|
|
29397d29ba | ||
|
|
fc04750817 | ||
|
|
458e563cd9 | ||
|
|
71aac7a5fb | ||
|
|
09c6c4ff02 | ||
|
|
eb9e754b3a | ||
|
|
a40d397d5d | ||
|
|
7edd10e5fa | ||
|
|
d75d876edd | ||
|
|
e44276989f | ||
|
|
3560e680bc | ||
|
|
faa9c6909d | ||
|
|
ace010b38a | ||
|
|
be4614eb5e | ||
|
|
35a1b77da5 | ||
|
|
46965a096c | ||
|
|
700c25f5b4 | ||
|
|
631a9f60f3 | ||
|
|
ed9f3243f0 | ||
|
|
ade21a965f | ||
|
|
f0cfd361bd | ||
|
|
78623c95f2 | ||
|
|
f0e2e4311b | ||
|
|
3dc4bd8581 | ||
|
|
1d1cd32bc3 | ||
|
|
868f8745fa | ||
|
|
2a9c3589d9 | ||
|
|
5235cc987d | ||
|
|
3b1e56a427 | ||
|
|
3fbccb01dc | ||
|
|
ad31ec5c5f | ||
|
|
15cf8f8531 | ||
|
|
ade40741ca | ||
|
|
ea19e9c6aa | ||
|
|
d33dfe5cb2 | ||
|
|
27d5f5c237 | ||
|
|
df22fb322e | ||
|
|
c3cd1f1814 | ||
|
|
dd517c6404 | ||
|
|
83564ea5f3 | ||
|
|
bbe0079d98 | ||
|
|
730663649f | ||
|
|
1369c545ac | ||
|
|
4db7a1c3bb | ||
|
|
755722ced6 | ||
|
|
1cf9335b24 | ||
|
|
13c11487f7 | ||
|
|
028ec7e744 | ||
|
|
54b3ceeca2 | ||
|
|
30a0c61de0 | ||
|
|
409a39ec8d | ||
|
|
296c5b645a | ||
|
|
cc9ab5f197 | ||
|
|
1551928502 | ||
|
|
b67b71cd87 | ||
|
|
7eb25ec7b3 | ||
|
|
539da24863 | ||
|
|
a8e4229852 | ||
|
|
cbe329b90a | ||
|
|
06dd735342 | ||
|
|
9ab29f8dcd | ||
|
|
ba426d6887 | ||
|
|
18cdc903cf | ||
|
|
fcf8368eb1 | ||
|
|
a678416994 | ||
|
|
122bc7770e | ||
|
|
e9e694f4ef | ||
|
|
da1091eed9 | ||
|
|
c2477a5cad | ||
|
|
2cf5f01397 | ||
|
|
38042ad4e9 | ||
|
|
51238c4bdb | ||
|
|
9481d06e62 | ||
|
|
a5cf4210cd | ||
|
|
f9aec02f3c | ||
|
|
7455b1b527 | ||
|
|
d4fb30885b | ||
|
|
d786c49525 | ||
|
|
5852f3eafe | ||
|
|
be0e1c7b14 | ||
|
|
7c1d481d6d | ||
|
|
518ec97114 | ||
|
|
32d80e2caf | ||
|
|
19147f326c | ||
|
|
2a59243cba | ||
|
|
4fc6b0ffa4 | ||
|
|
28c82bf18d | ||
|
|
7263e25d9b | ||
|
|
f695ca5884 | ||
|
|
93fedc12db | ||
|
|
1230853343 | ||
|
|
dce7a5732e | ||
|
|
c53f845ec9 | ||
|
|
84c2379285 | ||
|
|
3b908c4781 | ||
|
|
1802601a12 | ||
|
|
6de23bf36e | ||
|
|
aff659aaf7 | ||
|
|
05745e3f1d | ||
|
|
e8768ae08d | ||
|
|
f6fe39ff11 | ||
|
|
e204242118 | ||
|
|
2d609557ff | ||
|
|
e0bad5153b | ||
|
|
424c58f3e9 | ||
|
|
14dab319a8 | ||
|
|
5fcac7c846 | ||
|
|
2f917bff5c | ||
|
|
7db69e6a12 | ||
|
|
f7dc257a20 | ||
|
|
97db670956 | ||
|
|
51be857f3c | ||
|
|
0f8e4e0a81 | ||
|
|
6313223bcd | ||
|
|
3bc5679cab | ||
|
|
be49dabd0d | ||
|
|
ac968c36d7 | ||
|
|
0ad6c9e3d9 | ||
|
|
fff2e580cd | ||
|
|
7b4d62c794 | ||
|
|
76637c53c5 | ||
|
|
59073fa3eb | ||
|
|
808a03927c | ||
|
|
459957f30a | ||
|
|
b98d13fc3c | ||
|
|
4f3de09672 | ||
|
|
1fde8b868a | ||
|
|
66aeb89469 | ||
|
|
a5122d7f6c | ||
|
|
c0a3b76958 | ||
|
|
7e1d26dd5c | ||
|
|
5584ba36c6 | ||
|
|
75d382d3db | ||
|
|
febf8af4b5 | ||
|
|
10335f60f9 | ||
|
|
ecff9c1ef7 | ||
|
|
a247d0c74b | ||
|
|
341b4e09b7 | ||
|
|
f696796e88 | ||
|
|
413dbf8757 | ||
|
|
f553819502 | ||
|
|
34351b7a79 | ||
|
|
b061b6678f | ||
|
|
dcdcd48d8f | ||
|
|
87ef73329f | ||
|
|
05f7f0ade2 | ||
|
|
6311dabe68 | ||
|
|
bdebf198bb | ||
|
|
20de541b13 | ||
|
|
b31454e362 | ||
|
|
0be0775a76 | ||
|
|
6dfb8120c2 | ||
|
|
a7dde578a8 | ||
|
|
692be57738 | ||
|
|
d02bc873f8 | ||
|
|
8b24851b9d | ||
|
|
c328f9589d | ||
|
|
fde5b16817 | ||
|
|
45a9ade337 | ||
|
|
62b7c5eaed | ||
|
|
69014cd55b | ||
|
|
5a97dbf606 | ||
|
|
2838a916ab | ||
|
|
d2ba3b1ef7 | ||
|
|
d632d743e0 | ||
|
|
ddbbd36e4b | ||
|
|
c8ad7b7f84 |
4
.github/actions/do-build/action.yml
vendored
4
.github/actions/do-build/action.yml
vendored
@@ -66,7 +66,7 @@ runs:
|
||||
shell: bash
|
||||
|
||||
- name: 'Upload build logs'
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: failure-logs-${{ inputs.platform }}${{ inputs.debug-suffix }}
|
||||
path: failure-logs
|
||||
@@ -74,7 +74,7 @@ runs:
|
||||
|
||||
# This is the best way I found to abort the job with an error message
|
||||
- name: 'Notify about build failures'
|
||||
uses: actions/github-script@v6
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: core.setFailed('Build failed. See summary for details.')
|
||||
if: steps.check.outputs.failure == 'true'
|
||||
|
||||
2
.github/actions/get-bootjdk/action.yml
vendored
2
.github/actions/get-bootjdk/action.yml
vendored
@@ -65,7 +65,7 @@ runs:
|
||||
|
||||
- name: 'Check cache for BootJDK'
|
||||
id: get-cached-bootjdk
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: bootjdk/jdk
|
||||
key: boot-jdk-${{ inputs.platform }}-${{ steps.sha256.outputs.value }}
|
||||
|
||||
4
.github/actions/get-bundles/action.yml
vendored
4
.github/actions/get-bundles/action.yml
vendored
@@ -48,14 +48,14 @@ runs:
|
||||
steps:
|
||||
- name: 'Download bundles artifact'
|
||||
id: download-bundles
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: bundles-${{ inputs.platform }}${{ inputs.debug-suffix }}
|
||||
path: bundles
|
||||
continue-on-error: true
|
||||
|
||||
- name: 'Download bundles artifact (retry)'
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: bundles-${{ inputs.platform }}${{ inputs.debug-suffix }}
|
||||
path: bundles
|
||||
|
||||
2
.github/actions/get-jtreg/action.yml
vendored
2
.github/actions/get-jtreg/action.yml
vendored
@@ -41,7 +41,7 @@ runs:
|
||||
|
||||
- name: 'Check cache for JTReg'
|
||||
id: get-cached-jtreg
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: jtreg/installed
|
||||
key: jtreg-${{ steps.version.outputs.value }}
|
||||
|
||||
3
.github/actions/get-msys2/action.yml
vendored
3
.github/actions/get-msys2/action.yml
vendored
@@ -30,8 +30,7 @@ runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: 'Install MSYS2'
|
||||
# use a specific release of msys2/setup-msys2 to prevent jtreg build failures on newer release
|
||||
uses: msys2/setup-msys2@7efe20baefed56359985e327d329042cde2434ff
|
||||
uses: msys2/setup-msys2@v2.22.0
|
||||
with:
|
||||
install: 'autoconf tar unzip zip make'
|
||||
path-type: minimal
|
||||
|
||||
2
.github/actions/upload-bundles/action.yml
vendored
2
.github/actions/upload-bundles/action.yml
vendored
@@ -69,7 +69,7 @@ runs:
|
||||
shell: bash
|
||||
|
||||
- name: 'Upload bundles artifact'
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: bundles-${{ inputs.platform }}${{ inputs.debug-suffix }}
|
||||
path: bundles
|
||||
|
||||
18
.github/scripts/gen-test-results.sh
vendored
18
.github/scripts/gen-test-results.sh
vendored
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -44,8 +44,8 @@ for test in $failures $errors; do
|
||||
base_path="$(echo "$test" | tr '#' '_')"
|
||||
report_file="$report_dir/$base_path.jtr"
|
||||
hs_err_files=$(ls $report_dir/$base_path/hs_err*.log 2> /dev/null || true)
|
||||
replay_files=$(ls $report_dir/$base_path/replay*.log 2> /dev/null || true)
|
||||
echo "#### <a id="$anchor">$test"
|
||||
|
||||
echo '<details><summary>View test results</summary>'
|
||||
echo ''
|
||||
echo '```'
|
||||
@@ -73,6 +73,20 @@ for test in $failures $errors; do
|
||||
echo ''
|
||||
fi
|
||||
|
||||
if [[ "$replay_files" != "" ]]; then
|
||||
echo '<details><summary>View HotSpot replay file</summary>'
|
||||
echo ''
|
||||
for replay in $replay_files; do
|
||||
echo '```'
|
||||
echo "$replay:"
|
||||
echo ''
|
||||
cat "$replay"
|
||||
echo '```'
|
||||
done
|
||||
|
||||
echo '</details>'
|
||||
echo ''
|
||||
fi
|
||||
done >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# With many failures, the summary can easily exceed 1024 kB, the limit set by Github
|
||||
|
||||
1
.github/scripts/gen-test-summary.sh
vendored
1
.github/scripts/gen-test-summary.sh
vendored
@@ -42,6 +42,7 @@ error_count=$(echo $errors | wc -w || true)
|
||||
|
||||
if [[ "$failures" = "" && "$errors" = "" ]]; then
|
||||
# We know something went wrong, but not what
|
||||
echo 'failure=true' >> $GITHUB_OUTPUT
|
||||
echo 'error-message=Unspecified test suite failure. Please see log for job for details.' >> $GITHUB_OUTPUT
|
||||
exit 0
|
||||
fi
|
||||
|
||||
2
.github/workflows/build-cross-compile.yml
vendored
2
.github/workflows/build-cross-compile.yml
vendored
@@ -120,7 +120,7 @@ jobs:
|
||||
|
||||
- name: 'Check cache for sysroot'
|
||||
id: get-cached-sysroot
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: sysroot
|
||||
key: sysroot-${{ matrix.debian-arch }}-${{ hashFiles('./.github/workflows/build-cross-compile.yml') }}
|
||||
|
||||
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@@ -357,7 +357,7 @@ jobs:
|
||||
# Hack to get hold of the api environment variables that are only defined for actions
|
||||
- name: 'Get API configuration'
|
||||
id: api
|
||||
uses: actions/github-script@v6
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: 'return { url: process.env["ACTIONS_RUNTIME_URL"], token: process.env["ACTIONS_RUNTIME_TOKEN"] }'
|
||||
|
||||
|
||||
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@@ -206,7 +206,7 @@ jobs:
|
||||
if: always()
|
||||
|
||||
- name: 'Upload test results'
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: results
|
||||
name: ${{ steps.package.outputs.artifact-name }}
|
||||
@@ -214,7 +214,7 @@ jobs:
|
||||
|
||||
# This is the best way I found to abort the job with an error message
|
||||
- name: 'Notify about test failures'
|
||||
uses: actions/github-script@v6
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: core.setFailed('${{ steps.run-tests.outputs.error-message }}')
|
||||
if: steps.run-tests.outputs.failure == 'true'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright 2015 Google, Inc. All Rights Reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
@@ -26,12 +27,17 @@ usage() {
|
||||
echo "$0 DIR ..."
|
||||
echo "Modifies in place all the java source files found"
|
||||
echo "in the given directories so that all java language modifiers"
|
||||
echo "are in the canonical order given by Modifier#toString()."
|
||||
echo "are in the canonical order."
|
||||
echo "Tries to get it right even within javadoc comments,"
|
||||
echo "and even if the list of modifiers spans 2 lines."
|
||||
echo
|
||||
echo "See:"
|
||||
echo "https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Modifier.html#toString-int-"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html#jls-8.1.1"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html#jls-8.3.1"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html#jls-8.4.3"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html#jls-8.8.3"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-9.html#jls-9.1.1"
|
||||
echo "https://docs.oracle.com/javase/specs/jls/se21/html/jls-9.html#jls-9.4"
|
||||
echo
|
||||
echo "Example:"
|
||||
echo "$0 jdk/src/java.base jdk/test/java/{util,io,lang}"
|
||||
@@ -46,7 +52,7 @@ for dir in "${dirs[@]}"; do [[ -d "$dir" ]] || usage; done
|
||||
|
||||
declare -ar modifiers=(
|
||||
public protected private
|
||||
abstract static final transient
|
||||
abstract default static final sealed non-sealed transient
|
||||
volatile synchronized native strictfp
|
||||
)
|
||||
declare -r SAVE_IFS="$IFS"
|
||||
|
||||
@@ -753,6 +753,8 @@ macOS.</p>
|
||||
<code>sudo apt-get install libfontconfig-dev</code>.</li>
|
||||
<li>To install on an rpm-based Linux, try running
|
||||
<code>sudo yum install fontconfig-devel</code>.</li>
|
||||
<li>To install on Alpine Linux, try running
|
||||
<code>sudo apk add fontconfig-dev</code>.</li>
|
||||
</ul>
|
||||
<p>Use <code>--with-fontconfig-include=<path></code> and
|
||||
<code>--with-fontconfig=<path></code> if <code>configure</code>
|
||||
@@ -1499,9 +1501,7 @@ like this:</p>
|
||||
--resolve-deps \
|
||||
buster \
|
||||
~/sysroot-arm64 \
|
||||
https://httpredir.debian.org/debian/</code></pre>
|
||||
<p>If the target architecture is <code>riscv64</code>, the path should
|
||||
be <code>debian-ports</code> instead of <code>debian</code>.</p></li>
|
||||
https://httpredir.debian.org/debian/</code></pre></li>
|
||||
<li><p>To create an Ubuntu-based chroot:</p>
|
||||
<pre><code>sudo debootstrap \
|
||||
--arch=arm64 \
|
||||
|
||||
@@ -572,6 +572,7 @@ required on all platforms except Windows and macOS.
|
||||
libfontconfig-dev`.
|
||||
* To install on an rpm-based Linux, try running `sudo yum install
|
||||
fontconfig-devel`.
|
||||
* To install on Alpine Linux, try running `sudo apk add fontconfig-dev`.
|
||||
|
||||
Use `--with-fontconfig-include=<path>` and `--with-fontconfig=<path>` if
|
||||
`configure` does not automatically locate the platform Fontconfig files.
|
||||
@@ -1316,9 +1317,6 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
|
||||
https://httpredir.debian.org/debian/
|
||||
```
|
||||
|
||||
If the target architecture is `riscv64`, the path should be `debian-ports`
|
||||
instead of `debian`.
|
||||
|
||||
* To create an Ubuntu-based chroot:
|
||||
|
||||
```
|
||||
|
||||
@@ -139,11 +139,6 @@ ifeq ($(IS_DRAFT), true)
|
||||
endif
|
||||
DRAFT_TEXT := This specification is not final and is subject to change. \
|
||||
Use is subject to <a href="$(LICENSE_URL)">license terms</a>.
|
||||
|
||||
# Workaround stylesheet bug
|
||||
HEADER_STYLE := style="margin-top: 9px;"
|
||||
else
|
||||
HEADER_STYLE := style="margin-top: 14px;"
|
||||
endif
|
||||
|
||||
# $1 - Relative prefix to COPYRIGHT_URL
|
||||
@@ -339,7 +334,7 @@ define SetupApiDocsGenerationBody
|
||||
$1_DOC_TITLE := $$($1_LONG_NAME)<br>Version $$(VERSION_SPECIFICATION) API \
|
||||
Specification
|
||||
$1_WINDOW_TITLE := $$(subst &,&,$$($1_SHORT_NAME))$$(DRAFT_MARKER_TITLE)
|
||||
$1_HEADER_TITLE := <div $$(HEADER_STYLE)><strong>$$($1_SHORT_NAME)</strong> \
|
||||
$1_HEADER_TITLE := <div><strong>$$($1_SHORT_NAME)</strong> \
|
||||
$$(DRAFT_MARKER_STR)</div>
|
||||
ifneq ($$($1_OTHER_VERSIONS), )
|
||||
$1_JAVADOC_BOTTOM := $$(call JAVADOC_BOTTOM, <a href="$$($1_OTHER_VERSIONS)">Other versions.</a>)
|
||||
@@ -647,7 +642,7 @@ ifeq ($(ENABLE_PANDOC), true)
|
||||
GLOBAL_SPECS_DEFAULT_CSS_FILE := $(DOCS_OUTPUTDIR)/resources/jdk-default.css
|
||||
# Unset the following to suppress the link to the tool guides
|
||||
NAV_LINK_GUIDES := --nav-link-guides
|
||||
HEADER_RIGHT_SIDE_INFO := <strong>$(subst &,&,$(JDK_SHORT_NAME))$(DRAFT_MARKER_STR)</strong>
|
||||
HEADER_RIGHT_SIDE_INFO := <strong>$(subst &,&,$(JDK_SHORT_NAME))</strong>$(DRAFT_MARKER_STR)
|
||||
|
||||
$(foreach m, $(ALL_MODULES), \
|
||||
$(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
|
||||
|
||||
@@ -969,20 +969,28 @@ else
|
||||
|
||||
jdk.jdeps-gendata: java
|
||||
|
||||
# The ct.sym generation uses all the moduleinfos as input
|
||||
jdk.compiler-gendata: $(GENSRC_MODULEINFO_TARGETS) $(JAVA_TARGETS)
|
||||
# jdk.compiler-gendata needs the BUILD_JDK. If the BUILD_JDK was supplied
|
||||
# externally, no extra prerequisites are needed.
|
||||
# jdk.compiler gendata generates ct.sym, which requires all generated
|
||||
# java source and compiled classes present.
|
||||
jdk.compiler-gendata: $(JAVA_TARGETS)
|
||||
|
||||
# jdk.javadoc gendata generates element-list, which requires all java sources
|
||||
# but not compiled classes.
|
||||
jdk.javadoc-gendata: $(GENSRC_TARGETS)
|
||||
|
||||
# ct.sym and element-list generation also needs the BUILD_JDK. If the
|
||||
# BUILD_JDK was supplied externally, no extra prerequisites are needed.
|
||||
ifeq ($(CREATE_BUILDJDK), true)
|
||||
ifneq ($(CREATING_BUILDJDK), true)
|
||||
# When cross compiling and an external BUILD_JDK wasn't supplied, it's
|
||||
# produced by the create-buildjdk target.
|
||||
jdk.compiler-gendata: create-buildjdk
|
||||
jdk.javadoc-gendata: create-buildjdk
|
||||
endif
|
||||
else ifeq ($(EXTERNAL_BUILDJDK), false)
|
||||
# When not cross compiling, the BUILD_JDK is the interim jdk image, and
|
||||
# the javac launcher is needed.
|
||||
jdk.compiler-gendata: jdk.compiler-launchers
|
||||
jdk.javadoc-gendata: jdk.compiler-launchers
|
||||
endif
|
||||
|
||||
# Declare dependencies between jmod targets.
|
||||
|
||||
@@ -620,11 +620,16 @@ define SetupRunMicroTestBody
|
||||
$1_MICRO_WARMUP_TIME := -w $$(MICRO_WARMUP_TIME)
|
||||
endif
|
||||
|
||||
# Microbenchmarks are executed from the root of the test image directory.
|
||||
# This enables JMH tests to add dependencies using relative paths such as
|
||||
# -Djava.library.path=micro/native
|
||||
|
||||
run-test-$1: pre-run-test
|
||||
$$(call LogWarn)
|
||||
$$(call LogWarn, Running test '$$($1_TEST)')
|
||||
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR))
|
||||
$$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/micro, ( \
|
||||
$$(CD) $$(TEST_IMAGE_DIR) && \
|
||||
$$(FIXPATH) $$($1_MICRO_TEST_JDK)/bin/java $$($1_MICRO_JAVA_OPTIONS) \
|
||||
-jar $$($1_MICRO_BENCHMARKS_JAR) \
|
||||
$$($1_MICRO_ITER) $$($1_MICRO_FORK) $$($1_MICRO_TIME) \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -117,6 +117,11 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
|
||||
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${DEBUG_PREFIX_CFLAGS}],
|
||||
IF_FALSE: [
|
||||
DEBUG_PREFIX_CFLAGS=
|
||||
],
|
||||
IF_TRUE: [
|
||||
# Add debug prefix map gcc system include paths, as they cause
|
||||
# non-deterministic debug paths depending on gcc path location.
|
||||
DEBUG_PREFIX_MAP_GCC_INCLUDE_PATHS
|
||||
]
|
||||
)
|
||||
fi
|
||||
@@ -158,6 +163,55 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
|
||||
AC_SUBST(ASFLAGS_DEBUG_SYMBOLS)
|
||||
])
|
||||
|
||||
# gcc will embed the full system include paths in the debug info
|
||||
# resulting in non-deterministic debug symbol files and thus
|
||||
# non-reproducible native libraries if gcc includes are located
|
||||
# in different paths.
|
||||
# Add -fdebug-prefix-map'ings for root and gcc include paths,
|
||||
# pointing to a common set of folders so that the binaries are deterministic:
|
||||
# root include : /usr/include
|
||||
# gcc include : /usr/local/gcc_include
|
||||
# g++ include : /usr/local/gxx_include
|
||||
AC_DEFUN([DEBUG_PREFIX_MAP_GCC_INCLUDE_PATHS],
|
||||
[
|
||||
# Determine gcc system include paths.
|
||||
# Assume default roots to start with:
|
||||
GCC_ROOT_INCLUDE="/usr/include"
|
||||
|
||||
# Determine is sysroot or devkit specified?
|
||||
if test "x$SYSROOT" != "x"; then
|
||||
GCC_ROOT_INCLUDE="${SYSROOT%/}/usr/include"
|
||||
fi
|
||||
|
||||
# Add root include mapping => /usr/include
|
||||
GCC_INCLUDE_DEBUG_MAP_FLAGS="-fdebug-prefix-map=${GCC_ROOT_INCLUDE}/=/usr/include/"
|
||||
|
||||
# Add gcc system include mapping => /usr/local/gcc_include
|
||||
# Find location of stddef.h using build C compiler
|
||||
GCC_SYSTEM_INCLUDE=`$ECHO "#include <stddef.h>" | \
|
||||
$CC $CFLAGS -v -E - 2>&1 | \
|
||||
$GREP stddef | $TAIL -1 | $TR -s " " | $CUT -d'"' -f2`
|
||||
if test "x$GCC_SYSTEM_INCLUDE" != "x"; then
|
||||
GCC_SYSTEM_INCLUDE=`$DIRNAME $GCC_SYSTEM_INCLUDE`
|
||||
GCC_INCLUDE_DEBUG_MAP_FLAGS="$GCC_INCLUDE_DEBUG_MAP_FLAGS \
|
||||
-fdebug-prefix-map=${GCC_SYSTEM_INCLUDE}/=/usr/local/gcc_include/"
|
||||
fi
|
||||
|
||||
# Add g++ system include mapping => /usr/local/gxx_include
|
||||
# Find location of cstddef using build C++ compiler
|
||||
GXX_SYSTEM_INCLUDE=`$ECHO "#include <cstddef>" | \
|
||||
$CXX $CXXFLAGS -v -E -x c++ - 2>&1 | \
|
||||
$GREP cstddef | $TAIL -1 | $TR -s " " | $CUT -d'"' -f2`
|
||||
if test "x$GXX_SYSTEM_INCLUDE" != "x"; then
|
||||
GXX_SYSTEM_INCLUDE=`$DIRNAME $GXX_SYSTEM_INCLUDE`
|
||||
GCC_INCLUDE_DEBUG_MAP_FLAGS="$GCC_INCLUDE_DEBUG_MAP_FLAGS \
|
||||
-fdebug-prefix-map=${GXX_SYSTEM_INCLUDE}/=/usr/local/gxx_include/"
|
||||
fi
|
||||
|
||||
# Add to debug prefix cflags
|
||||
DEBUG_PREFIX_CFLAGS="$DEBUG_PREFIX_CFLAGS $GCC_INCLUDE_DEBUG_MAP_FLAGS"
|
||||
])
|
||||
|
||||
AC_DEFUN([FLAGS_SETUP_WARNINGS],
|
||||
[
|
||||
# Set default value.
|
||||
@@ -425,7 +479,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
|
||||
[
|
||||
#### OS DEFINES, these should be independent on toolchain
|
||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||
CFLAGS_OS_DEF_JVM="-DLINUX"
|
||||
CFLAGS_OS_DEF_JVM="-DLINUX -D_FILE_OFFSET_BITS=64"
|
||||
CFLAGS_OS_DEF_JDK="-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
|
||||
elif test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||
CFLAGS_OS_DEF_JVM="-D_ALLBSD_SOURCE -D_DARWIN_C_SOURCE -D_XOPEN_SOURCE"
|
||||
|
||||
@@ -191,7 +191,7 @@ PRODUCT_NAME := @PRODUCT_NAME@
|
||||
PRODUCT_SUFFIX := @PRODUCT_SUFFIX@
|
||||
JDK_RC_PLATFORM_NAME := @JDK_RC_PLATFORM_NAME@
|
||||
JDK_RC_NAME := @JDK_RC_NAME@
|
||||
JDK_RC_COMPANY_NAME:=@JDK_RC_COMPANY_NAME@
|
||||
JDK_RC_COMPANY_NAME := @JDK_RC_COMPANY_NAME@
|
||||
COMPANY_NAME := @COMPANY_NAME@
|
||||
HOTSPOT_VM_DISTRO := @HOTSPOT_VM_DISTRO@
|
||||
MACOSX_BUNDLE_NAME_BASE := @MACOSX_BUNDLE_NAME_BASE@
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -389,6 +389,10 @@ AC_DEFUN_ONCE([TOOLCHAIN_POST_DETECTION],
|
||||
# This is necessary since AC_PROG_CC defaults CFLAGS to "-g -O2"
|
||||
CFLAGS="$ORG_CFLAGS"
|
||||
CXXFLAGS="$ORG_CXXFLAGS"
|
||||
|
||||
# filter out some unwanted additions autoconf may add to CXX; we saw this on macOS with autoconf 2.72
|
||||
UTIL_GET_NON_MATCHING_VALUES(cxx_filtered, $CXX, -std=c++11 -std=gnu++11)
|
||||
CXX="$cxx_filtered"
|
||||
])
|
||||
|
||||
# Check if a compiler is of the toolchain type we expect, and save the version
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -199,7 +199,7 @@ AC_DEFUN([UTIL_GET_NON_MATCHING_VALUES],
|
||||
if test -z "$legal_values"; then
|
||||
$1="$2"
|
||||
else
|
||||
result=`$GREP -Fvx "$legal_values" <<< "$values_to_check" | $GREP -v '^$'`
|
||||
result=`$GREP -Fvx -- "$legal_values" <<< "$values_to_check" | $GREP -v '^$'`
|
||||
$1=${result//$'\n'/ }
|
||||
fi
|
||||
])
|
||||
@@ -226,7 +226,7 @@ AC_DEFUN([UTIL_GET_MATCHING_VALUES],
|
||||
if test -z "$illegal_values"; then
|
||||
$1=""
|
||||
else
|
||||
result=`$GREP -Fx "$illegal_values" <<< "$values_to_check" | $GREP -v '^$'`
|
||||
result=`$GREP -Fx -- "$illegal_values" <<< "$values_to_check" | $GREP -v '^$'`
|
||||
$1=${result//$'\n'/ }
|
||||
fi
|
||||
])
|
||||
|
||||
@@ -223,6 +223,7 @@ JVM_VirtualThreadEnd
|
||||
JVM_VirtualThreadMount
|
||||
JVM_VirtualThreadUnmount
|
||||
JVM_VirtualThreadHideFrames
|
||||
JVM_VirtualThreadDisableSuspend
|
||||
|
||||
# Scoped values
|
||||
JVM_EnsureMaterializedForStackWalk_func
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -548,6 +548,7 @@ $(BUILDDIR)/$(gcc_ver)/Makefile \
|
||||
$(PATHPRE) $(ENVS) $(GCC_CFG) $(EXTRA_CFLAGS) \
|
||||
$(CONFIG) \
|
||||
--with-sysroot=$(SYSROOT) \
|
||||
--with-debug-prefix-map=$(OUTPUT_ROOT)=devkit \
|
||||
--enable-languages=c,c++ \
|
||||
--enable-shared \
|
||||
--disable-nls \
|
||||
|
||||
@@ -85,7 +85,7 @@ CFLAGS_VM_VERSION := \
|
||||
|
||||
DISABLED_WARNINGS_gcc := array-bounds comment delete-non-virtual-dtor \
|
||||
empty-body implicit-fallthrough int-in-bool-context \
|
||||
maybe-uninitialized missing-field-initializers parentheses \
|
||||
maybe-uninitialized missing-field-initializers \
|
||||
shift-negative-value unknown-pragmas
|
||||
|
||||
DISABLED_WARNINGS_clang := sometimes-uninitialized \
|
||||
|
||||
@@ -48,9 +48,6 @@ ifneq ($(FDLIBM_CFLAGS), )
|
||||
endif
|
||||
|
||||
ifeq ($(call isTargetOs, linux), true)
|
||||
BUILD_LIBJVM_ostream.cpp_CXXFLAGS := -D_FILE_OFFSET_BITS=64
|
||||
BUILD_LIBJVM_logFileOutput.cpp_CXXFLAGS := -D_FILE_OFFSET_BITS=64
|
||||
|
||||
BUILD_LIBJVM_sharedRuntimeTrig.cpp_CXXFLAGS := -DNO_PCH $(FDLIBM_CFLAGS) $(LIBJVM_FDLIBM_COPY_OPT_FLAG)
|
||||
BUILD_LIBJVM_sharedRuntimeTrans.cpp_CXXFLAGS := -DNO_PCH $(FDLIBM_CFLAGS) $(LIBJVM_FDLIBM_COPY_OPT_FLAG)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -1289,25 +1289,58 @@ public class CLDRConverter {
|
||||
*/
|
||||
private static void generateTZDBShortNamesMap() throws IOException {
|
||||
Files.walk(Path.of(tzDataDir), 1, FileVisitOption.FOLLOW_LINKS)
|
||||
.filter(p -> p.toFile().isFile())
|
||||
.filter(p -> p.toFile().isFile() && !p.endsWith("jdk11_backward"))
|
||||
.forEach(p -> {
|
||||
try {
|
||||
String zone = null;
|
||||
String rule = null;
|
||||
String format = null;
|
||||
boolean inVanguard = false;
|
||||
boolean inRearguard = false;
|
||||
for (var line : Files.readAllLines(p)) {
|
||||
if (line.contains("#STDOFF")) continue;
|
||||
// Interpret the line in rearguard mode so that STD/DST
|
||||
// correctly handles negative DST cases, such as "GMT/IST"
|
||||
// vs. "IST/GMT" case for Europe/Dublin
|
||||
if (inVanguard) {
|
||||
if (line.startsWith("# Rearguard")) {
|
||||
inVanguard = false;
|
||||
inRearguard = true;
|
||||
}
|
||||
continue;
|
||||
} else if (line.startsWith("# Vanguard")) {
|
||||
inVanguard = true;
|
||||
continue;
|
||||
}
|
||||
if (inRearguard) {
|
||||
if (line.startsWith("# End of rearguard")) {
|
||||
inRearguard = false;
|
||||
continue;
|
||||
} else {
|
||||
if (line.startsWith("#\t")) {
|
||||
line = line.substring(1); // omit #
|
||||
}
|
||||
}
|
||||
}
|
||||
if (line.isBlank() || line.matches("^[ \t]*#.*")) {
|
||||
// ignore blank/comment lines
|
||||
continue;
|
||||
}
|
||||
// remove comments in-line
|
||||
line = line.replaceAll("[ \t]*#.*", "");
|
||||
|
||||
// Zone line
|
||||
if (line.startsWith("Zone")) {
|
||||
if (zone != null) {
|
||||
tzdbShortNamesMap.put(zone, format + NBSP + rule);
|
||||
}
|
||||
var zl = line.split("[ \t]+", -1);
|
||||
zone = zl[1];
|
||||
rule = zl[3];
|
||||
format = zl[4];
|
||||
} else {
|
||||
if (zone != null) {
|
||||
if (line.isBlank()) {
|
||||
if (line.startsWith("Rule") ||
|
||||
line.startsWith("Link")) {
|
||||
tzdbShortNamesMap.put(zone, format + NBSP + rule);
|
||||
zone = null;
|
||||
rule = null;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -32,6 +32,7 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
@@ -339,9 +340,15 @@ public class GenerateCurrencyData {
|
||||
validCurrencyCodes.substring(i * 7 + 3, i * 7 + 6));
|
||||
checkCurrencyCode(currencyCode);
|
||||
int tableEntry = mainTable[(currencyCode.charAt(0) - 'A') * A_TO_Z + (currencyCode.charAt(1) - 'A')];
|
||||
if (tableEntry == INVALID_COUNTRY_ENTRY ||
|
||||
(tableEntry & SPECIAL_CASE_COUNTRY_MASK) != 0 ||
|
||||
(tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK) != (currencyCode.charAt(2) - 'A')) {
|
||||
|
||||
// Do not allow a future currency to be classified as an otherCurrency,
|
||||
// otherwise it will leak out into Currency:getAvailableCurrencies
|
||||
boolean futureCurrency = Arrays.asList(specialCaseNewCurrencies).contains(currencyCode);
|
||||
boolean simpleCurrency = (tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK) == (currencyCode.charAt(2) - 'A');
|
||||
|
||||
// If neither a simple currency, or one defined in the future
|
||||
// then the current currency is applicable to be added to the otherTable
|
||||
if (!futureCurrency && !simpleCurrency) {
|
||||
if (otherCurrenciesCount == maxOtherCurrencies) {
|
||||
throw new RuntimeException("too many other currencies");
|
||||
}
|
||||
|
||||
@@ -37,7 +37,8 @@ EXCLUDE_FILES += \
|
||||
|
||||
EXCLUDES += java/lang/doc-files \
|
||||
java/lang/classfile/snippet-files \
|
||||
java/lang/classfile/components/snippet-files
|
||||
java/lang/classfile/components/snippet-files \
|
||||
java/lang/foreign/snippet-files
|
||||
|
||||
# Exclude BreakIterator classes that are just used in compile process to generate
|
||||
# data files and shouldn't go in the product
|
||||
|
||||
@@ -449,7 +449,6 @@ else
|
||||
LIBFREETYPE_LIBS := -lfreetype
|
||||
endif
|
||||
|
||||
# gcc_ftobjs.c := maybe-uninitialized required for GCC 7 builds.
|
||||
$(eval $(call SetupJdkLibrary, BUILD_LIBFREETYPE, \
|
||||
NAME := freetype, \
|
||||
OPTIMIZATION := HIGHEST, \
|
||||
@@ -458,7 +457,6 @@ else
|
||||
EXTRA_HEADER_DIRS := $(BUILD_LIBFREETYPE_HEADER_DIRS), \
|
||||
DISABLED_WARNINGS_microsoft := 4267 4244 4996, \
|
||||
DISABLED_WARNINGS_gcc := dangling-pointer stringop-overflow, \
|
||||
DISABLED_WARNINGS_gcc_ftobjs.c := maybe-uninitialized, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -47,7 +47,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBINSTRUMENT, \
|
||||
LDFLAGS_macosx := -L$(call FindLibDirForModule, java.base), \
|
||||
LDFLAGS_aix := -L$(SUPPORT_OUTPUTDIR)/native/java.base, \
|
||||
LIBS := $(JDKLIB_LIBS), \
|
||||
LIBS_unix := -ljava -ljvm $(LIBZ_LIBS), \
|
||||
LIBS_unix := $(LIBZ_LIBS), \
|
||||
LIBS_linux := -ljli $(LIBDL), \
|
||||
LIBS_aix := -liconv -ljli_static $(LIBDL), \
|
||||
LIBS_macosx := -ljli -liconv -framework Cocoa -framework Security \
|
||||
|
||||
@@ -107,6 +107,7 @@ $(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
|
||||
--add-exports java.base/sun.invoke.util=ALL-UNNAMED \
|
||||
--add-exports java.base/sun.security.util=ALL-UNNAMED \
|
||||
--enable-preview \
|
||||
-XDsuppressNotes \
|
||||
-processor org.openjdk.jmh.generators.BenchmarkProcessor, \
|
||||
JAVA_FLAGS := \
|
||||
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -45,6 +45,10 @@ BUILD_LIBTEST_OUTPUT_DIR := $(OUTPUTDIR)/support/test/lib/native
|
||||
|
||||
BUILD_LIBTEST_IMAGE_DIR := $(TEST_IMAGE_DIR)/lib
|
||||
|
||||
ifeq ($(call isTargetOs, windows), false)
|
||||
BUILD_LIBTEST_LIBRARIES_EXCLUDE += libFileUtils.c
|
||||
endif
|
||||
|
||||
# This evaluation is expensive and should only be done if this target was
|
||||
# explicitly called.
|
||||
ifneq ($(filter build-test-lib-native, $(MAKECMDGOALS)), )
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -857,6 +857,11 @@ else
|
||||
exeinvoke.c exestack-gap.c exestack-tls.c libAsyncGetCallTraceTest.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(call And, $(call isTargetOs, linux) $(call isTargetCpu, aarch64)), false)
|
||||
BUILD_HOTSPOT_JTREG_EXCLUDE += libTestSVEWithJNI.c
|
||||
endif
|
||||
|
||||
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exesigtest := -ljvm
|
||||
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -1716,7 +1716,7 @@ public class Intro extends JPanel {
|
||||
this.beginning = beg;
|
||||
this.ending = end;
|
||||
fm = surf.getMetrics(font);
|
||||
java.util.Arrays.sort(members);
|
||||
Arrays.sort(members);
|
||||
cast.add("CONTRIBUTORS");
|
||||
cast.add(" ");
|
||||
cast.addAll(Arrays.asList(members));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2014, 2021, Red Hat, Inc. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
@@ -2377,7 +2377,7 @@ int Matcher::min_vector_size(const BasicType bt) {
|
||||
return MIN2(size, max_size);
|
||||
}
|
||||
|
||||
int Matcher::superword_max_vector_size(const BasicType bt) {
|
||||
int Matcher::max_vector_size_auto_vectorization(const BasicType bt) {
|
||||
return Matcher::max_vector_size(bt);
|
||||
}
|
||||
|
||||
@@ -8237,6 +8237,24 @@ instruct popCountL_mem(iRegINoSp dst, memory8 mem, vRegD tmp) %{
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
// ============================================================================
|
||||
// VerifyVectorAlignment Instruction
|
||||
|
||||
instruct verify_vector_alignment(iRegP addr, immL_positive_bitmaskI mask, rFlagsReg cr) %{
|
||||
match(Set addr (VerifyVectorAlignment addr mask));
|
||||
effect(KILL cr);
|
||||
format %{ "verify_vector_alignment $addr $mask \t! verify alignment" %}
|
||||
ins_encode %{
|
||||
Label Lskip;
|
||||
// check if masked bits of addr are zero
|
||||
__ tst($addr$$Register, $mask$$constant);
|
||||
__ br(Assembler::EQ, Lskip);
|
||||
__ stop("verify_vector_alignment found a misaligned vector memory access");
|
||||
__ bind(Lskip);
|
||||
%}
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
// ============================================================================
|
||||
// MemBar Instruction
|
||||
|
||||
@@ -8271,7 +8289,7 @@ instruct membar_acquire() %{
|
||||
ins_cost(VOLATILE_REF_COST);
|
||||
|
||||
format %{ "membar_acquire\n\t"
|
||||
"dmb ish" %}
|
||||
"dmb ishld" %}
|
||||
|
||||
ins_encode %{
|
||||
__ block_comment("membar_acquire");
|
||||
@@ -8325,11 +8343,12 @@ instruct membar_release() %{
|
||||
ins_cost(VOLATILE_REF_COST);
|
||||
|
||||
format %{ "membar_release\n\t"
|
||||
"dmb ish" %}
|
||||
"dmb ishst\n\tdmb ishld" %}
|
||||
|
||||
ins_encode %{
|
||||
__ block_comment("membar_release");
|
||||
__ membar(Assembler::LoadStore|Assembler::StoreStore);
|
||||
__ membar(Assembler::StoreStore);
|
||||
__ membar(Assembler::LoadStore);
|
||||
%}
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2020, 2023, Arm Limited. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
@@ -126,7 +126,7 @@ source %{
|
||||
}
|
||||
}
|
||||
|
||||
bool Matcher::match_rule_supported_superword(int opcode, int vlen, BasicType bt) {
|
||||
bool Matcher::match_rule_supported_auto_vectorization(int opcode, int vlen, BasicType bt) {
|
||||
if (UseSVE == 0) {
|
||||
// These operations are not profitable to be vectorized on NEON, because no direct
|
||||
// NEON instructions support them. But the match rule support for them is profitable for
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2020, 2023, Arm Limited. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
@@ -116,7 +116,7 @@ source %{
|
||||
}
|
||||
}
|
||||
|
||||
bool Matcher::match_rule_supported_superword(int opcode, int vlen, BasicType bt) {
|
||||
bool Matcher::match_rule_supported_auto_vectorization(int opcode, int vlen, BasicType bt) {
|
||||
if (UseSVE == 0) {
|
||||
// These operations are not profitable to be vectorized on NEON, because no direct
|
||||
// NEON instructions support them. But the match rule support for them is profitable for
|
||||
|
||||
@@ -187,6 +187,26 @@ void Address::lea(MacroAssembler *as, Register r) const {
|
||||
zrf(Rd, 0);
|
||||
}
|
||||
|
||||
// This encoding is similar (but not quite identical) to the encoding used
|
||||
// by literal ld/st. see JDK-8324123.
|
||||
// PRFM does not support writeback or pre/post index.
|
||||
void Assembler::prfm(const Address &adr, prfop pfop) {
|
||||
Address::mode mode = adr.getMode();
|
||||
// PRFM does not support pre/post index
|
||||
guarantee((mode != Address::pre) && (mode != Address::post), "prfm does not support pre/post indexing");
|
||||
if (mode == Address::literal) {
|
||||
starti;
|
||||
f(0b11, 31, 30), f(0b011, 29, 27), f(0b000, 26, 24);
|
||||
f(pfop, 4, 0);
|
||||
int64_t offset = (adr.target() - pc()) >> 2;
|
||||
sf(offset, 23, 5);
|
||||
} else {
|
||||
assert((mode == Address::base_plus_offset)
|
||||
|| (mode == Address::base_plus_offset_reg), "must be base_plus_offset/base_plus_offset_reg");
|
||||
ld_st2(as_Register(pfop), adr, 0b11, 0b10);
|
||||
}
|
||||
}
|
||||
|
||||
// An "all-purpose" add/subtract immediate, per ARM documentation:
|
||||
// A "programmer-friendly" assembler may accept a negative immediate
|
||||
// between -(2^24 -1) and -1 inclusive, causing it to convert a
|
||||
|
||||
@@ -797,6 +797,8 @@ public:
|
||||
|
||||
void adrp(Register Rd, const Address &dest, uint64_t &offset) = delete;
|
||||
|
||||
void prfm(const Address &adr, prfop pfop = PLDL1KEEP);
|
||||
|
||||
#undef INSN
|
||||
|
||||
void add_sub_immediate(Instruction_aarch64 ¤t_insn, Register Rd, Register Rn,
|
||||
@@ -1574,17 +1576,6 @@ public:
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, size, op) \
|
||||
void NAME(const Address &adr, prfop pfop = PLDL1KEEP) { \
|
||||
ld_st2(as_Register(pfop), adr, size, op); \
|
||||
}
|
||||
|
||||
INSN(prfm, 0b11, 0b10); // FIXME: PRFM should not be used with
|
||||
// writeback modes, but the assembler
|
||||
// doesn't enfore that.
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, size, op) \
|
||||
void NAME(FloatRegister Rt, const Address &adr) { \
|
||||
ld_st2(as_Register(Rt), adr, size, op, 1); \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -282,7 +282,8 @@ void LIR_Assembler::osr_entry() {
|
||||
__ bind(L);
|
||||
}
|
||||
#endif
|
||||
__ ldp(r19, r20, Address(OSR_buf, slot_offset));
|
||||
__ ldr(r19, Address(OSR_buf, slot_offset));
|
||||
__ ldr(r20, Address(OSR_buf, slot_offset + BytesPerWord));
|
||||
__ str(r19, frame_map()->address_for_monitor_lock(i));
|
||||
__ str(r20, frame_map()->address_for_monitor_object(i));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -831,18 +831,12 @@ void LIRGenerator::do_LibmIntrinsic(Intrinsic* x) {
|
||||
}
|
||||
break;
|
||||
case vmIntrinsics::_dlog:
|
||||
if (StubRoutines::dlog() != nullptr) {
|
||||
__ call_runtime_leaf(StubRoutines::dlog(), getThreadTemp(), result_reg, cc->args());
|
||||
} else {
|
||||
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog), getThreadTemp(), result_reg, cc->args());
|
||||
}
|
||||
// Math.log intrinsic is not implemented on AArch64 (see JDK-8210858),
|
||||
// but we can still call the shared runtime.
|
||||
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog), getThreadTemp(), result_reg, cc->args());
|
||||
break;
|
||||
case vmIntrinsics::_dlog10:
|
||||
if (StubRoutines::dlog10() != nullptr) {
|
||||
__ call_runtime_leaf(StubRoutines::dlog10(), getThreadTemp(), result_reg, cc->args());
|
||||
} else {
|
||||
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
|
||||
}
|
||||
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
|
||||
break;
|
||||
case vmIntrinsics::_dpow:
|
||||
if (StubRoutines::dpow() != nullptr) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -111,10 +111,10 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
|
||||
// Handle existing monitor.
|
||||
bind(object_has_monitor);
|
||||
|
||||
// The object's monitor m is unlocked iff m->owner == NULL,
|
||||
// The object's monitor m is unlocked iff m->owner == nullptr,
|
||||
// otherwise m->owner may contain a thread or a stack address.
|
||||
//
|
||||
// Try to CAS m->owner from NULL to current thread.
|
||||
// Try to CAS m->owner from null to current thread.
|
||||
add(tmp, disp_hdr, (in_bytes(ObjectMonitor::owner_offset())-markWord::monitor_value));
|
||||
cmpxchg(tmp, zr, rthread, Assembler::xword, /*acquire*/ true,
|
||||
/*release*/ true, /*weak*/ false, tmp3Reg); // Sets flags for result
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "code/compiledIC.hpp"
|
||||
#include "code/icBuffer.hpp"
|
||||
#include "code/nmethod.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "runtime/safepoint.hpp"
|
||||
@@ -90,9 +91,9 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
||||
address stub = find_stub();
|
||||
guarantee(stub != nullptr, "stub not found");
|
||||
|
||||
if (TraceICs) {
|
||||
{
|
||||
ResourceMark rm;
|
||||
tty->print_cr("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
log_trace(inlinecache)("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
p2i(instruction_address()),
|
||||
callee->name_and_sig_as_C_string());
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2023, Red Hat, Inc. All rights reserved.
|
||||
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -58,7 +58,7 @@ static char* reserve_at_eor_compatible_address(size_t size, bool aslr) {
|
||||
0x7ffc, 0x7ffe, 0x7fff
|
||||
};
|
||||
static constexpr int num_immediates = sizeof(immediates) / sizeof(immediates[0]);
|
||||
const int start_index = aslr ? os::random() : 0;
|
||||
const int start_index = aslr ? os::next_random((int)os::javaTimeNanos()) : 0;
|
||||
constexpr int max_tries = 64;
|
||||
for (int ntry = 0; result == nullptr && ntry < max_tries; ntry ++) {
|
||||
// As in os::attempt_reserve_memory_between, we alternate between higher and lower
|
||||
|
||||
@@ -156,8 +156,6 @@
|
||||
static void verify_deopt_original_pc( CompiledMethod* nm, intptr_t* unextended_sp);
|
||||
#endif
|
||||
|
||||
const ImmutableOopMap* get_oop_map() const;
|
||||
|
||||
public:
|
||||
// Constructors
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -195,7 +195,7 @@ inline bool frame::equal(frame other) const {
|
||||
&& unextended_sp() == other.unextended_sp()
|
||||
&& fp() == other.fp()
|
||||
&& pc() == other.pc();
|
||||
assert(!ret || ret && cb() == other.cb() && _deopt_state == other._deopt_state, "inconsistent construction");
|
||||
assert(!ret || (cb() == other.cb() && _deopt_state == other._deopt_state), "inconsistent construction");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -359,20 +359,6 @@ inline int frame::sender_sp_ret_address_offset() {
|
||||
return frame::sender_sp_offset - frame::return_addr_offset;
|
||||
}
|
||||
|
||||
inline const ImmutableOopMap* frame::get_oop_map() const {
|
||||
if (_cb == nullptr) return nullptr;
|
||||
if (_cb->oop_maps() != nullptr) {
|
||||
NativePostCallNop* nop = nativePostCallNop_at(_pc);
|
||||
if (nop != nullptr && nop->displacement() != 0) {
|
||||
int slot = ((nop->displacement() >> 24) & 0xff);
|
||||
return _cb->oop_map_for_slot(slot, _pc);
|
||||
}
|
||||
const ImmutableOopMap* oop_map = OopMapSet::find_map(this);
|
||||
return oop_map;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// frame::sender
|
||||
inline frame frame::sender(RegisterMap* map) const {
|
||||
|
||||
@@ -42,8 +42,12 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
|
||||
// and Operational Models for ARMv8"
|
||||
#define CPU_MULTI_COPY_ATOMIC
|
||||
|
||||
// The expected size in bytes of a cache line.
|
||||
#define DEFAULT_CACHE_LINE_SIZE 64
|
||||
|
||||
// The default padding size for data structures to avoid false sharing.
|
||||
#define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE
|
||||
|
||||
// According to the ARMv8 ARM, "Concurrent modification and execution
|
||||
// of instructions can lead to the resulting instruction performing
|
||||
// any behavior that can be achieved by executing any sequence of
|
||||
|
||||
@@ -127,6 +127,8 @@ define_pd_global(intx, InlineSmallCode, 1000);
|
||||
range(1, 99) \
|
||||
product(ccstr, UseBranchProtection, "none", \
|
||||
"Branch Protection to use: none, standard, pac-ret") \
|
||||
product(bool, AlwaysMergeDMB, false, DIAGNOSTIC, \
|
||||
"Always merge DMB instructions in code emission") \
|
||||
|
||||
// end of ARCH_FLAGS
|
||||
|
||||
|
||||
@@ -2066,14 +2066,21 @@ void MacroAssembler::membar(Membar_mask_bits order_constraint) {
|
||||
address last = code()->last_insn();
|
||||
if (last != nullptr && nativeInstruction_at(last)->is_Membar() && prev == last) {
|
||||
NativeMembar *bar = NativeMembar_at(prev);
|
||||
// We are merging two memory barrier instructions. On AArch64 we
|
||||
// can do this simply by ORing them together.
|
||||
bar->set_kind(bar->get_kind() | order_constraint);
|
||||
BLOCK_COMMENT("merged membar");
|
||||
} else {
|
||||
code()->set_last_insn(pc());
|
||||
dmb(Assembler::barrier(order_constraint));
|
||||
// Don't promote DMB ST|DMB LD to DMB (a full barrier) because
|
||||
// doing so would introduce a StoreLoad which the caller did not
|
||||
// intend
|
||||
if (AlwaysMergeDMB || bar->get_kind() == order_constraint
|
||||
|| bar->get_kind() == AnyAny
|
||||
|| order_constraint == AnyAny) {
|
||||
// We are merging two memory barrier instructions. On AArch64 we
|
||||
// can do this simply by ORing them together.
|
||||
bar->set_kind(bar->get_kind() | order_constraint);
|
||||
BLOCK_COMMENT("merged membar");
|
||||
return;
|
||||
}
|
||||
}
|
||||
code()->set_last_insn(pc());
|
||||
dmb(Assembler::barrier(order_constraint));
|
||||
}
|
||||
|
||||
bool MacroAssembler::try_merge_ldst(Register rt, const Address &adr, size_t size_in_bytes, bool is_store) {
|
||||
|
||||
@@ -1425,11 +1425,6 @@ public:
|
||||
FloatRegister vtmp2, FloatRegister vtmp3,
|
||||
FloatRegister vtmp4, FloatRegister vtmp5);
|
||||
|
||||
void fast_log(FloatRegister vtmp0, FloatRegister vtmp1, FloatRegister vtmp2,
|
||||
FloatRegister vtmp3, FloatRegister vtmp4, FloatRegister vtmp5,
|
||||
FloatRegister tmpC1, FloatRegister tmpC2, FloatRegister tmpC3,
|
||||
FloatRegister tmpC4, Register tmp1, Register tmp2,
|
||||
Register tmp3, Register tmp4, Register tmp5);
|
||||
void generate_dsin_dcos(bool isCos, address npio2_hw, address two_over_pi,
|
||||
address pio2, address dsin_coef, address dcos_coef);
|
||||
private:
|
||||
|
||||
@@ -1,366 +0,0 @@
|
||||
/* Copyright (c) 2018, Cavium. All rights reserved. (By BELLSOFT)
|
||||
* Copyright (c) 2016, 2021, Intel Corporation. All rights reserved.
|
||||
* Intel Math Library (LIBM) Source Code
|
||||
*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/assembler.hpp"
|
||||
#include "asm/assembler.inline.hpp"
|
||||
#include "macroAssembler_aarch64.hpp"
|
||||
|
||||
// Algorithm idea is taken from x86 hotspot intrinsic and adapted for AARCH64.
|
||||
//
|
||||
// For mathematical background please refer to the following literature:
|
||||
//
|
||||
// Tang, Ping-Tak Peter.
|
||||
// Table-driven implementation of the logarithm function
|
||||
// in IEEE floating-point arithmetic.
|
||||
// ACM Transactions on Mathematical Software (TOMS) 16, no. 4, 1990: 378-400.
|
||||
|
||||
/******************************************************************************/
|
||||
// ALGORITHM DESCRIPTION - LOG()
|
||||
// ---------------------
|
||||
//
|
||||
// x=2^k * mx, mx in [1,2)
|
||||
//
|
||||
// Get B~1/mx based on the output of frecpe instruction (B0)
|
||||
// B = int((B0*2^7+0.5))/2^7
|
||||
//
|
||||
// Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
|
||||
//
|
||||
// Result: k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6) and
|
||||
// p(r) is a degree 7 polynomial
|
||||
// -log(B) read from data table (high, low parts)
|
||||
// Result is formed from high and low parts
|
||||
//
|
||||
// Special cases:
|
||||
// 1. log(NaN) = quiet NaN
|
||||
// 2. log(+INF) = that INF
|
||||
// 3. log(0) = -INF
|
||||
// 4. log(1) = +0
|
||||
// 5. log(x) = NaN if x < -0, including -INF
|
||||
//
|
||||
/******************************************************************************/
|
||||
|
||||
// Table with p(r) polynomial coefficients
|
||||
// and table representation of logarithm values (hi and low parts)
|
||||
ATTRIBUTE_ALIGNED(64) juint _L_tbl[] =
|
||||
{
|
||||
// coefficients of p(r) polynomial:
|
||||
// _coeff[]
|
||||
0x00000000UL, 0xbfd00000UL, // C1_0 = -0.25
|
||||
0x92492492UL, 0x3fc24924UL, // C1_1 = 0.14285714285714285
|
||||
0x55555555UL, 0x3fd55555UL, // C2_0 = 0.3333333333333333
|
||||
0x3d6fb175UL, 0xbfc5555eUL, // C2_1 = -0.16666772842235003
|
||||
0x00000000UL, 0xbfe00000UL, // C3_0 = -0.5
|
||||
0x9999999aUL, 0x3fc99999UL, // C3_1 = 0.2
|
||||
// _log2[]
|
||||
0xfefa3800UL, 0x3fa62e42UL, // C4_0 = 0.043321698784993146
|
||||
0x93c76730UL, 0x3ceef357UL, // C4_1 = 3.436201886692732e-15
|
||||
// _L_tbl[] with logarithm values (hi and low parts)
|
||||
0xfefa3800UL, 0x3fe62e42UL, 0x93c76730UL, 0x3d2ef357UL, 0xaa241800UL,
|
||||
0x3fe5ee82UL, 0x0cda46beUL, 0x3d220238UL, 0x5c364800UL, 0x3fe5af40UL,
|
||||
0xac10c9fbUL, 0x3d2dfa63UL, 0x26bb8c00UL, 0x3fe5707aUL, 0xff3303ddUL,
|
||||
0x3d09980bUL, 0x26867800UL, 0x3fe5322eUL, 0x5d257531UL, 0x3d05ccc4UL,
|
||||
0x835a5000UL, 0x3fe4f45aUL, 0x6d93b8fbUL, 0xbd2e6c51UL, 0x6f970c00UL,
|
||||
0x3fe4b6fdUL, 0xed4c541cUL, 0x3cef7115UL, 0x27e8a400UL, 0x3fe47a15UL,
|
||||
0xf94d60aaUL, 0xbd22cb6aUL, 0xf2f92400UL, 0x3fe43d9fUL, 0x481051f7UL,
|
||||
0xbcfd984fUL, 0x2125cc00UL, 0x3fe4019cUL, 0x30f0c74cUL, 0xbd26ce79UL,
|
||||
0x0c36c000UL, 0x3fe3c608UL, 0x7cfe13c2UL, 0xbd02b736UL, 0x17197800UL,
|
||||
0x3fe38ae2UL, 0xbb5569a4UL, 0xbd218b7aUL, 0xad9d8c00UL, 0x3fe35028UL,
|
||||
0x9527e6acUL, 0x3d10b83fUL, 0x44340800UL, 0x3fe315daUL, 0xc5a0ed9cUL,
|
||||
0xbd274e93UL, 0x57b0e000UL, 0x3fe2dbf5UL, 0x07b9dc11UL, 0xbd17a6e5UL,
|
||||
0x6d0ec000UL, 0x3fe2a278UL, 0xe797882dUL, 0x3d206d2bUL, 0x1134dc00UL,
|
||||
0x3fe26962UL, 0x05226250UL, 0xbd0b61f1UL, 0xd8bebc00UL, 0x3fe230b0UL,
|
||||
0x6e48667bUL, 0x3d12fc06UL, 0x5fc61800UL, 0x3fe1f863UL, 0xc9fe81d3UL,
|
||||
0xbd2a7242UL, 0x49ae6000UL, 0x3fe1c078UL, 0xed70e667UL, 0x3cccacdeUL,
|
||||
0x40f23c00UL, 0x3fe188eeUL, 0xf8ab4650UL, 0x3d14cc4eUL, 0xf6f29800UL,
|
||||
0x3fe151c3UL, 0xa293ae49UL, 0xbd2edd97UL, 0x23c75c00UL, 0x3fe11af8UL,
|
||||
0xbb9ddcb2UL, 0xbd258647UL, 0x8611cc00UL, 0x3fe0e489UL, 0x07801742UL,
|
||||
0x3d1c2998UL, 0xe2d05400UL, 0x3fe0ae76UL, 0x887e7e27UL, 0x3d1f486bUL,
|
||||
0x0533c400UL, 0x3fe078bfUL, 0x41edf5fdUL, 0x3d268122UL, 0xbe760400UL,
|
||||
0x3fe04360UL, 0xe79539e0UL, 0xbd04c45fUL, 0xe5b20800UL, 0x3fe00e5aUL,
|
||||
0xb1727b1cUL, 0xbd053ba3UL, 0xaf7a4800UL, 0x3fdfb358UL, 0x3c164935UL,
|
||||
0x3d0085faUL, 0xee031800UL, 0x3fdf4aa7UL, 0x6f014a8bUL, 0x3d12cde5UL,
|
||||
0x56b41000UL, 0x3fdee2a1UL, 0x5a470251UL, 0x3d2f27f4UL, 0xc3ddb000UL,
|
||||
0x3fde7b42UL, 0x5372bd08UL, 0xbd246550UL, 0x1a272800UL, 0x3fde148aUL,
|
||||
0x07322938UL, 0xbd1326b2UL, 0x484c9800UL, 0x3fddae75UL, 0x60dc616aUL,
|
||||
0xbd1ea42dUL, 0x46def800UL, 0x3fdd4902UL, 0xe9a767a8UL, 0x3d235bafUL,
|
||||
0x18064800UL, 0x3fdce42fUL, 0x3ec7a6b0UL, 0xbd0797c3UL, 0xc7455800UL,
|
||||
0x3fdc7ff9UL, 0xc15249aeUL, 0xbd29b6ddUL, 0x693fa000UL, 0x3fdc1c60UL,
|
||||
0x7fe8e180UL, 0x3d2cec80UL, 0x1b80e000UL, 0x3fdbb961UL, 0xf40a666dUL,
|
||||
0x3d27d85bUL, 0x04462800UL, 0x3fdb56faUL, 0x2d841995UL, 0x3d109525UL,
|
||||
0x5248d000UL, 0x3fdaf529UL, 0x52774458UL, 0xbd217cc5UL, 0x3c8ad800UL,
|
||||
0x3fda93edUL, 0xbea77a5dUL, 0x3d1e36f2UL, 0x0224f800UL, 0x3fda3344UL,
|
||||
0x7f9d79f5UL, 0x3d23c645UL, 0xea15f000UL, 0x3fd9d32bUL, 0x10d0c0b0UL,
|
||||
0xbd26279eUL, 0x43135800UL, 0x3fd973a3UL, 0xa502d9f0UL, 0xbd152313UL,
|
||||
0x635bf800UL, 0x3fd914a8UL, 0x2ee6307dUL, 0xbd1766b5UL, 0xa88b3000UL,
|
||||
0x3fd8b639UL, 0xe5e70470UL, 0xbd205ae1UL, 0x776dc800UL, 0x3fd85855UL,
|
||||
0x3333778aUL, 0x3d2fd56fUL, 0x3bd81800UL, 0x3fd7fafaUL, 0xc812566aUL,
|
||||
0xbd272090UL, 0x687cf800UL, 0x3fd79e26UL, 0x2efd1778UL, 0x3d29ec7dUL,
|
||||
0x76c67800UL, 0x3fd741d8UL, 0x49dc60b3UL, 0x3d2d8b09UL, 0xe6af1800UL,
|
||||
0x3fd6e60eUL, 0x7c222d87UL, 0x3d172165UL, 0x3e9c6800UL, 0x3fd68ac8UL,
|
||||
0x2756eba0UL, 0x3d20a0d3UL, 0x0b3ab000UL, 0x3fd63003UL, 0xe731ae00UL,
|
||||
0xbd2db623UL, 0xdf596000UL, 0x3fd5d5bdUL, 0x08a465dcUL, 0xbd0a0b2aUL,
|
||||
0x53c8d000UL, 0x3fd57bf7UL, 0xee5d40efUL, 0x3d1fadedUL, 0x0738a000UL,
|
||||
0x3fd522aeUL, 0x8164c759UL, 0x3d2ebe70UL, 0x9e173000UL, 0x3fd4c9e0UL,
|
||||
0x1b0ad8a4UL, 0xbd2e2089UL, 0xc271c800UL, 0x3fd4718dUL, 0x0967d675UL,
|
||||
0xbd2f27ceUL, 0x23d5e800UL, 0x3fd419b4UL, 0xec90e09dUL, 0x3d08e436UL,
|
||||
0x77333000UL, 0x3fd3c252UL, 0xb606bd5cUL, 0x3d183b54UL, 0x76be1000UL,
|
||||
0x3fd36b67UL, 0xb0f177c8UL, 0x3d116ecdUL, 0xe1d36000UL, 0x3fd314f1UL,
|
||||
0xd3213cb8UL, 0xbd28e27aUL, 0x7cdc9000UL, 0x3fd2bef0UL, 0x4a5004f4UL,
|
||||
0x3d2a9cfaUL, 0x1134d800UL, 0x3fd26962UL, 0xdf5bb3b6UL, 0x3d2c93c1UL,
|
||||
0x6d0eb800UL, 0x3fd21445UL, 0xba46baeaUL, 0x3d0a87deUL, 0x635a6800UL,
|
||||
0x3fd1bf99UL, 0x5147bdb7UL, 0x3d2ca6edUL, 0xcbacf800UL, 0x3fd16b5cUL,
|
||||
0xf7a51681UL, 0x3d2b9acdUL, 0x8227e800UL, 0x3fd1178eUL, 0x63a5f01cUL,
|
||||
0xbd2c210eUL, 0x67616000UL, 0x3fd0c42dUL, 0x163ceae9UL, 0x3d27188bUL,
|
||||
0x604d5800UL, 0x3fd07138UL, 0x16ed4e91UL, 0x3cf89cdbUL, 0x5626c800UL,
|
||||
0x3fd01eaeUL, 0x1485e94aUL, 0xbd16f08cUL, 0x6cb3b000UL, 0x3fcf991cUL,
|
||||
0xca0cdf30UL, 0x3d1bcbecUL, 0xe4dd0000UL, 0x3fcef5adUL, 0x65bb8e11UL,
|
||||
0xbcca2115UL, 0xffe71000UL, 0x3fce530eUL, 0x6041f430UL, 0x3cc21227UL,
|
||||
0xb0d49000UL, 0x3fcdb13dUL, 0xf715b035UL, 0xbd2aff2aUL, 0xf2656000UL,
|
||||
0x3fcd1037UL, 0x75b6f6e4UL, 0xbd084a7eUL, 0xc6f01000UL, 0x3fcc6ffbUL,
|
||||
0xc5962bd2UL, 0xbcf1ec72UL, 0x383be000UL, 0x3fcbd087UL, 0x595412b6UL,
|
||||
0xbd2d4bc4UL, 0x575bd000UL, 0x3fcb31d8UL, 0x4eace1aaUL, 0xbd0c358dUL,
|
||||
0x3c8ae000UL, 0x3fca93edUL, 0x50562169UL, 0xbd287243UL, 0x07089000UL,
|
||||
0x3fc9f6c4UL, 0x6865817aUL, 0x3d29904dUL, 0xdcf70000UL, 0x3fc95a5aUL,
|
||||
0x58a0ff6fUL, 0x3d07f228UL, 0xeb390000UL, 0x3fc8beafUL, 0xaae92cd1UL,
|
||||
0xbd073d54UL, 0x6551a000UL, 0x3fc823c1UL, 0x9a631e83UL, 0x3d1e0ddbUL,
|
||||
0x85445000UL, 0x3fc7898dUL, 0x70914305UL, 0xbd1c6610UL, 0x8b757000UL,
|
||||
0x3fc6f012UL, 0xe59c21e1UL, 0xbd25118dUL, 0xbe8c1000UL, 0x3fc6574eUL,
|
||||
0x2c3c2e78UL, 0x3d19cf8bUL, 0x6b544000UL, 0x3fc5bf40UL, 0xeb68981cUL,
|
||||
0xbd127023UL, 0xe4a1b000UL, 0x3fc527e5UL, 0xe5697dc7UL, 0x3d2633e8UL,
|
||||
0x8333b000UL, 0x3fc4913dUL, 0x54fdb678UL, 0x3d258379UL, 0xa5993000UL,
|
||||
0x3fc3fb45UL, 0x7e6a354dUL, 0xbd2cd1d8UL, 0xb0159000UL, 0x3fc365fcUL,
|
||||
0x234b7289UL, 0x3cc62fa8UL, 0x0c868000UL, 0x3fc2d161UL, 0xcb81b4a1UL,
|
||||
0x3d039d6cUL, 0x2a49c000UL, 0x3fc23d71UL, 0x8fd3df5cUL, 0x3d100d23UL,
|
||||
0x7e23f000UL, 0x3fc1aa2bUL, 0x44389934UL, 0x3d2ca78eUL, 0x8227e000UL,
|
||||
0x3fc1178eUL, 0xce2d07f2UL, 0x3d21ef78UL, 0xb59e4000UL, 0x3fc08598UL,
|
||||
0x7009902cUL, 0xbd27e5ddUL, 0x39dbe000UL, 0x3fbfe891UL, 0x4fa10afdUL,
|
||||
0xbd2534d6UL, 0x830a2000UL, 0x3fbec739UL, 0xafe645e0UL, 0xbd2dc068UL,
|
||||
0x63844000UL, 0x3fbda727UL, 0x1fa71733UL, 0x3d1a8940UL, 0x01bc4000UL,
|
||||
0x3fbc8858UL, 0xc65aacd3UL, 0x3d2646d1UL, 0x8dad6000UL, 0x3fbb6ac8UL,
|
||||
0x2bf768e5UL, 0xbd139080UL, 0x40b1c000UL, 0x3fba4e76UL, 0xb94407c8UL,
|
||||
0xbd0e42b6UL, 0x5d594000UL, 0x3fb9335eUL, 0x3abd47daUL, 0x3d23115cUL,
|
||||
0x2f40e000UL, 0x3fb8197eUL, 0xf96ffdf7UL, 0x3d0f80dcUL, 0x0aeac000UL,
|
||||
0x3fb700d3UL, 0xa99ded32UL, 0x3cec1e8dUL, 0x4d97a000UL, 0x3fb5e95aUL,
|
||||
0x3c5d1d1eUL, 0xbd2c6906UL, 0x5d208000UL, 0x3fb4d311UL, 0x82f4e1efUL,
|
||||
0xbcf53a25UL, 0xa7d1e000UL, 0x3fb3bdf5UL, 0xa5db4ed7UL, 0x3d2cc85eUL,
|
||||
0xa4472000UL, 0x3fb2aa04UL, 0xae9c697dUL, 0xbd20b6e8UL, 0xd1466000UL,
|
||||
0x3fb1973bUL, 0x560d9e9bUL, 0xbd25325dUL, 0xb59e4000UL, 0x3fb08598UL,
|
||||
0x7009902cUL, 0xbd17e5ddUL, 0xc006c000UL, 0x3faeea31UL, 0x4fc93b7bUL,
|
||||
0xbd0e113eUL, 0xcdddc000UL, 0x3faccb73UL, 0x47d82807UL, 0xbd1a68f2UL,
|
||||
0xd0fb0000UL, 0x3faaaef2UL, 0x353bb42eUL, 0x3d20fc1aUL, 0x149fc000UL,
|
||||
0x3fa894aaUL, 0xd05a267dUL, 0xbd197995UL, 0xf2d4c000UL, 0x3fa67c94UL,
|
||||
0xec19afa2UL, 0xbd029efbUL, 0xd42e0000UL, 0x3fa466aeUL, 0x75bdfd28UL,
|
||||
0xbd2c1673UL, 0x2f8d0000UL, 0x3fa252f3UL, 0xe021b67bUL, 0x3d283e9aUL,
|
||||
0x89e74000UL, 0x3fa0415dUL, 0x5cf1d753UL, 0x3d0111c0UL, 0xec148000UL,
|
||||
0x3f9c63d2UL, 0x3f9eb2f3UL, 0x3d2578c6UL, 0x28c90000UL, 0x3f984925UL,
|
||||
0x325a0c34UL, 0xbd2aa0baUL, 0x25980000UL, 0x3f9432a9UL, 0x928637feUL,
|
||||
0x3d098139UL, 0x58938000UL, 0x3f902056UL, 0x06e2f7d2UL, 0xbd23dc5bUL,
|
||||
0xa3890000UL, 0x3f882448UL, 0xda74f640UL, 0xbd275577UL, 0x75890000UL,
|
||||
0x3f801015UL, 0x999d2be8UL, 0xbd10c76bUL, 0x59580000UL, 0x3f700805UL,
|
||||
0xcb31c67bUL, 0x3d2166afUL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
|
||||
0x80000000UL
|
||||
};
|
||||
|
||||
// BEGIN dlog PSEUDO CODE:
|
||||
// double dlog(double X) {
|
||||
// // p(r) polynomial coefficients initialized from _L_tbl table
|
||||
// double C1_0 = _L_tbl[0];
|
||||
// double C1_1 = _L_tbl[1];
|
||||
// double C2_0 = _L_tbl[2];
|
||||
// double C2_1 = _L_tbl[3];
|
||||
// double C3_0 = _L_tbl[4];
|
||||
// double C3_1 = _L_tbl[5];
|
||||
// double C4_0 = _L_tbl[6];
|
||||
// double C4_1 = _L_tbl[7];
|
||||
// // NOTE: operations with coefficients above are mostly vectorized in assembly
|
||||
// // Check corner cases first
|
||||
// if (X == 1.0d || AS_LONG_BITS(X) + 0x0010000000000000 <= 0x0010000000000000) {
|
||||
// // NOTE: AS_LONG_BITS(X) + 0x0010000000000000 <= 0x0010000000000000 means
|
||||
// // that X < 0 or X >= 0x7FF0000000000000 (0x7FF* is NaN or INF)
|
||||
// if (X < 0 || X is NaN) return NaN;
|
||||
// if (X == 1.0d) return 0.0d;
|
||||
// if (X == 0.0d) return -INFINITY;
|
||||
// if (X is INFINITY) return INFINITY;
|
||||
// }
|
||||
// // double representation is 2^exponent * mantissa
|
||||
// // split X into two multipliers: 2^exponent and 1.0 * mantissa
|
||||
// // pseudo function: zeroExponent(X) return value of X with exponent == 0
|
||||
// float vtmp5 = 1/(float)(zeroExponent(X)); // reciprocal estimate
|
||||
// // pseudo function: HI16(X) returns high 16 bits of double value
|
||||
// int hiWord = HI16(X);
|
||||
// double vtmp1 = (double) 0x77F0 << 48 | mantissa(X);
|
||||
// hiWord -= 16;
|
||||
// if (AS_LONG_BITS(hiWord) > 0x8000) {
|
||||
// // SMALL_VALUE branch
|
||||
// vtmp0 = vtmp1 = vtmp0 * AS_DOUBLE_BITS(0x47F0000000000000);
|
||||
// hiWord = HI16(vtmp1);
|
||||
// vtmp0 = AS_DOUBLE_BITS(AS_LONG_BITS(vtmp0) |= 0x3FF0000000000000);
|
||||
// vtmp5 = (double) (1/(float)vtmp0);
|
||||
// vtmp1 <<= 12;
|
||||
// vtmp1 >>= 12;
|
||||
// }
|
||||
// // MAIN branch
|
||||
// double vtmp3 = AS_LONG_BITS(vtmp1) & 0xffffe00000000000; // hi part
|
||||
// int intB0 = AS_INT_BITS(vtmp5) + 0x8000;
|
||||
// double vtmp0 = AS_DOUBLE_BITS(0xffffe00000000000 & (intB0<<29));
|
||||
// int index = (intB0 >> 16) && 0xFF;
|
||||
// double hiTableValue = _L_tbl[8+index]; // vtmp2[0]
|
||||
// double lowTableValue = _L_tbl[16+index]; // vtmp2[1]
|
||||
// vtmp5 = AS_DOUBLE_BITS(hiWord & 0x7FF0 - 0x3FE0); // 0x3FE = 1023 << 4
|
||||
// vtmp1 -= vtmp3; // low part
|
||||
// vtmp3 = vtmp3*vtmp0 - 1.0;
|
||||
// hiTableValue += C4_0 * vtmp5;
|
||||
// lowTableValue += C4_1 * vtmp5;
|
||||
// double r = vtmp1 * vtmp0 + vtmp3; // r = B*mx-1.0, computed in hi and low parts
|
||||
// vtmp0 = hiTableValue + r;
|
||||
// hiTableValue -= vtmp0;
|
||||
// double r2 = r*r;
|
||||
// double r3 = r2*r;
|
||||
// double p7 = C3_0*r2 + C2_0*r3 + C1_0*r2*r2 + C3_1*r3*r2 + C2_1*r3*r3
|
||||
// + C1_1*r3*r2*r2; // degree 7 polynomial
|
||||
// return p7 + (vtmp0 + ((r + hiTableValue) + lowTableValue));
|
||||
// }
|
||||
//
|
||||
// END dlog PSEUDO CODE
|
||||
|
||||
|
||||
// Generate log(X). X passed in register v0. Return log(X) into v0.
|
||||
// Generator parameters: 10 temporary FPU registers and temporary general
|
||||
// purpose registers
|
||||
void MacroAssembler::fast_log(FloatRegister vtmp0, FloatRegister vtmp1,
|
||||
FloatRegister vtmp2, FloatRegister vtmp3,
|
||||
FloatRegister vtmp4, FloatRegister vtmp5,
|
||||
FloatRegister C1, FloatRegister C2,
|
||||
FloatRegister C3, FloatRegister C4,
|
||||
Register tmp1, Register tmp2, Register tmp3,
|
||||
Register tmp4, Register tmp5) {
|
||||
Label DONE, CHECK_CORNER_CASES, SMALL_VALUE, MAIN,
|
||||
CHECKED_CORNER_CASES, RETURN_MINF_OR_NAN;
|
||||
const int64_t INF_OR_NAN_PREFIX = 0x7FF0;
|
||||
const int64_t MINF_OR_MNAN_PREFIX = 0xFFF0;
|
||||
const int64_t ONE_PREFIX = 0x3FF0;
|
||||
movz(tmp2, ONE_PREFIX, 48);
|
||||
movz(tmp4, 0x0010, 48);
|
||||
fmovd(rscratch1, v0); // rscratch1 = AS_LONG_BITS(X)
|
||||
lea(rscratch2, ExternalAddress((address)_L_tbl));
|
||||
movz(tmp5, 0x7F);
|
||||
add(tmp1, rscratch1, tmp4);
|
||||
cmp(tmp2, rscratch1);
|
||||
lsr(tmp3, rscratch1, 29);
|
||||
ccmp(tmp1, tmp4, 0b1101 /* LE */, NE);
|
||||
bfm(tmp3, tmp5, 41, 8);
|
||||
fmovs(vtmp5, tmp3);
|
||||
// Load coefficients from table. All coefficients are organized to be
|
||||
// in specific order, because load below will load it in vectors to be used
|
||||
// later in vector instructions. Load will be performed in parallel while
|
||||
// branches are taken. C1 will contain vector of {C1_0, C1_1}, C2 =
|
||||
// {C2_0, C2_1}, C3 = {C3_0, C3_1}, C4 = {C4_0, C4_1}
|
||||
ld1(C1, C2, C3, C4, T2D, post(rscratch2, 64));
|
||||
br(LE, CHECK_CORNER_CASES);
|
||||
bind(CHECKED_CORNER_CASES);
|
||||
// all corner cases are handled
|
||||
frecpe(vtmp5, vtmp5, S); // vtmp5 ~= 1/vtmp5
|
||||
lsr(tmp2, rscratch1, 48);
|
||||
movz(tmp4, 0x77f0, 48);
|
||||
fmovd(vtmp4, 1.0);
|
||||
movz(tmp1, INF_OR_NAN_PREFIX, 48);
|
||||
bfm(tmp4, rscratch1, 0, 51); // tmp4 = 0x77F0 << 48 | mantissa(X)
|
||||
// vtmp1 = AS_DOUBLE_BITS(0x77F0 << 48 | mantissa(X)) == mx
|
||||
fmovd(vtmp1, tmp4);
|
||||
subw(tmp2, tmp2, 16);
|
||||
subs(zr, tmp2, 0x8000);
|
||||
br(GE, SMALL_VALUE);
|
||||
bind(MAIN);
|
||||
fmovs(tmp3, vtmp5); // int intB0 = AS_INT_BITS(B);
|
||||
mov(tmp5, 0x3FE0);
|
||||
uint64_t mask = UCONST64(0xffffe00000000000);
|
||||
mov(rscratch1, mask);
|
||||
andr(tmp2, tmp2, tmp1, LSR, 48); // hiWord & 0x7FF0
|
||||
sub(tmp2, tmp2, tmp5); // tmp2 = hiWord & 0x7FF0 - 0x3FE0
|
||||
scvtfwd(vtmp5, tmp2); // vtmp5 = (double)tmp2;
|
||||
addw(tmp3, tmp3, 0x8000); // tmp3 = B
|
||||
andr(tmp4, tmp4, rscratch1); // tmp4 == hi_part(mx)
|
||||
andr(rscratch1, rscratch1, tmp3, LSL, 29); // rscratch1 = hi_part(B)
|
||||
ubfm(tmp3, tmp3, 16, 23); // int index = (intB0 >> 16) && 0xFF
|
||||
ldrq(vtmp2, Address(rscratch2, tmp3, Address::lsl(4))); // vtmp2 = _L_tbl[index]
|
||||
// AS_LONG_BITS(vtmp1) & 0xffffe00000000000 // hi_part(mx)
|
||||
fmovd(vtmp3, tmp4);
|
||||
fmovd(vtmp0, rscratch1); // vtmp0 = hi_part(B)
|
||||
fsubd(vtmp1, vtmp1, vtmp3); // vtmp1 -= vtmp3; // low_part(mx)
|
||||
fnmsub(vtmp3, vtmp3, vtmp0, vtmp4); // vtmp3 = vtmp3*vtmp0 - vtmp4
|
||||
fmlavs(vtmp2, T2D, C4, vtmp5, 0); // vtmp2 += {C4} * vtmp5
|
||||
// vtmp1 = r = vtmp1 * vtmp0 + vtmp3 == low_part(mx) * hi_part(B) + (hi_part(mx)*hi_part(B) - 1.0)
|
||||
fmaddd(vtmp1, vtmp1, vtmp0, vtmp3);
|
||||
ins(vtmp5, D, vtmp2, 0, 1); // vtmp5 = vtmp2[1];
|
||||
faddd(vtmp0, vtmp2, vtmp1); // vtmp0 = vtmp2 + vtmp1
|
||||
fmlavs(C3, T2D, C2, vtmp1, 0); // {C3} += {C2}*vtmp1
|
||||
fsubd(vtmp2, vtmp2, vtmp0); // vtmp2 -= vtmp0
|
||||
fmuld(vtmp3, vtmp1, vtmp1); // vtmp3 = vtmp1*vtmp1
|
||||
faddd(C4, vtmp1, vtmp2); // C4[0] = vtmp1 + vtmp2
|
||||
fmlavs(C3, T2D, C1, vtmp3, 0); // {C3} += {C1}*vtmp3
|
||||
faddd(C4, C4, vtmp5); // C4 += vtmp5
|
||||
fmuld(vtmp4, vtmp3, vtmp1); // vtmp4 = vtmp3*vtmp1
|
||||
faddd(vtmp0, vtmp0, C4); // vtmp0 += C4
|
||||
fmlavs(C3, T2D, vtmp4, C3, 1); // {C3} += {vtmp4}*C3[1]
|
||||
fmaddd(vtmp0, C3, vtmp3, vtmp0); // vtmp0 = C3 * vtmp3 + vtmp0
|
||||
ret(lr);
|
||||
|
||||
block_comment("if (AS_LONG_BITS(hiWord) > 0x8000)"); {
|
||||
bind(SMALL_VALUE);
|
||||
movz(tmp2, 0x47F0, 48);
|
||||
fmovd(vtmp1, tmp2);
|
||||
fmuld(vtmp0, vtmp1, v0);
|
||||
fmovd(vtmp1, vtmp0);
|
||||
umov(tmp2, vtmp1, S, 3);
|
||||
orr(vtmp0, T16B, vtmp0, vtmp4);
|
||||
ushr(vtmp5, T2D, vtmp0, 27);
|
||||
ushr(vtmp5, T4S, vtmp5, 2);
|
||||
frecpe(vtmp5, vtmp5, S);
|
||||
shl(vtmp1, T2D, vtmp1, 12);
|
||||
ushr(vtmp1, T2D, vtmp1, 12);
|
||||
b(MAIN);
|
||||
}
|
||||
|
||||
block_comment("Corner cases"); {
|
||||
bind(RETURN_MINF_OR_NAN);
|
||||
movz(tmp1, MINF_OR_MNAN_PREFIX, 48);
|
||||
orr(rscratch1, rscratch1, tmp1);
|
||||
fmovd(v0, rscratch1);
|
||||
ret(lr);
|
||||
bind(CHECK_CORNER_CASES);
|
||||
movz(tmp1, INF_OR_NAN_PREFIX, 48);
|
||||
cmp(rscratch1, zr);
|
||||
br(LE, RETURN_MINF_OR_NAN);
|
||||
cmp(rscratch1, tmp1);
|
||||
br(GE, DONE);
|
||||
cmp(rscratch1, tmp2);
|
||||
br(NE, CHECKED_CORNER_CASES);
|
||||
fmovd(v0, 0.0);
|
||||
}
|
||||
bind(DONE);
|
||||
ret(lr);
|
||||
}
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "code/codeCache.hpp"
|
||||
#include "code/compiledIC.hpp"
|
||||
#include "gc/shared/collectedHeap.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "nativeInst_aarch64.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#include "runtime/handles.hpp"
|
||||
@@ -189,8 +188,6 @@ void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) {
|
||||
CompiledICLocker::is_safe(addr_at(0)),
|
||||
"concurrent code patching");
|
||||
|
||||
ResourceMark rm;
|
||||
int code_size = NativeInstruction::instruction_size;
|
||||
address addr_call = addr_at(0);
|
||||
bool reachable = Assembler::reachable_from_branch_at(addr_call, dest);
|
||||
assert(NativeCall::is_call_at(addr_call), "unexpected code at call site");
|
||||
@@ -560,18 +557,23 @@ static bool is_movk_to_zr(uint32_t insn) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void NativePostCallNop::patch(jint diff) {
|
||||
bool NativePostCallNop::patch(int32_t oopmap_slot, int32_t cb_offset) {
|
||||
if (((oopmap_slot & 0xff) != oopmap_slot) || ((cb_offset & 0xffffff) != cb_offset)) {
|
||||
return false; // cannot encode
|
||||
}
|
||||
uint32_t data = ((uint32_t)oopmap_slot << 24) | cb_offset;
|
||||
#ifdef ASSERT
|
||||
assert(diff != 0, "must be");
|
||||
assert(data != 0, "must be");
|
||||
uint32_t insn1 = uint_at(4);
|
||||
uint32_t insn2 = uint_at(8);
|
||||
assert (is_movk_to_zr(insn1) && is_movk_to_zr(insn2), "must be");
|
||||
#endif
|
||||
|
||||
uint32_t lo = diff & 0xffff;
|
||||
uint32_t hi = (uint32_t)diff >> 16;
|
||||
uint32_t lo = data & 0xffff;
|
||||
uint32_t hi = data >> 16;
|
||||
Instruction_aarch64::patch(addr_at(4), 20, 5, lo);
|
||||
Instruction_aarch64::patch(addr_at(8), 20, 5, hi);
|
||||
return true; // successfully encoded
|
||||
}
|
||||
|
||||
void NativeDeoptInstruction::verify() {
|
||||
|
||||
@@ -691,16 +691,20 @@ public:
|
||||
return (insns & 0xffe0001fffffffff) == 0xf280001fd503201f;
|
||||
}
|
||||
|
||||
jint displacement() const {
|
||||
bool decode(int32_t& oopmap_slot, int32_t& cb_offset) const {
|
||||
uint64_t movk_insns = *(uint64_t*)addr_at(4);
|
||||
uint32_t lo = (movk_insns >> 5) & 0xffff;
|
||||
uint32_t hi = (movk_insns >> (5 + 32)) & 0xffff;
|
||||
uint32_t result = (hi << 16) | lo;
|
||||
|
||||
return (jint)result;
|
||||
uint32_t data = (hi << 16) | lo;
|
||||
if (data == 0) {
|
||||
return false; // no information encoded
|
||||
}
|
||||
cb_offset = (data & 0xffffff);
|
||||
oopmap_slot = (data >> 24) & 0xff;
|
||||
return true; // decoding succeeded
|
||||
}
|
||||
|
||||
void patch(jint diff);
|
||||
bool patch(int32_t oopmap_slot, int32_t cb_offset);
|
||||
void make_deopt();
|
||||
};
|
||||
|
||||
|
||||
@@ -310,7 +310,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
|
||||
uint int_args = 0;
|
||||
uint fp_args = 0;
|
||||
uint stk_args = 0; // inc by 2 each time
|
||||
uint stk_args = 0;
|
||||
|
||||
for (int i = 0; i < total_args_passed; i++) {
|
||||
switch (sig_bt[i]) {
|
||||
@@ -322,8 +322,9 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
if (int_args < Argument::n_int_register_parameters_j) {
|
||||
regs[i].set1(INT_ArgReg[int_args++]->as_VMReg());
|
||||
} else {
|
||||
stk_args = align_up(stk_args, 2);
|
||||
regs[i].set1(VMRegImpl::stack2reg(stk_args));
|
||||
stk_args += 2;
|
||||
stk_args += 1;
|
||||
}
|
||||
break;
|
||||
case T_VOID:
|
||||
@@ -340,6 +341,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
if (int_args < Argument::n_int_register_parameters_j) {
|
||||
regs[i].set2(INT_ArgReg[int_args++]->as_VMReg());
|
||||
} else {
|
||||
stk_args = align_up(stk_args, 2);
|
||||
regs[i].set2(VMRegImpl::stack2reg(stk_args));
|
||||
stk_args += 2;
|
||||
}
|
||||
@@ -348,8 +350,9 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
if (fp_args < Argument::n_float_register_parameters_j) {
|
||||
regs[i].set1(FP_ArgReg[fp_args++]->as_VMReg());
|
||||
} else {
|
||||
stk_args = align_up(stk_args, 2);
|
||||
regs[i].set1(VMRegImpl::stack2reg(stk_args));
|
||||
stk_args += 2;
|
||||
stk_args += 1;
|
||||
}
|
||||
break;
|
||||
case T_DOUBLE:
|
||||
@@ -357,6 +360,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
if (fp_args < Argument::n_float_register_parameters_j) {
|
||||
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
|
||||
} else {
|
||||
stk_args = align_up(stk_args, 2);
|
||||
regs[i].set2(VMRegImpl::stack2reg(stk_args));
|
||||
stk_args += 2;
|
||||
}
|
||||
@@ -367,7 +371,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
}
|
||||
}
|
||||
|
||||
return align_up(stk_args, 2);
|
||||
return stk_args;
|
||||
}
|
||||
|
||||
// Patch the callers callsite with entry to compiled code if it exists.
|
||||
|
||||
@@ -5327,19 +5327,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
address generate_dlog() {
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "dlog");
|
||||
address entry = __ pc();
|
||||
FloatRegister vtmp0 = v0, vtmp1 = v1, vtmp2 = v2, vtmp3 = v3, vtmp4 = v4,
|
||||
vtmp5 = v5, tmpC1 = v16, tmpC2 = v17, tmpC3 = v18, tmpC4 = v19;
|
||||
Register tmp1 = r0, tmp2 = r1, tmp3 = r2, tmp4 = r3, tmp5 = r4;
|
||||
__ fast_log(vtmp0, vtmp1, vtmp2, vtmp3, vtmp4, vtmp5, tmpC1, tmpC2, tmpC3,
|
||||
tmpC4, tmp1, tmp2, tmp3, tmp4, tmp5);
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
// code for comparing 16 characters of strings with Latin1 and Utf16 encoding
|
||||
void compare_string_16_x_LU(Register tmpL, Register tmpU, Label &DIFF1,
|
||||
Label &DIFF2) {
|
||||
@@ -8333,11 +8320,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C();
|
||||
}
|
||||
|
||||
// Disabled until JDK-8210858 is fixed
|
||||
// if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dlog)) {
|
||||
// StubRoutines::_dlog = generate_dlog();
|
||||
// }
|
||||
|
||||
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dsin)) {
|
||||
StubRoutines::_dsin = generate_dsin_dcos(/* isCos = */ false);
|
||||
}
|
||||
|
||||
@@ -3603,11 +3603,9 @@ void TemplateTable::_new() {
|
||||
// get InstanceKlass
|
||||
__ load_resolved_klass_at_offset(r4, r3, r4, rscratch1);
|
||||
|
||||
// make sure klass is initialized & doesn't have finalizer
|
||||
// make sure klass is fully initialized
|
||||
__ ldrb(rscratch1, Address(r4, InstanceKlass::init_state_offset()));
|
||||
__ cmp(rscratch1, (u1)InstanceKlass::fully_initialized);
|
||||
__ br(Assembler::NE, slow_case);
|
||||
// make sure klass is initialized
|
||||
assert(VM_Version::supports_fast_class_init_checks(), "Optimization requires support for fast class initialization checks");
|
||||
__ clinit_barrier(r4, rscratch1, nullptr /*L_fast_path*/, &slow_case);
|
||||
|
||||
// get instance_size in InstanceKlass (scaled to a count of bytes)
|
||||
__ ldrw(r3,
|
||||
|
||||
@@ -183,6 +183,9 @@ void VM_Version::initialize() {
|
||||
if (FLAG_IS_DEFAULT(UseSIMDForMemoryOps)) {
|
||||
FLAG_SET_DEFAULT(UseSIMDForMemoryOps, true);
|
||||
}
|
||||
if (FLAG_IS_DEFAULT(AlwaysMergeDMB)) {
|
||||
FLAG_SET_DEFAULT(AlwaysMergeDMB, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Cortex A53
|
||||
|
||||
@@ -165,6 +165,7 @@ enum Ampere_CPU_Model {
|
||||
static int dcache_line_size() { return _dcache_line_size; }
|
||||
static int get_initial_sve_vector_length() { return _initial_sve_vector_length; };
|
||||
|
||||
// Aarch64 supports fast class initialization checks
|
||||
static bool supports_fast_class_init_checks() { return true; }
|
||||
constexpr static bool supports_stack_watermark_barrier() { return true; }
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
temp_reg, temp_reg2, itable_index, L_no_such_interface);
|
||||
|
||||
// Reduce "estimate" such that "padding" does not drop below 8.
|
||||
const ptrdiff_t estimate = 124;
|
||||
const ptrdiff_t estimate = 144;
|
||||
const ptrdiff_t codesize = __ pc() - start_pc;
|
||||
slop_delta = (int)(estimate - codesize);
|
||||
slop_bytes += slop_delta;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
@@ -1002,7 +1002,7 @@ bool Matcher::match_rule_supported(int opcode) {
|
||||
return true; // Per default match rules are supported.
|
||||
}
|
||||
|
||||
bool Matcher::match_rule_supported_superword(int opcode, int vlen, BasicType bt) {
|
||||
bool Matcher::match_rule_supported_auto_vectorization(int opcode, int vlen, BasicType bt) {
|
||||
return match_rule_supported_vector(opcode, vlen, bt);
|
||||
}
|
||||
|
||||
@@ -1074,7 +1074,7 @@ int Matcher::min_vector_size(const BasicType bt) {
|
||||
return 8/type2aelembytes(bt);
|
||||
}
|
||||
|
||||
int Matcher::superword_max_vector_size(const BasicType bt) {
|
||||
int Matcher::max_vector_size_auto_vectorization(const BasicType bt) {
|
||||
return Matcher::max_vector_size(bt);
|
||||
}
|
||||
|
||||
@@ -9193,7 +9193,7 @@ instruct clear_array(iRegX cnt, iRegP base, iRegI temp, iRegX zero, Universe dum
|
||||
ins_encode %{
|
||||
__ mov($zero$$Register, 0);
|
||||
__ mov($temp$$Register, $cnt$$Register);
|
||||
Label(loop);
|
||||
Label loop;
|
||||
__ bind(loop);
|
||||
__ subs($temp$$Register, $temp$$Register, 4);
|
||||
__ str($zero$$Register, Address($base$$Register, $temp$$Register), ge);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -175,7 +175,7 @@ class Address {
|
||||
if (_index == noreg) {
|
||||
assert(-256 < _disp && _disp < 256, "encoding constraint");
|
||||
return _mode | up(_disp) << 23 | 1 << 22 | _base->encoding() << 16 |
|
||||
(abs(_disp) & 0xf0) << 4 | abs(_disp) & 0x0f;
|
||||
(abs(_disp) & 0xf0) << 4 | (abs(_disp) & 0x0f);
|
||||
} else {
|
||||
assert(_index != PC && (_mode == basic_offset || _index != _base), "unpredictable instruction");
|
||||
assert(_disp == 0 && _shift == lsl && _shift_imm == 0, "encoding constraint");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -2640,8 +2640,8 @@ void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* arg
|
||||
|
||||
|
||||
void LIR_Assembler::volatile_move_op(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info) {
|
||||
assert(src->is_double_cpu() && dest->is_address() ||
|
||||
src->is_address() && dest->is_double_cpu(),
|
||||
assert((src->is_double_cpu() && dest->is_address()) ||
|
||||
(src->is_address() && dest->is_double_cpu()),
|
||||
"Simple move_op is called for all other cases");
|
||||
|
||||
int null_check_offset;
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "code/icBuffer.hpp"
|
||||
#include "code/nativeInst.hpp"
|
||||
#include "code/nmethod.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "runtime/safepoint.hpp"
|
||||
@@ -105,9 +106,9 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
||||
address stub = find_stub();
|
||||
guarantee(stub != nullptr, "stub not found");
|
||||
|
||||
if (TraceICs) {
|
||||
{
|
||||
ResourceMark rm;
|
||||
tty->print_cr("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
log_trace(inlinecache)("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
p2i(instruction_address()),
|
||||
callee->name_and_sig_as_C_string());
|
||||
}
|
||||
|
||||
@@ -99,8 +99,6 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
const ImmutableOopMap* get_oop_map() const;
|
||||
|
||||
public:
|
||||
// Constructors
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -93,7 +93,7 @@ inline bool frame::equal(frame other) const {
|
||||
&& unextended_sp() == other.unextended_sp()
|
||||
&& fp() == other.fp()
|
||||
&& pc() == other.pc();
|
||||
assert(!ret || ret && cb() == other.cb() && _deopt_state == other._deopt_state, "inconsistent construction");
|
||||
assert(!ret || (cb() == other.cb() && _deopt_state == other._deopt_state), "inconsistent construction");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -218,20 +218,6 @@ inline int frame::frame_size() const {
|
||||
return sender_sp() - sp();
|
||||
}
|
||||
|
||||
inline const ImmutableOopMap* frame::get_oop_map() const {
|
||||
if (_cb == nullptr) return nullptr;
|
||||
if (_cb->oop_maps() != nullptr) {
|
||||
NativePostCallNop* nop = nativePostCallNop_at(_pc);
|
||||
if (nop != nullptr && nop->displacement() != 0) {
|
||||
int slot = ((nop->displacement() >> 24) & 0xff);
|
||||
return _cb->oop_map_for_slot(slot, _pc);
|
||||
}
|
||||
const ImmutableOopMap* oop_map = OopMapSet::find_map(this);
|
||||
return oop_map;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
inline int frame::compiled_frame_stack_argsize() const {
|
||||
Unimplemented();
|
||||
return 0;
|
||||
|
||||
@@ -49,8 +49,12 @@ const bool HaveVFP = true;
|
||||
// arm32 is not specified as multi-copy-atomic
|
||||
// So we must not #define CPU_MULTI_COPY_ATOMIC
|
||||
|
||||
// The expected size in bytes of a cache line.
|
||||
#define DEFAULT_CACHE_LINE_SIZE 64
|
||||
|
||||
// The default padding size for data structures to avoid false sharing.
|
||||
#define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE
|
||||
|
||||
#define STUBROUTINES_MD_HPP "stubRoutines_arm.hpp"
|
||||
#define INTERP_MASM_MD_HPP "interp_masm_arm.hpp"
|
||||
#define TEMPLATETABLE_MD_HPP "templateTable_arm.hpp"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -162,7 +162,7 @@ void NativeMovConstReg::set_data(intptr_t x, address pc) {
|
||||
unsigned int hi = (unsigned int)(x >> 16);
|
||||
this->set_encoding((this->encoding() & 0xfff0f000) | (lo & 0xf000) << 4 | (lo & 0xfff));
|
||||
next->set_encoding((next->encoding() & 0xfff0f000) | (hi & 0xf000) << 4 | (hi & 0xfff));
|
||||
} else if (oop_addr == nullptr & metadata_addr == nullptr) {
|
||||
} else if (oop_addr == nullptr && metadata_addr == nullptr) {
|
||||
// A static ldr_literal (without oop or metadata relocation)
|
||||
assert(is_ldr_literal(), "must be");
|
||||
int offset = ldr_offset();
|
||||
@@ -341,10 +341,6 @@ void NativePostCallNop::make_deopt() {
|
||||
NativeDeoptInstruction::insert(addr_at(0));
|
||||
}
|
||||
|
||||
void NativePostCallNop::patch(jint diff) {
|
||||
// unsupported for now
|
||||
}
|
||||
|
||||
void NativeDeoptInstruction::verify() {
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -396,7 +396,7 @@ class NativeMovConstReg: public NativeInstruction {
|
||||
inline NativeMovConstReg* nativeMovConstReg_at(address address) {
|
||||
NativeInstruction* ni = nativeInstruction_at(address);
|
||||
assert(ni->is_ldr_literal() || ni->is_pc_rel() ||
|
||||
ni->is_movw() && VM_Version::supports_movw(), "must be");
|
||||
(ni->is_movw() && VM_Version::supports_movw()), "must be");
|
||||
return (NativeMovConstReg*)address;
|
||||
}
|
||||
|
||||
@@ -438,8 +438,8 @@ inline NativeCall* nativeCall_before(address return_address) {
|
||||
class NativePostCallNop: public NativeInstruction {
|
||||
public:
|
||||
bool check() const { return is_nop(); }
|
||||
int displacement() const { return 0; }
|
||||
void patch(jint diff);
|
||||
bool decode(int32_t& oopmap_slot, int32_t& cb_offset) const { return false; }
|
||||
bool patch(int32_t oopmap_slot, int32_t cb_offset) { return false; }
|
||||
void make_deopt();
|
||||
};
|
||||
|
||||
|
||||
@@ -441,7 +441,6 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
}
|
||||
}
|
||||
|
||||
if (slot & 1) slot++;
|
||||
return slot;
|
||||
}
|
||||
|
||||
|
||||
@@ -2862,6 +2862,7 @@ void LIR_Assembler::rt_call(LIR_Opr result, address dest,
|
||||
if (info != nullptr) {
|
||||
add_call_info_here(info);
|
||||
}
|
||||
assert(__ last_calls_return_pc() == __ pc(), "pcn not at return pc");
|
||||
__ post_call_nop();
|
||||
}
|
||||
|
||||
|
||||
@@ -167,9 +167,9 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
||||
address stub = find_stub();
|
||||
guarantee(stub != nullptr, "stub not found");
|
||||
|
||||
if (TraceICs) {
|
||||
{
|
||||
ResourceMark rm;
|
||||
tty->print_cr("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
log_trace(inlinecache)("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
p2i(instruction_address()),
|
||||
callee->name_and_sig_as_C_string());
|
||||
}
|
||||
|
||||
@@ -350,7 +350,7 @@ inline void Thaw<ConfigT>::patch_caller_links(intptr_t* sp, intptr_t* bottom) {
|
||||
if (is_entry_frame) {
|
||||
callers_sp = _cont.entryFP();
|
||||
} else {
|
||||
CodeBlob* cb = CodeCache::find_blob(pc);
|
||||
CodeBlob* cb = CodeCache::find_blob_fast(pc);
|
||||
callers_sp = sp + cb->frame_size();
|
||||
}
|
||||
// set the back link
|
||||
|
||||
@@ -136,7 +136,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
|
||||
// It should be safe to construct the sender though it might not be valid.
|
||||
|
||||
frame sender(sender_sp, sender_pc);
|
||||
frame sender(sender_sp, sender_pc, nullptr /* unextended_sp */, nullptr /* fp */, sender_blob);
|
||||
|
||||
// Do we have a valid fp?
|
||||
address sender_fp = (address) sender.fp();
|
||||
@@ -196,12 +196,12 @@ frame frame::sender_for_entry_frame(RegisterMap *map) const {
|
||||
assert(map->include_argument_oops(), "should be set by clear");
|
||||
|
||||
if (jfa->last_Java_pc() != nullptr) {
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_pc());
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_pc(), kind::code_blob);
|
||||
return fr;
|
||||
}
|
||||
// Last_java_pc is not set, if we come here from compiled code. The
|
||||
// constructor retrieves the PC from the stack.
|
||||
frame fr(jfa->last_Java_sp());
|
||||
frame fr(jfa->last_Java_sp(), nullptr, kind::code_blob);
|
||||
return fr;
|
||||
}
|
||||
|
||||
@@ -229,7 +229,7 @@ frame frame::sender_for_upcall_stub_frame(RegisterMap* map) const {
|
||||
assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
|
||||
map->clear();
|
||||
assert(map->include_argument_oops(), "should be set by clear");
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_pc());
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_pc(), kind::code_blob);
|
||||
|
||||
return fr;
|
||||
}
|
||||
@@ -451,7 +451,7 @@ intptr_t *frame::initial_deoptimization_info() {
|
||||
#ifndef PRODUCT
|
||||
// This is a generic constructor which is only used by pns() in debug.cpp.
|
||||
// fp is dropped and gets determined by backlink.
|
||||
frame::frame(void* sp, void* fp, void* pc) : frame((intptr_t*)sp, (address)pc) {}
|
||||
frame::frame(void* sp, void* fp, void* pc) : frame((intptr_t*)sp, (address)pc, kind::unknown) {}
|
||||
#endif
|
||||
|
||||
BasicObjectLock* frame::interpreter_frame_monitor_end() const {
|
||||
|
||||
@@ -393,18 +393,26 @@
|
||||
inline common_abi* own_abi() const { return (common_abi*) _sp; }
|
||||
inline common_abi* callers_abi() const { return (common_abi*) _fp; }
|
||||
|
||||
enum class kind {
|
||||
unknown, // The frame's pc is not necessarily in the CodeCache.
|
||||
// CodeCache::find_blob_fast(void* pc) can yield wrong results in this case and must not be used.
|
||||
code_blob, // The frame's pc is known to be in the CodeCache but it is likely not in an nmethod.
|
||||
// CodeCache::find_blob_fast() will be correct but not faster in this case.
|
||||
nmethod // This is likely the frame of a nmethod.
|
||||
// The code cache lookup is optimized based on NativePostCallNops.
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
// Initialize frame members (_pc and _sp must be given)
|
||||
inline void setup();
|
||||
inline void setup(kind knd);
|
||||
|
||||
public:
|
||||
|
||||
const ImmutableOopMap* get_oop_map() const;
|
||||
|
||||
// Constructors
|
||||
inline frame(intptr_t* sp, intptr_t* fp, address pc);
|
||||
inline frame(intptr_t* sp, address pc, intptr_t* unextended_sp = nullptr, intptr_t* fp = nullptr, CodeBlob* cb = nullptr);
|
||||
inline frame(intptr_t* sp, address pc, kind knd = kind::nmethod);
|
||||
inline frame(intptr_t* sp, address pc, intptr_t* unextended_sp, intptr_t* fp = nullptr, CodeBlob* cb = nullptr);
|
||||
inline frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map);
|
||||
inline frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map, bool on_heap);
|
||||
|
||||
|
||||
@@ -35,14 +35,14 @@
|
||||
// Inline functions for ppc64 frames:
|
||||
|
||||
// Initialize frame members (_sp must be given)
|
||||
inline void frame::setup() {
|
||||
inline void frame::setup(kind knd) {
|
||||
if (_pc == nullptr) {
|
||||
_pc = (address)own_abi()->lr;
|
||||
assert(_pc != nullptr, "must have PC");
|
||||
}
|
||||
|
||||
if (_cb == nullptr) {
|
||||
_cb = CodeCache::find_blob(_pc);
|
||||
_cb = (knd == kind::nmethod) ? CodeCache::find_blob_fast(_pc) : CodeCache::find_blob(_pc);
|
||||
}
|
||||
|
||||
if (_unextended_sp == nullptr) {
|
||||
@@ -78,8 +78,8 @@ inline void frame::setup() {
|
||||
// Continuation frames on the java heap are not aligned.
|
||||
// When thawing interpreted frames the sp can be unaligned (see new_stack_frame()).
|
||||
assert(_on_heap ||
|
||||
(is_aligned(_sp, alignment_in_bytes) || is_interpreted_frame()) &&
|
||||
(is_aligned(_fp, alignment_in_bytes) || !is_fully_initialized()),
|
||||
((is_aligned(_sp, alignment_in_bytes) || is_interpreted_frame()) &&
|
||||
(is_aligned(_fp, alignment_in_bytes) || !is_fully_initialized())),
|
||||
"invalid alignment sp:" PTR_FORMAT " unextended_sp:" PTR_FORMAT " fp:" PTR_FORMAT, p2i(_sp), p2i(_unextended_sp), p2i(_fp));
|
||||
}
|
||||
|
||||
@@ -89,21 +89,27 @@ inline void frame::setup() {
|
||||
inline frame::frame() : _sp(nullptr), _pc(nullptr), _cb(nullptr), _oop_map(nullptr), _deopt_state(unknown),
|
||||
_on_heap(false), DEBUG_ONLY(_frame_index(-1) COMMA) _unextended_sp(nullptr), _fp(nullptr) {}
|
||||
|
||||
inline frame::frame(intptr_t* sp) : frame(sp, nullptr) {}
|
||||
inline frame::frame(intptr_t* sp) : frame(sp, nullptr, kind::nmethod) {}
|
||||
|
||||
inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) : frame(sp, pc, nullptr, fp, nullptr) {}
|
||||
|
||||
inline frame::frame(intptr_t* sp, address pc, kind knd)
|
||||
: _sp(sp), _pc(pc), _cb(nullptr), _oop_map(nullptr),
|
||||
_on_heap(false), DEBUG_ONLY(_frame_index(-1) COMMA) _unextended_sp(sp), _fp(nullptr) {
|
||||
setup(knd);
|
||||
}
|
||||
|
||||
inline frame::frame(intptr_t* sp, address pc, intptr_t* unextended_sp, intptr_t* fp, CodeBlob* cb)
|
||||
: _sp(sp), _pc(pc), _cb(cb), _oop_map(nullptr),
|
||||
_on_heap(false), DEBUG_ONLY(_frame_index(-1) COMMA) _unextended_sp(unextended_sp), _fp(fp) {
|
||||
setup();
|
||||
setup(kind::nmethod);
|
||||
}
|
||||
|
||||
inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map)
|
||||
: _sp(sp), _pc(pc), _cb(cb), _oop_map(oop_map),
|
||||
_on_heap(false), DEBUG_ONLY(_frame_index(-1) COMMA) _unextended_sp(unextended_sp), _fp(fp) {
|
||||
assert(_cb != nullptr, "pc: " INTPTR_FORMAT, p2i(pc));
|
||||
setup();
|
||||
setup(kind::nmethod);
|
||||
}
|
||||
|
||||
inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb,
|
||||
@@ -113,7 +119,7 @@ inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address
|
||||
// In thaw, non-heap frames use this constructor to pass oop_map. I don't know why.
|
||||
assert(_on_heap || _cb != nullptr, "these frames are always heap frames");
|
||||
if (cb != nullptr) {
|
||||
setup();
|
||||
setup(kind::nmethod);
|
||||
}
|
||||
#ifdef ASSERT
|
||||
// The following assertion has been disabled because it would sometime trap for Continuation.run,
|
||||
@@ -300,7 +306,7 @@ inline frame frame::sender_raw(RegisterMap* map) const {
|
||||
|
||||
// Must be native-compiled frame, i.e. the marshaling code for native
|
||||
// methods that exists in the core system.
|
||||
return frame(sender_sp(), sender_pc());
|
||||
return frame(sender_sp(), sender_pc(), kind::code_blob);
|
||||
}
|
||||
|
||||
inline frame frame::sender(RegisterMap* map) const {
|
||||
@@ -361,20 +367,6 @@ inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {
|
||||
*result_adr = obj;
|
||||
}
|
||||
|
||||
inline const ImmutableOopMap* frame::get_oop_map() const {
|
||||
if (_cb == nullptr) return nullptr;
|
||||
if (_cb->oop_maps() != nullptr) {
|
||||
NativePostCallNop* nop = nativePostCallNop_at(_pc);
|
||||
if (nop != nullptr && nop->displacement() != 0) {
|
||||
int slot = ((nop->displacement() >> 24) & 0xff);
|
||||
return _cb->oop_map_for_slot(slot, _pc);
|
||||
}
|
||||
const ImmutableOopMap* oop_map = OopMapSet::find_map(this);
|
||||
return oop_map;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
inline int frame::compiled_frame_stack_argsize() const {
|
||||
assert(cb()->is_compiled(), "");
|
||||
return (cb()->as_compiled_method()->method()->num_stack_arg_slots() * VMRegImpl::stack_slot_size) >> LogBytesPerWord;
|
||||
|
||||
@@ -23,11 +23,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "gc/shared/gcArguments.hpp"
|
||||
#include "gc/shared/gc_globals.hpp"
|
||||
#include "macroAssembler_ppc.hpp"
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "gc/shared/gcArguments.hpp"
|
||||
#include "gc/shared/gc_globals.hpp"
|
||||
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
|
||||
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
|
||||
#include "gc/shenandoah/shenandoahForwarding.hpp"
|
||||
@@ -38,6 +37,7 @@
|
||||
#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
|
||||
#include "gc/shenandoah/heuristics/shenandoahHeuristics.hpp"
|
||||
#include "interpreter/interpreter.hpp"
|
||||
#include "macroAssembler_ppc.hpp"
|
||||
#include "runtime/javaThread.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
#include "asm/register.hpp"
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/register.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "code/codeBlob.hpp"
|
||||
#include "code/vmreg.inline.hpp"
|
||||
|
||||
@@ -48,9 +48,12 @@ const bool CCallingConventionRequiresIntsAsLongs = true;
|
||||
// PPC64 is not specified as multi-copy-atomic
|
||||
// So we must not #define CPU_MULTI_COPY_ATOMIC
|
||||
|
||||
// The expected size in bytes of a cache line, used to pad data structures.
|
||||
// The expected size in bytes of a cache line.
|
||||
#define DEFAULT_CACHE_LINE_SIZE 128
|
||||
|
||||
// The default padding size for data structures to avoid false sharing.
|
||||
#define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE
|
||||
|
||||
#define SUPPORT_RESERVED_STACK_AREA
|
||||
|
||||
// If UseSIGTRAP is active, we only use the poll bit and no polling page.
|
||||
|
||||
@@ -1187,8 +1187,12 @@ void MacroAssembler::post_call_nop() {
|
||||
if (!Continuations::enabled()) {
|
||||
return;
|
||||
}
|
||||
// We use CMPI/CMPLI instructions to encode post call nops.
|
||||
// Refer to NativePostCallNop for details.
|
||||
relocate(post_call_nop_Relocation::spec());
|
||||
InlineSkippedInstructionsCounter skipCounter(this);
|
||||
nop();
|
||||
Assembler::emit_int32(Assembler::CMPLI_OPCODE | Assembler::opp_u_field(1, 9, 9));
|
||||
assert(is_post_call_nop(*(int*)(pc() - 4)), "post call not not found");
|
||||
}
|
||||
|
||||
void MacroAssembler::call_VM_base(Register oop_result,
|
||||
|
||||
@@ -417,6 +417,12 @@ class MacroAssembler: public Assembler {
|
||||
inline void call_stub_and_return_to(Register function_entry, Register return_pc);
|
||||
|
||||
void post_call_nop();
|
||||
static bool is_post_call_nop(int instr_bits) {
|
||||
const uint32_t nineth_bit = opp_u_field(1, 9, 9);
|
||||
const uint32_t opcode_mask = 0b111110 << OPCODE_SHIFT;
|
||||
const uint32_t pcn_mask = opcode_mask | nineth_bit;
|
||||
return (instr_bits & pcn_mask) == (Assembler::CMPLI_OPCODE | nineth_bit);
|
||||
}
|
||||
|
||||
//
|
||||
// Java utilities
|
||||
|
||||
@@ -429,8 +429,29 @@ void NativePostCallNop::make_deopt() {
|
||||
NativeDeoptInstruction::insert(addr_at(0));
|
||||
}
|
||||
|
||||
void NativePostCallNop::patch(jint diff) {
|
||||
// unsupported for now
|
||||
bool NativePostCallNop::patch(int32_t oopmap_slot, int32_t cb_offset) {
|
||||
int32_t i2, i1;
|
||||
assert(is_aligned(cb_offset, 4), "cb offset alignment does not match instruction alignment");
|
||||
assert(!decode(i1, i2), "already patched");
|
||||
|
||||
cb_offset = cb_offset >> 2;
|
||||
if (((oopmap_slot & ppc_oopmap_slot_mask) != oopmap_slot) || ((cb_offset & ppc_cb_offset_mask) != cb_offset)) {
|
||||
return false; // cannot encode
|
||||
}
|
||||
const uint32_t data = oopmap_slot << ppc_cb_offset_bits | cb_offset;
|
||||
const uint32_t lo_data = data & ppc_data_lo_mask;
|
||||
const uint32_t hi_data = data >> ppc_data_lo_bits;
|
||||
const uint32_t nineth_bit = 1 << (31 - 9);
|
||||
uint32_t instr = Assembler::CMPLI_OPCODE | hi_data << ppc_data_hi_shift | nineth_bit | lo_data;
|
||||
*(uint32_t*)addr_at(0) = instr;
|
||||
|
||||
int32_t oopmap_slot_dec, cb_offset_dec;
|
||||
assert(is_post_call_nop(), "pcn not recognized");
|
||||
assert(decode(oopmap_slot_dec, cb_offset_dec), "encoding failed");
|
||||
assert(oopmap_slot == oopmap_slot_dec, "oopmap slot encoding is wrong");
|
||||
assert((cb_offset << 2) == cb_offset_dec, "cb offset encoding is wrong");
|
||||
|
||||
return true; // encoding succeeded
|
||||
}
|
||||
|
||||
void NativeDeoptInstruction::verify() {
|
||||
|
||||
@@ -51,7 +51,7 @@ class NativeInstruction {
|
||||
friend class Relocation;
|
||||
|
||||
public:
|
||||
bool is_nop() const { return Assembler::is_nop(long_at(0)); }
|
||||
bool is_post_call_nop() const { return MacroAssembler::is_post_call_nop(long_at(0)); }
|
||||
|
||||
bool is_jump() const { return Assembler::is_b(long_at(0)); } // See NativeGeneralJump.
|
||||
|
||||
@@ -506,10 +506,50 @@ class NativeMovRegMem: public NativeInstruction {
|
||||
};
|
||||
|
||||
class NativePostCallNop: public NativeInstruction {
|
||||
|
||||
// We use CMPI/CMPLI to represent Post Call Nops (PCN)
|
||||
|
||||
// Bit |0 5|6 |9 |10|11 |16 31|
|
||||
// +--------------------------------------------------------------+
|
||||
// Field |OPCODE |BF |/ |L |RA |SI |
|
||||
// +--------------------------------------------------------------+
|
||||
// |0 0 1 0 1|DATA HI| 1| DATA LO |
|
||||
// | |4 bits | | 22 bits |
|
||||
//
|
||||
// Bit 9 is always 1 for PCNs to distinguish them from regular CMPI/CMPLI
|
||||
//
|
||||
// Using both, CMPLI (opcode 10 = 0b001010) and CMPI (opcode 11 = 0b001011) for
|
||||
// PCNs allows using bit 5 from the opcode to encode DATA HI.
|
||||
|
||||
enum {
|
||||
ppc_data_lo_bits = 31 - 9,
|
||||
ppc_data_lo_mask = right_n_bits(ppc_data_lo_bits),
|
||||
ppc_data_hi_bits = 9 - 5,
|
||||
ppc_data_hi_shift = ppc_data_lo_bits + 1,
|
||||
ppc_data_hi_mask = right_n_bits(ppc_data_hi_bits) << ppc_data_hi_shift,
|
||||
ppc_data_bits = ppc_data_lo_bits + ppc_data_hi_bits,
|
||||
|
||||
ppc_oopmap_slot_bits = 9,
|
||||
ppc_oopmap_slot_mask = right_n_bits(ppc_oopmap_slot_bits),
|
||||
ppc_cb_offset_bits = ppc_data_bits - ppc_oopmap_slot_bits,
|
||||
ppc_cb_offset_mask = right_n_bits(ppc_cb_offset_bits),
|
||||
};
|
||||
|
||||
public:
|
||||
bool check() const { return is_nop(); }
|
||||
int displacement() const { return 0; }
|
||||
void patch(jint diff);
|
||||
bool check() const { return is_post_call_nop(); }
|
||||
bool decode(int32_t& oopmap_slot, int32_t& cb_offset) const {
|
||||
uint32_t instr_bits = long_at(0);
|
||||
uint32_t data_lo = instr_bits & ppc_data_lo_mask;
|
||||
uint32_t data_hi = (instr_bits & ppc_data_hi_mask) >> 1;
|
||||
uint32_t data = data_hi | data_lo;
|
||||
if (data == 0) {
|
||||
return false; // no data found
|
||||
}
|
||||
cb_offset = (data & ppc_cb_offset_mask) << 2;
|
||||
oopmap_slot = data >> ppc_cb_offset_bits;
|
||||
return true; // decoding succeeded
|
||||
}
|
||||
bool patch(int32_t oopmap_slot, int32_t cb_offset);
|
||||
void make_deopt();
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2012, 2023 SAP SE. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
@@ -2173,7 +2173,7 @@ bool Matcher::match_rule_supported(int opcode) {
|
||||
return true; // Per default match rules are supported.
|
||||
}
|
||||
|
||||
bool Matcher::match_rule_supported_superword(int opcode, int vlen, BasicType bt) {
|
||||
bool Matcher::match_rule_supported_auto_vectorization(int opcode, int vlen, BasicType bt) {
|
||||
return match_rule_supported_vector(opcode, vlen, bt);
|
||||
}
|
||||
|
||||
@@ -2242,7 +2242,7 @@ int Matcher::min_vector_size(const BasicType bt) {
|
||||
return max_vector_size(bt); // Same as max.
|
||||
}
|
||||
|
||||
int Matcher::superword_max_vector_size(const BasicType bt) {
|
||||
int Matcher::max_vector_size_auto_vectorization(const BasicType bt) {
|
||||
return Matcher::max_vector_size(bt);
|
||||
}
|
||||
|
||||
|
||||
@@ -734,7 +734,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
return align_up(stk, 2);
|
||||
return stk;
|
||||
}
|
||||
|
||||
#if defined(COMPILER1) || defined(COMPILER2)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2023 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2024 SAP SE. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -3803,16 +3803,15 @@ void TemplateTable::_new() {
|
||||
__ sldi(Roffset, Rindex, LogBytesPerWord);
|
||||
__ load_resolved_klass_at_offset(Rcpool, Roffset, RinstanceKlass);
|
||||
|
||||
// Make sure klass is fully initialized and get instance_size.
|
||||
__ lbz(Rscratch, in_bytes(InstanceKlass::init_state_offset()), RinstanceKlass);
|
||||
// Make sure klass is initialized.
|
||||
assert(VM_Version::supports_fast_class_init_checks(), "Optimization requires support for fast class initialization checks");
|
||||
__ clinit_barrier(RinstanceKlass, R16_thread, nullptr /*L_fast_path*/, &Lslow_case);
|
||||
|
||||
__ lwz(Rinstance_size, in_bytes(Klass::layout_helper_offset()), RinstanceKlass);
|
||||
|
||||
__ cmpdi(CCR1, Rscratch, InstanceKlass::fully_initialized);
|
||||
// Make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class.
|
||||
__ andi_(R0, Rinstance_size, Klass::_lh_instance_slow_path_bit); // slow path bit equals 0?
|
||||
|
||||
__ crnand(CCR0, Assembler::equal, CCR1, Assembler::equal); // slow path bit set or not fully initialized?
|
||||
__ beq(CCR0, Lslow_case);
|
||||
__ bne(CCR0, Lslow_case);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Fast case:
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
// Override Abstract_VM_Version implementation
|
||||
static void print_platform_virtualization_info(outputStream*);
|
||||
|
||||
// PPC64 supports fast class initialization checks for static methods.
|
||||
// PPC64 supports fast class initialization checks
|
||||
static bool supports_fast_class_init_checks() { return true; }
|
||||
constexpr static bool supports_stack_watermark_barrier() { return true; }
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
||||
* Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@@ -506,7 +506,7 @@ public:
|
||||
INSN(sllw, 0b0111011, 0b001, 0b0000000);
|
||||
INSN(sraw, 0b0111011, 0b101, 0b0100000);
|
||||
INSN(srlw, 0b0111011, 0b101, 0b0000000);
|
||||
INSN(mul, 0b0110011, 0b000, 0b0000001);
|
||||
INSN(_mul, 0b0110011, 0b000, 0b0000001);
|
||||
INSN(mulh, 0b0110011, 0b001, 0b0000001);
|
||||
INSN(mulhsu,0b0110011, 0b010, 0b0000001);
|
||||
INSN(mulhu, 0b0110011, 0b011, 0b0000001);
|
||||
@@ -537,9 +537,9 @@ public:
|
||||
}
|
||||
|
||||
INSN(lb, 0b0000011, 0b000);
|
||||
INSN(lbu, 0b0000011, 0b100);
|
||||
INSN(lh, 0b0000011, 0b001);
|
||||
INSN(lhu, 0b0000011, 0b101);
|
||||
INSN(_lbu, 0b0000011, 0b100);
|
||||
INSN(_lh, 0b0000011, 0b001);
|
||||
INSN(_lhu, 0b0000011, 0b101);
|
||||
INSN(_lw, 0b0000011, 0b010);
|
||||
INSN(lwu, 0b0000011, 0b110);
|
||||
INSN(_ld, 0b0000011, 0b011);
|
||||
@@ -609,8 +609,8 @@ public:
|
||||
emit(insn); \
|
||||
} \
|
||||
|
||||
INSN(sb, Register, 0b0100011, 0b000);
|
||||
INSN(sh, Register, 0b0100011, 0b001);
|
||||
INSN(_sb, Register, 0b0100011, 0b000);
|
||||
INSN(_sh, Register, 0b0100011, 0b001);
|
||||
INSN(_sw, Register, 0b0100011, 0b010);
|
||||
INSN(_sd, Register, 0b0100011, 0b011);
|
||||
INSN(fsw, FloatRegister, 0b0100111, 0b010);
|
||||
@@ -758,6 +758,8 @@ enum Aqrl {relaxed = 0b00, rl = 0b01, aq = 0b10, aqrl = 0b11};
|
||||
INSN(amomax_d , 0b0101111, 0b011, 0b10100);
|
||||
INSN(amominu_d, 0b0101111, 0b011, 0b11000);
|
||||
INSN(amomaxu_d, 0b0101111, 0b011, 0b11100);
|
||||
INSN(amocas_w, 0b0101111, 0b010, 0b00101);
|
||||
INSN(amocas_d, 0b0101111, 0b011, 0b00101);
|
||||
#undef INSN
|
||||
|
||||
enum operand_size { int8, int16, int32, uint32, int64 };
|
||||
@@ -813,6 +815,8 @@ enum operand_size { int8, int16, int32, uint32, int64 };
|
||||
|
||||
INSN(fsqrt_s, 0b1010011, 0b00000, 0b0101100);
|
||||
INSN(fsqrt_d, 0b1010011, 0b00000, 0b0101101);
|
||||
INSN(fcvt_s_h, 0b1010011, 0b00010, 0b0100000);
|
||||
INSN(fcvt_h_s, 0b1010011, 0b00000, 0b0100010);
|
||||
INSN(fcvt_s_d, 0b1010011, 0b00001, 0b0100000);
|
||||
INSN(fcvt_d_s, 0b1010011, 0b00000, 0b0100001);
|
||||
#undef INSN
|
||||
@@ -1069,6 +1073,7 @@ enum operand_size { int8, int16, int32, uint32, int64 };
|
||||
emit(insn); \
|
||||
}
|
||||
|
||||
INSN(fmv_h_x, 0b1010011, 0b000, 0b00000, 0b1111010);
|
||||
INSN(fmv_w_x, 0b1010011, 0b000, 0b00000, 0b1111000);
|
||||
INSN(fmv_d_x, 0b1010011, 0b000, 0b00000, 0b1111001);
|
||||
|
||||
@@ -1106,8 +1111,10 @@ enum fclass_mask {
|
||||
emit(insn); \
|
||||
}
|
||||
|
||||
INSN(fclass_h, 0b1010011, 0b001, 0b00000, 0b1110010);
|
||||
INSN(fclass_s, 0b1010011, 0b001, 0b00000, 0b1110000);
|
||||
INSN(fclass_d, 0b1010011, 0b001, 0b00000, 0b1110001);
|
||||
INSN(fmv_x_h, 0b1010011, 0b000, 0b00000, 0b1110010);
|
||||
INSN(fmv_x_w, 0b1010011, 0b000, 0b00000, 0b1110000);
|
||||
INSN(fmv_x_d, 0b1010011, 0b000, 0b00000, 0b1110001);
|
||||
|
||||
@@ -1154,10 +1161,8 @@ static Assembler::SEW elemtype_to_sew(BasicType etype) {
|
||||
}
|
||||
|
||||
#define patch_vtype(hsb, lsb, vlmul, vsew, vta, vma, vill) \
|
||||
if (vill == 1) { \
|
||||
guarantee((vlmul | vsew | vta | vma == 0), \
|
||||
"the other bits in vtype shall be zero"); \
|
||||
} \
|
||||
/* If vill then other bits of vtype must be zero. */ \
|
||||
guarantee(!vill, "vill not supported"); \
|
||||
patch((address)&insn, lsb + 2, lsb, vlmul); \
|
||||
patch((address)&insn, lsb + 5, lsb + 3, vsew); \
|
||||
patch((address)&insn, lsb + 6, vta); \
|
||||
@@ -1332,6 +1337,7 @@ enum VectorMask {
|
||||
INSN(vsll_vi, 0b1010111, 0b011, 0b100101);
|
||||
|
||||
// Vector Slide Instructions
|
||||
INSN(vslideup_vi, 0b1010111, 0b011, 0b001110);
|
||||
INSN(vslidedown_vi, 0b1010111, 0b011, 0b001111);
|
||||
|
||||
#undef INSN
|
||||
@@ -1687,7 +1693,6 @@ enum VectorMask {
|
||||
INSN(vmv_v_x, 0b1010111, 0b100, v0, 0b1, 0b010111);
|
||||
|
||||
#undef INSN
|
||||
#undef patch_VArith
|
||||
|
||||
#define INSN(NAME, op, funct13, funct6) \
|
||||
void NAME(VectorRegister Vd, VectorMask vm = unmasked) { \
|
||||
@@ -1729,14 +1734,29 @@ enum Nf {
|
||||
patch_reg((address)&insn, 15, Rs1); \
|
||||
emit(insn)
|
||||
|
||||
#define INSN(NAME, op, lumop, vm, mop, nf) \
|
||||
void NAME(VectorRegister Vd, Register Rs1, uint32_t width = 0, bool mew = false) { \
|
||||
#define INSN(NAME, op, width, lumop, vm, mop, mew, nf) \
|
||||
void NAME(VectorRegister Vd, Register Rs1) { \
|
||||
guarantee(is_uimm3(width), "width is invalid"); \
|
||||
patch_VLdSt(op, Vd, width, Rs1, lumop, vm, mop, mew, nf); \
|
||||
}
|
||||
|
||||
// Vector Load/Store Instructions
|
||||
INSN(vl1re8_v, 0b0000111, 0b01000, 0b1, 0b00, g1);
|
||||
INSN(vl1re8_v, 0b0000111, 0b000, 0b01000, 0b1, 0b00, 0b0, g1);
|
||||
INSN(vl1re16_v, 0b0000111, 0b101, 0b01000, 0b1, 0b00, 0b0, g1);
|
||||
INSN(vl1re32_v, 0b0000111, 0b110, 0b01000, 0b1, 0b00, 0b0, g1);
|
||||
INSN(vl1re64_v, 0b0000111, 0b111, 0b01000, 0b1, 0b00, 0b0, g1);
|
||||
INSN(vl2re8_v, 0b0000111, 0b000, 0b01000, 0b1, 0b00, 0b0, g2);
|
||||
INSN(vl2re16_v, 0b0000111, 0b101, 0b01000, 0b1, 0b00, 0b0, g2);
|
||||
INSN(vl2re32_v, 0b0000111, 0b110, 0b01000, 0b1, 0b00, 0b0, g2);
|
||||
INSN(vl2re64_v, 0b0000111, 0b111, 0b01000, 0b1, 0b00, 0b0, g2);
|
||||
INSN(vl4re8_v, 0b0000111, 0b000, 0b01000, 0b1, 0b00, 0b0, g4);
|
||||
INSN(vl4re16_v, 0b0000111, 0b101, 0b01000, 0b1, 0b00, 0b0, g4);
|
||||
INSN(vl4re32_v, 0b0000111, 0b110, 0b01000, 0b1, 0b00, 0b0, g4);
|
||||
INSN(vl4re64_v, 0b0000111, 0b111, 0b01000, 0b1, 0b00, 0b0, g4);
|
||||
INSN(vl8re8_v, 0b0000111, 0b000, 0b01000, 0b1, 0b00, 0b0, g8);
|
||||
INSN(vl8re16_v, 0b0000111, 0b101, 0b01000, 0b1, 0b00, 0b0, g8);
|
||||
INSN(vl8re32_v, 0b0000111, 0b110, 0b01000, 0b1, 0b00, 0b0, g8);
|
||||
INSN(vl8re64_v, 0b0000111, 0b111, 0b01000, 0b1, 0b00, 0b0, g8);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@@ -1747,6 +1767,9 @@ enum Nf {
|
||||
|
||||
// Vector Load/Store Instructions
|
||||
INSN(vs1r_v, 0b0100111, 0b000, 0b01000, 0b1, 0b00, 0b0, g1);
|
||||
INSN(vs2r_v, 0b0100111, 0b000, 0b01000, 0b1, 0b00, 0b0, g2);
|
||||
INSN(vs4r_v, 0b0100111, 0b000, 0b01000, 0b1, 0b00, 0b0, g4);
|
||||
INSN(vs8r_v, 0b0100111, 0b000, 0b01000, 0b1, 0b00, 0b0, g8);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@@ -1792,9 +1815,11 @@ enum Nf {
|
||||
}
|
||||
|
||||
// Vector unordered indexed load instructions
|
||||
INSN( vluxei8_v, 0b0000111, 0b000, 0b01, 0b0);
|
||||
INSN(vluxei32_v, 0b0000111, 0b110, 0b01, 0b0);
|
||||
|
||||
// Vector unordered indexed store instructions
|
||||
INSN( vsuxei8_v, 0b0100111, 0b000, 0b01, 0b0);
|
||||
INSN(vsuxei32_v, 0b0100111, 0b110, 0b01, 0b0);
|
||||
|
||||
#undef INSN
|
||||
@@ -1818,6 +1843,55 @@ enum Nf {
|
||||
#undef INSN
|
||||
#undef patch_VLdSt
|
||||
|
||||
// ====================================
|
||||
// RISC-V Vector Crypto Extension
|
||||
// ====================================
|
||||
|
||||
#define INSN(NAME, op, funct3, funct6) \
|
||||
void NAME(VectorRegister Vd, VectorRegister Vs2, VectorRegister Vs1, VectorMask vm = unmasked) { \
|
||||
patch_VArith(op, Vd, funct3, Vs1->raw_encoding(), Vs2, vm, funct6); \
|
||||
}
|
||||
|
||||
// Vector Bit-manipulation used in Cryptography (Zvkb) Extension
|
||||
INSN(vandn_vv, 0b1010111, 0b000, 0b000001);
|
||||
INSN(vandn_vx, 0b1010111, 0b100, 0b000001);
|
||||
INSN(vandn_vi, 0b1010111, 0b011, 0b000001);
|
||||
INSN(vclmul_vv, 0b1010111, 0b010, 0b001100);
|
||||
INSN(vclmul_vx, 0b1010111, 0b110, 0b001100);
|
||||
INSN(vclmulh_vv, 0b1010111, 0b010, 0b001101);
|
||||
INSN(vclmulh_vx, 0b1010111, 0b110, 0b001101);
|
||||
INSN(vror_vv, 0b1010111, 0b000, 0b010100);
|
||||
INSN(vror_vx, 0b1010111, 0b100, 0b010100);
|
||||
INSN(vrol_vv, 0b1010111, 0b000, 0b010101);
|
||||
INSN(vrol_vx, 0b1010111, 0b100, 0b010101);
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, op, funct3, Vs1, funct6) \
|
||||
void NAME(VectorRegister Vd, VectorRegister Vs2, VectorMask vm = unmasked) { \
|
||||
patch_VArith(op, Vd, funct3, Vs1, Vs2, vm, funct6); \
|
||||
}
|
||||
|
||||
// Vector Bit-manipulation used in Cryptography (Zvkb) Extension
|
||||
INSN(vbrev8_v, 0b1010111, 0b010, 0b01000, 0b010010);
|
||||
INSN(vrev8_v, 0b1010111, 0b010, 0b01001, 0b010010);
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, op, funct3, vm, funct6) \
|
||||
void NAME(VectorRegister Vd, VectorRegister Vs2, VectorRegister Vs1) { \
|
||||
patch_VArith(op, Vd, funct3, Vs1->raw_encoding(), Vs2, vm, funct6); \
|
||||
}
|
||||
|
||||
// Vector SHA-2 Secure Hash (Zvknh[ab]) Extension
|
||||
INSN(vsha2ms_vv, 0b1110111, 0b010, 0b1, 0b101101);
|
||||
INSN(vsha2ch_vv, 0b1110111, 0b010, 0b1, 0b101110);
|
||||
INSN(vsha2cl_vv, 0b1110111, 0b010, 0b1, 0b101111);
|
||||
|
||||
#undef INSN
|
||||
|
||||
#undef patch_VArith
|
||||
|
||||
// ====================================
|
||||
// RISC-V Bit-Manipulation Extension
|
||||
// Currently only support Zba, Zbb and Zbs bitmanip extensions.
|
||||
@@ -1867,9 +1941,9 @@ enum Nf {
|
||||
}
|
||||
|
||||
INSN(rev8, 0b0010011, 0b101, 0b011010111000);
|
||||
INSN(sext_b, 0b0010011, 0b001, 0b011000000100);
|
||||
INSN(sext_h, 0b0010011, 0b001, 0b011000000101);
|
||||
INSN(zext_h, 0b0111011, 0b100, 0b000010000000);
|
||||
INSN(_sext_b, 0b0010011, 0b001, 0b011000000100);
|
||||
INSN(_sext_h, 0b0010011, 0b001, 0b011000000101);
|
||||
INSN(_zext_h, 0b0111011, 0b100, 0b000010000000);
|
||||
INSN(clz, 0b0010011, 0b001, 0b011000000000);
|
||||
INSN(clzw, 0b0011011, 0b001, 0b011000000000);
|
||||
INSN(ctz, 0b0010011, 0b001, 0b011000000001);
|
||||
@@ -2581,6 +2655,15 @@ public:
|
||||
return UseRVC && in_compressible_region();
|
||||
}
|
||||
|
||||
bool do_compress_zcb(Register reg1 = noreg, Register reg2 = noreg) const {
|
||||
return do_compress() && VM_Version::ext_Zcb.enabled() &&
|
||||
(reg1 == noreg || reg1->is_compressed_valid()) && (reg2 == noreg || reg2->is_compressed_valid());
|
||||
}
|
||||
|
||||
bool do_compress_zcb_zbb(Register reg1 = noreg, Register reg2 = noreg) const {
|
||||
return do_compress_zcb(reg1, reg2) && UseZbb;
|
||||
}
|
||||
|
||||
// --------------------------
|
||||
// Load/store register
|
||||
// --------------------------
|
||||
@@ -2915,6 +2998,238 @@ public:
|
||||
|
||||
#undef INSN
|
||||
|
||||
// -------------- ZCB Instruction Definitions --------------
|
||||
// Zcb additional C instructions
|
||||
private:
|
||||
// Format CLH, c.lh/c.lhu
|
||||
template <bool Unsigned>
|
||||
void c_lh_if(Register Rd_Rs2, Register Rs1, uint32_t uimm) {
|
||||
assert_cond(uimm == 0 || uimm == 2);
|
||||
assert_cond(do_compress_zcb(Rd_Rs2, Rs1));
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b00);
|
||||
c_patch_compressed_reg((address)&insn, 2, Rd_Rs2);
|
||||
c_patch((address)&insn, 5, 5, (uimm & nth_bit(1)) >> 1);
|
||||
c_patch((address)&insn, 6, 6, Unsigned ? 0 : 1);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b001);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
template <bool Unsigned>
|
||||
void lh_c_mux(Register Rd_Rs2, Register Rs1, const int32_t uimm) {
|
||||
if (do_compress_zcb(Rd_Rs2, Rs1) &&
|
||||
(uimm == 0 || uimm == 2)) {
|
||||
c_lh_if<Unsigned>(Rd_Rs2, Rs1, uimm);
|
||||
} else {
|
||||
if (Unsigned) {
|
||||
_lhu(Rd_Rs2, Rs1, uimm);
|
||||
} else {
|
||||
_lh(Rd_Rs2, Rs1, uimm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Format CU, c.[sz]ext.*, c.not
|
||||
template <uint8_t InstructionType>
|
||||
void c_u_if(Register Rs1) {
|
||||
assert_cond(do_compress_zcb(Rs1));
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b01);
|
||||
c_patch((address)&insn, 4, 2, InstructionType);
|
||||
c_patch((address)&insn, 6, 5, 0b11);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b111);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
// Prerequisites: Zcb
|
||||
void c_lh(Register Rd_Rs2, Register Rs1, const int32_t uimm) { c_lh_if<false>(Rd_Rs2, Rs1, uimm); }
|
||||
void lh(Register Rd_Rs2, Register Rs1, const int32_t uimm) { lh_c_mux<false>(Rd_Rs2, Rs1, uimm); }
|
||||
|
||||
// Prerequisites: Zcb
|
||||
void c_lhu(Register Rd_Rs2, Register Rs1, const int32_t uimm) { c_lh_if<true>(Rd_Rs2, Rs1, uimm); }
|
||||
void lhu(Register Rd_Rs2, Register Rs1, const int32_t uimm) { lh_c_mux<true>(Rd_Rs2, Rs1, uimm); }
|
||||
|
||||
// Prerequisites: Zcb
|
||||
// Format CLB, single instruction
|
||||
void c_lbu(Register Rd_Rs2, Register Rs1, uint32_t uimm) {
|
||||
assert_cond(uimm <= 3);
|
||||
assert_cond(do_compress_zcb(Rd_Rs2, Rs1));
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b00);
|
||||
c_patch_compressed_reg((address)&insn, 2, Rd_Rs2);
|
||||
c_patch((address)&insn, 5, 5, (uimm & nth_bit(1)) >> 1);
|
||||
c_patch((address)&insn, 6, 6, (uimm & nth_bit(0)) >> 0);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b000);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
void lbu(Register Rd_Rs2, Register Rs1, const int32_t uimm) {
|
||||
if (do_compress_zcb(Rd_Rs2, Rs1) &&
|
||||
uimm >= 0 && uimm <= 3) {
|
||||
c_lbu(Rd_Rs2, Rs1, uimm);
|
||||
} else {
|
||||
_lbu(Rd_Rs2, Rs1, uimm);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb
|
||||
// Format CSB, single instruction
|
||||
void c_sb(Register Rd_Rs2, Register Rs1, uint32_t uimm) {
|
||||
assert_cond(uimm <= 3);
|
||||
assert_cond(do_compress_zcb(Rd_Rs2, Rs1));
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b00);
|
||||
c_patch_compressed_reg((address)&insn, 2, Rd_Rs2);
|
||||
c_patch((address)&insn, 5, 5, (uimm & nth_bit(1)) >> 1);
|
||||
c_patch((address)&insn, 6, 6, (uimm & nth_bit(0)) >> 0);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b010);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
void sb(Register Rd_Rs2, Register Rs1, const int32_t uimm) {
|
||||
if (do_compress_zcb(Rd_Rs2, Rs1) &&
|
||||
uimm >= 0 && uimm <= 3) {
|
||||
c_sb(Rd_Rs2, Rs1, uimm);
|
||||
} else {
|
||||
_sb(Rd_Rs2, Rs1, uimm);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb
|
||||
// Format CSH, single instruction
|
||||
void c_sh(Register Rd_Rs2, Register Rs1, uint32_t uimm) {
|
||||
assert_cond(uimm == 0 || uimm == 2);
|
||||
assert_cond(do_compress_zcb(Rd_Rs2, Rs1));
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b00);
|
||||
c_patch_compressed_reg((address)&insn, 2, Rd_Rs2);
|
||||
c_patch((address)&insn, 5, 5, (uimm & nth_bit(1)) >> 1);
|
||||
c_patch((address)&insn, 6, 6, 0);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b011);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
void sh(Register Rd_Rs2, Register Rs1, const int32_t uimm) {
|
||||
if (do_compress_zcb(Rd_Rs2, Rs1) &&
|
||||
(uimm == 0 || uimm == 2)) {
|
||||
c_sh(Rd_Rs2, Rs1, uimm);
|
||||
} else {
|
||||
_sh(Rd_Rs2, Rs1, uimm);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb
|
||||
// Format CS
|
||||
void c_zext_b(Register Rs1) {
|
||||
assert_cond(do_compress_zcb(Rs1));
|
||||
c_u_if<0b000>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zbb
|
||||
void sext_b(Register Rd_Rs2, Register Rs1) {
|
||||
assert_cond(UseZbb);
|
||||
if (do_compress_zcb_zbb(Rd_Rs2, Rs1) && (Rd_Rs2 == Rs1)) {
|
||||
c_sext_b(Rd_Rs2);
|
||||
} else {
|
||||
_sext_b(Rd_Rs2, Rs1);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb, Zbb
|
||||
// Format CS
|
||||
void c_sext_b(Register Rs1) {
|
||||
c_u_if<0b001>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zbb
|
||||
void zext_h(Register Rd_Rs2, Register Rs1) {
|
||||
assert_cond(UseZbb);
|
||||
if (do_compress_zcb_zbb(Rd_Rs2, Rs1) && (Rd_Rs2 == Rs1)) {
|
||||
c_zext_h(Rd_Rs2);
|
||||
} else {
|
||||
_zext_h(Rd_Rs2, Rs1);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb, Zbb
|
||||
// Format CS
|
||||
void c_zext_h(Register Rs1) {
|
||||
c_u_if<0b010>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zbb
|
||||
void sext_h(Register Rd_Rs2, Register Rs1) {
|
||||
assert_cond(UseZbb);
|
||||
if (do_compress_zcb_zbb(Rd_Rs2, Rs1) && (Rd_Rs2 == Rs1)) {
|
||||
c_sext_h(Rd_Rs2);
|
||||
} else {
|
||||
_sext_h(Rd_Rs2, Rs1);
|
||||
}
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb, Zbb
|
||||
// Format CS
|
||||
void c_sext_h(Register Rs1) {
|
||||
c_u_if<0b011>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb, Zba
|
||||
// Format CS
|
||||
void c_zext_w(Register Rs1) {
|
||||
c_u_if<0b100>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb
|
||||
// Format CS
|
||||
void c_not(Register Rs1) {
|
||||
c_u_if<0b101>(Rs1);
|
||||
}
|
||||
|
||||
// Prerequisites: Zcb (M or Zmmul)
|
||||
// Format CA, c.mul
|
||||
void c_mul(Register Rd_Rs1, Register Rs2) {
|
||||
uint16_t insn = 0;
|
||||
c_patch((address)&insn, 1, 0, 0b01);
|
||||
c_patch_compressed_reg((address)&insn, 2, Rs2);
|
||||
c_patch((address)&insn, 6, 5, 0b10);
|
||||
c_patch_compressed_reg((address)&insn, 7, Rd_Rs1);
|
||||
c_patch((address)&insn, 12, 10, 0b111);
|
||||
c_patch((address)&insn, 15, 13, 0b100);
|
||||
emit_int16(insn);
|
||||
}
|
||||
|
||||
void mul(Register Rd, Register Rs1, Register Rs2) {
|
||||
if (Rd != Rs1 && Rd != Rs2) {
|
||||
// Three registers needed without a mv, emit uncompressed
|
||||
_mul(Rd, Rs1, Rs2);
|
||||
return;
|
||||
}
|
||||
|
||||
// Rd is either Rs1 or Rs2
|
||||
if (!do_compress_zcb(Rs2, Rs1)) {
|
||||
_mul(Rd, Rs1, Rs2);
|
||||
} else {
|
||||
if (Rd == Rs2) {
|
||||
Rs2 = Rs1;
|
||||
} else {
|
||||
assert(Rd == Rs1, "must be");
|
||||
}
|
||||
c_mul(Rd, Rs2);
|
||||
}
|
||||
}
|
||||
|
||||
// Stack overflow checking
|
||||
virtual void bang_stack_with_offset(int offset) { Unimplemented(); }
|
||||
|
||||
@@ -2940,6 +3255,17 @@ public:
|
||||
return uabs(target - branch) < branch_range;
|
||||
}
|
||||
|
||||
// Decode the given instruction, checking if it's a 16-bit compressed
|
||||
// instruction and return the address of the next instruction.
|
||||
static address locate_next_instruction(address inst) {
|
||||
// Instruction wider than 16 bits has the two least-significant bits set.
|
||||
if ((0x3 & *inst) == 0x3) {
|
||||
return inst + instruction_size;
|
||||
} else {
|
||||
return inst + compressed_instruction_size;
|
||||
}
|
||||
}
|
||||
|
||||
Assembler(CodeBuffer* code) : AbstractAssembler(code), _in_compressible_region(true) {}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -121,10 +121,10 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg,
|
||||
|
||||
// Handle existing monitor.
|
||||
bind(object_has_monitor);
|
||||
// The object's monitor m is unlocked iff m->owner == NULL,
|
||||
// The object's monitor m is unlocked iff m->owner == nullptr,
|
||||
// otherwise m->owner may contain a thread or a stack address.
|
||||
//
|
||||
// Try to CAS m->owner from NULL to current thread.
|
||||
// Try to CAS m->owner from null to current thread.
|
||||
add(tmp, disp_hdr, (in_bytes(ObjectMonitor::owner_offset()) - markWord::monitor_value));
|
||||
cmpxchg(/*memory address*/tmp, /*expected value*/zr, /*new value*/xthread, Assembler::int64, Assembler::aq,
|
||||
Assembler::rl, /*result*/flag); // cas succeeds if flag == zr(expected)
|
||||
@@ -1783,6 +1783,95 @@ void C2_MacroAssembler::signum_fp(FloatRegister dst, FloatRegister one, bool is_
|
||||
bind(done);
|
||||
}
|
||||
|
||||
static void float16_to_float_slow_path(C2_MacroAssembler& masm, C2GeneralStub<FloatRegister, Register, Register>& stub) {
|
||||
#define __ masm.
|
||||
FloatRegister dst = stub.data<0>();
|
||||
Register src = stub.data<1>();
|
||||
Register tmp = stub.data<2>();
|
||||
__ bind(stub.entry());
|
||||
|
||||
// following instructions mainly focus on NaN, as riscv does not handle
|
||||
// NaN well with fcvt, but the code also works for Inf at the same time.
|
||||
|
||||
// construct a NaN in 32 bits from the NaN in 16 bits,
|
||||
// we need the payloads of non-canonical NaNs to be preserved.
|
||||
__ mv(tmp, 0x7f800000);
|
||||
// sign-bit was already set via sign-extension if necessary.
|
||||
__ slli(t0, src, 13);
|
||||
__ orr(tmp, t0, tmp);
|
||||
__ fmv_w_x(dst, tmp);
|
||||
|
||||
__ j(stub.continuation());
|
||||
#undef __
|
||||
}
|
||||
|
||||
// j.l.Float.float16ToFloat
|
||||
void C2_MacroAssembler::float16_to_float(FloatRegister dst, Register src, Register tmp) {
|
||||
auto stub = C2CodeStub::make<FloatRegister, Register, Register>(dst, src, tmp, 20, float16_to_float_slow_path);
|
||||
|
||||
// in riscv, NaN needs a special process as fcvt does not work in that case.
|
||||
// in riscv, Inf does not need a special process as fcvt can handle it correctly.
|
||||
// but we consider to get the slow path to process NaN and Inf at the same time,
|
||||
// as both of them are rare cases, and if we try to get the slow path to handle
|
||||
// only NaN case it would sacrifise the performance for normal cases,
|
||||
// i.e. non-NaN and non-Inf cases.
|
||||
|
||||
// check whether it's a NaN or +/- Inf.
|
||||
mv(t0, 0x7c00);
|
||||
andr(tmp, src, t0);
|
||||
// jump to stub processing NaN and Inf cases.
|
||||
beq(t0, tmp, stub->entry());
|
||||
|
||||
// non-NaN or non-Inf cases, just use built-in instructions.
|
||||
fmv_h_x(dst, src);
|
||||
fcvt_s_h(dst, dst);
|
||||
|
||||
bind(stub->continuation());
|
||||
}
|
||||
|
||||
static void float_to_float16_slow_path(C2_MacroAssembler& masm, C2GeneralStub<Register, FloatRegister, Register>& stub) {
|
||||
#define __ masm.
|
||||
Register dst = stub.data<0>();
|
||||
FloatRegister src = stub.data<1>();
|
||||
Register tmp = stub.data<2>();
|
||||
__ bind(stub.entry());
|
||||
|
||||
__ fmv_x_w(dst, src);
|
||||
|
||||
// preserve the payloads of non-canonical NaNs.
|
||||
__ srai(dst, dst, 13);
|
||||
// preserve the sign bit.
|
||||
__ srai(tmp, dst, 13);
|
||||
__ slli(tmp, tmp, 10);
|
||||
__ mv(t0, 0x3ff);
|
||||
__ orr(tmp, tmp, t0);
|
||||
|
||||
// get the result by merging sign bit and payloads of preserved non-canonical NaNs.
|
||||
__ andr(dst, dst, tmp);
|
||||
|
||||
__ j(stub.continuation());
|
||||
#undef __
|
||||
}
|
||||
|
||||
// j.l.Float.floatToFloat16
|
||||
void C2_MacroAssembler::float_to_float16(Register dst, FloatRegister src, FloatRegister ftmp, Register xtmp) {
|
||||
auto stub = C2CodeStub::make<Register, FloatRegister, Register>(dst, src, xtmp, 130, float_to_float16_slow_path);
|
||||
|
||||
// in riscv, NaN needs a special process as fcvt does not work in that case.
|
||||
|
||||
// check whether it's a NaN.
|
||||
// replace fclass with feq as performance optimization.
|
||||
feq_s(t0, src, src);
|
||||
// jump to stub processing NaN cases.
|
||||
beqz(t0, stub->entry());
|
||||
|
||||
// non-NaN cases, just use built-in instructions.
|
||||
fcvt_h_s(ftmp, src);
|
||||
fmv_x_h(dst, ftmp);
|
||||
|
||||
bind(stub->continuation());
|
||||
}
|
||||
|
||||
void C2_MacroAssembler::signum_fp_v(VectorRegister dst, VectorRegister one, BasicType bt, int vlen) {
|
||||
vsetvli_helper(bt, vlen);
|
||||
|
||||
|
||||
@@ -172,8 +172,12 @@
|
||||
|
||||
void signum_fp(FloatRegister dst, FloatRegister one, bool is_double);
|
||||
|
||||
void float16_to_float(FloatRegister dst, Register src, Register tmp);
|
||||
void float_to_float16(Register dst, FloatRegister src, FloatRegister ftmp, Register xtmp);
|
||||
|
||||
void signum_fp_v(VectorRegister dst, VectorRegister one, BasicType bt, int vlen);
|
||||
|
||||
|
||||
// intrinsic methods implemented by rvv instructions
|
||||
|
||||
// compress bits, i.e. j.l.Integer/Long::compress.
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "code/compiledIC.hpp"
|
||||
#include "code/icBuffer.hpp"
|
||||
#include "code/nmethod.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "runtime/safepoint.hpp"
|
||||
@@ -88,9 +89,9 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
||||
address stub = find_stub();
|
||||
guarantee(stub != nullptr, "stub not found");
|
||||
|
||||
if (TraceICs) {
|
||||
{
|
||||
ResourceMark rm;
|
||||
tty->print_cr("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
log_trace(inlinecache)("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
|
||||
p2i(instruction_address()),
|
||||
callee->name_and_sig_as_C_string());
|
||||
}
|
||||
|
||||
@@ -189,8 +189,6 @@
|
||||
static void verify_deopt_original_pc(CompiledMethod* nm, intptr_t* unextended_sp);
|
||||
#endif
|
||||
|
||||
const ImmutableOopMap* get_oop_map() const;
|
||||
|
||||
public:
|
||||
// Constructors
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@@ -186,7 +186,7 @@ inline bool frame::equal(frame other) const {
|
||||
unextended_sp() == other.unextended_sp() &&
|
||||
fp() == other.fp() &&
|
||||
pc() == other.pc();
|
||||
assert(!ret || ret && cb() == other.cb() && _deopt_state == other._deopt_state, "inconsistent construction");
|
||||
assert(!ret || (cb() == other.cb() && _deopt_state == other._deopt_state), "inconsistent construction");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -345,20 +345,6 @@ inline int frame::sender_sp_ret_address_offset() {
|
||||
return frame::sender_sp_offset - frame::return_addr_offset;
|
||||
}
|
||||
|
||||
inline const ImmutableOopMap* frame::get_oop_map() const {
|
||||
if (_cb == nullptr) return nullptr;
|
||||
if (_cb->oop_maps() != nullptr) {
|
||||
NativePostCallNop* nop = nativePostCallNop_at(_pc);
|
||||
if (nop != nullptr && nop->displacement() != 0) {
|
||||
int slot = ((nop->displacement() >> 24) & 0xff);
|
||||
return _cb->oop_map_for_slot(slot, _pc);
|
||||
}
|
||||
const ImmutableOopMap* oop_map = OopMapSet::find_map(this);
|
||||
return oop_map;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// frame::sender
|
||||
frame frame::sender(RegisterMap* map) const {
|
||||
|
||||
@@ -52,11 +52,11 @@ static void x_load_barrier_slow_path(MacroAssembler& _masm, const MachNode* node
|
||||
%}
|
||||
|
||||
// Load Pointer
|
||||
instruct xLoadP(iRegPNoSp dst, memory mem)
|
||||
instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
%{
|
||||
match(Set dst (LoadP mem));
|
||||
predicate(UseZGC && !ZGenerational && (n->as_Load()->barrier_data() != 0));
|
||||
effect(TEMP dst);
|
||||
effect(TEMP dst, TEMP tmp);
|
||||
|
||||
ins_cost(4 * DEFAULT_COST);
|
||||
|
||||
@@ -65,17 +65,17 @@ instruct xLoadP(iRegPNoSp dst, memory mem)
|
||||
ins_encode %{
|
||||
const Address ref_addr (as_Register($mem$$base), $mem$$disp);
|
||||
__ ld($dst$$Register, ref_addr);
|
||||
x_load_barrier(_masm, this, ref_addr, $dst$$Register, t0 /* tmp */, barrier_data());
|
||||
x_load_barrier(_masm, this, ref_addr, $dst$$Register, $tmp$$Register /* tmp */, barrier_data());
|
||||
%}
|
||||
|
||||
ins_pipe(iload_reg_mem);
|
||||
%}
|
||||
|
||||
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(KILL cr, TEMP_DEF res);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -86,17 +86,15 @@ instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
|
||||
Label failed;
|
||||
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register,
|
||||
true /* result_as_bool */);
|
||||
__ beqz($res$$Register, failed);
|
||||
__ mv(t0, $oldval$$Register);
|
||||
__ bind(failed);
|
||||
Assembler::relaxed /* acquire */, Assembler::rl /* release */, $tmp$$Register);
|
||||
__ sub(t0, $tmp$$Register, $oldval$$Register);
|
||||
__ seqz($res$$Register, t0);
|
||||
if (barrier_data() != XLoadBarrierElided) {
|
||||
Label good;
|
||||
__ ld(t1, Address(xthread, XThreadLocalData::address_bad_mask_offset()), t1 /* tmp */);
|
||||
__ andr(t1, t1, t0);
|
||||
__ beqz(t1, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), t0 /* ref */, t1 /* tmp */);
|
||||
__ ld(t0, Address(xthread, XThreadLocalData::address_bad_mask_offset()));
|
||||
__ andr(t0, t0, $tmp$$Register);
|
||||
__ beqz(t0, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $tmp$$Register /* ref */, $res$$Register /* tmp */);
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register,
|
||||
true /* result_as_bool */);
|
||||
@@ -107,11 +105,11 @@ instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() == XLoadBarrierStrong));
|
||||
effect(KILL cr, TEMP_DEF res);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -122,17 +120,15 @@ instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
Label failed;
|
||||
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register,
|
||||
true /* result_as_bool */);
|
||||
__ beqz($res$$Register, failed);
|
||||
__ mv(t0, $oldval$$Register);
|
||||
__ bind(failed);
|
||||
Assembler::aq /* acquire */, Assembler::rl /* release */, $tmp$$Register);
|
||||
__ sub(t0, $tmp$$Register, $oldval$$Register);
|
||||
__ seqz($res$$Register, t0);
|
||||
if (barrier_data() != XLoadBarrierElided) {
|
||||
Label good;
|
||||
__ ld(t1, Address(xthread, XThreadLocalData::address_bad_mask_offset()), t1 /* tmp */);
|
||||
__ andr(t1, t1, t0);
|
||||
__ beqz(t1, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), t0 /* ref */, t1 /* tmp */);
|
||||
__ ld(t0, Address(xthread, XThreadLocalData::address_bad_mask_offset()));
|
||||
__ andr(t0, t0, $tmp$$Register);
|
||||
__ beqz(t0, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $tmp$$Register /* ref */, $res$$Register /* tmp */);
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register,
|
||||
true /* result_as_bool */);
|
||||
@@ -143,10 +139,10 @@ instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval) %{
|
||||
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(TEMP_DEF res);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -161,7 +157,7 @@ instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
__ ld(t0, Address(xthread, XThreadLocalData::address_bad_mask_offset()));
|
||||
__ andr(t0, t0, $res$$Register);
|
||||
__ beqz(t0, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $res$$Register /* ref */, t0 /* tmp */);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $res$$Register /* ref */, $tmp$$Register /* tmp */);
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register);
|
||||
__ bind(good);
|
||||
@@ -171,10 +167,10 @@ instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval) %{
|
||||
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(TEMP_DEF res);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -189,7 +185,7 @@ instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
__ ld(t0, Address(xthread, XThreadLocalData::address_bad_mask_offset()));
|
||||
__ andr(t0, t0, $res$$Register);
|
||||
__ beqz(t0, good);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $res$$Register /* ref */, t0 /* tmp */);
|
||||
x_load_barrier_slow_path(_masm, this, Address($mem$$Register), $res$$Register /* ref */, $tmp$$Register /* tmp */);
|
||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register);
|
||||
__ bind(good);
|
||||
@@ -199,10 +195,10 @@ instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, KILL cr);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -210,16 +206,16 @@ instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
|
||||
ins_encode %{
|
||||
__ atomic_xchg($prev$$Register, $newv$$Register, as_Register($mem$$base));
|
||||
x_load_barrier(_masm, this, Address(noreg, 0), $prev$$Register, t0 /* tmp */, barrier_data());
|
||||
x_load_barrier(_masm, this, Address(noreg, 0), $prev$$Register, $tmp$$Register /* tmp */, barrier_data());
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() != 0));
|
||||
effect(TEMP_DEF prev, KILL cr);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
|
||||
ins_cost(VOLATILE_REF_COST);
|
||||
|
||||
@@ -227,7 +223,7 @@ instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr)
|
||||
|
||||
ins_encode %{
|
||||
__ atomic_xchgal($prev$$Register, $newv$$Register, as_Register($mem$$base));
|
||||
x_load_barrier(_masm, this, Address(noreg, 0), $prev$$Register, t0 /* tmp */, barrier_data());
|
||||
x_load_barrier(_masm, this, Address(noreg, 0), $prev$$Register, $tmp$$Register /* tmp */, barrier_data());
|
||||
%}
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
@@ -79,7 +79,7 @@ static void z_load_barrier(MacroAssembler& _masm, const MachNode* node, Address
|
||||
|
||||
static void z_store_barrier(MacroAssembler& _masm, const MachNode* node, Address ref_addr, Register rnew_zaddress, Register rnew_zpointer, Register tmp, bool is_atomic) {
|
||||
if (node->barrier_data() == ZBarrierElided) {
|
||||
z_color(_masm, node, rnew_zpointer, rnew_zaddress, t0);
|
||||
z_color(_masm, node, rnew_zpointer, rnew_zaddress, tmp);
|
||||
} else {
|
||||
bool is_native = (node->barrier_data() & ZBarrierNative) != 0;
|
||||
ZStoreBarrierStubC2* const stub = ZStoreBarrierStubC2::create(node, ref_addr, rnew_zaddress, rnew_zpointer, is_native, is_atomic);
|
||||
@@ -90,11 +90,11 @@ static void z_store_barrier(MacroAssembler& _masm, const MachNode* node, Address
|
||||
%}
|
||||
|
||||
// Load Pointer
|
||||
instruct zLoadP(iRegPNoSp dst, memory mem)
|
||||
instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
%{
|
||||
match(Set dst (LoadP mem));
|
||||
predicate(UseZGC && ZGenerational && n->as_Load()->barrier_data() != 0);
|
||||
effect(TEMP dst);
|
||||
effect(TEMP dst, TEMP tmp);
|
||||
|
||||
ins_cost(4 * DEFAULT_COST);
|
||||
|
||||
@@ -103,34 +103,35 @@ instruct zLoadP(iRegPNoSp dst, memory mem)
|
||||
ins_encode %{
|
||||
const Address ref_addr(as_Register($mem$$base), $mem$$disp);
|
||||
__ ld($dst$$Register, ref_addr);
|
||||
z_load_barrier(_masm, this, ref_addr, $dst$$Register, t0);
|
||||
z_load_barrier(_masm, this, ref_addr, $dst$$Register, $tmp$$Register);
|
||||
%}
|
||||
|
||||
ins_pipe(iload_reg_mem);
|
||||
%}
|
||||
|
||||
// Store Pointer
|
||||
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp, rFlagsReg cr)
|
||||
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2)
|
||||
%{
|
||||
predicate(UseZGC && ZGenerational && n->as_Store()->barrier_data() != 0);
|
||||
match(Set mem (StoreP mem src));
|
||||
effect(TEMP tmp, KILL cr);
|
||||
effect(TEMP tmp1, TEMP tmp2);
|
||||
|
||||
ins_cost(125); // XXX
|
||||
format %{ "sd $mem, $src\t# ptr" %}
|
||||
ins_encode %{
|
||||
const Address ref_addr(as_Register($mem$$base), $mem$$disp);
|
||||
z_store_barrier(_masm, this, ref_addr, $src$$Register, $tmp$$Register, t1, false /* is_atomic */);
|
||||
__ sd($tmp$$Register, ref_addr);
|
||||
z_store_barrier(_masm, this, ref_addr, $src$$Register, $tmp1$$Register, $tmp2$$Register, false /* is_atomic */);
|
||||
__ sd($tmp1$$Register, ref_addr);
|
||||
%}
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
|
||||
instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -140,19 +141,20 @@ instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
|
||||
ins_encode %{
|
||||
guarantee($mem$$disp == 0, "impossible encoding");
|
||||
Address ref_addr($mem$$Register);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1, true /* is_atomic */);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register, true /* is_atomic */);
|
||||
__ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register, true /* result_as_bool */);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
|
||||
instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -162,18 +164,19 @@ instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
ins_encode %{
|
||||
guarantee($mem$$disp == 0, "impossible encoding");
|
||||
Address ref_addr($mem$$Register);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1, true /* is_atomic */);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register, true /* is_atomic */);
|
||||
__ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register, true /* result_as_bool */);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
|
||||
instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -182,8 +185,8 @@ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
ins_encode %{
|
||||
guarantee($mem$$disp == 0, "impossible encoding");
|
||||
Address ref_addr($mem$$Register);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1, true /* is_atomic */);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register, true /* is_atomic */);
|
||||
__ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register);
|
||||
z_uncolor(_masm, this, $res$$Register);
|
||||
%}
|
||||
@@ -191,10 +194,11 @@ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
|
||||
instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@@ -203,8 +207,8 @@ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
ins_encode %{
|
||||
guarantee($mem$$disp == 0, "impossible encoding");
|
||||
Address ref_addr($mem$$Register);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1, true /* is_atomic */);
|
||||
z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register);
|
||||
z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register, true /* is_atomic */);
|
||||
__ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register);
|
||||
z_uncolor(_masm, this, $res$$Register);
|
||||
%}
|
||||
@@ -212,17 +216,17 @@ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, KILL cr);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
format %{ "atomic_xchg $prev, $newv, [$mem], #@zGetAndSetP" %}
|
||||
|
||||
ins_encode %{
|
||||
z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, t1, true /* is_atomic */);
|
||||
z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, $tmp$$Register, true /* is_atomic */);
|
||||
__ atomic_xchg($prev$$Register, $prev$$Register, $mem$$Register);
|
||||
z_uncolor(_masm, this, $prev$$Register);
|
||||
%}
|
||||
@@ -230,17 +234,17 @@ instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr) %{
|
||||
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, KILL cr);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
format %{ "atomic_xchg_acq $prev, $newv, [$mem], #@zGetAndSetPAcq" %}
|
||||
|
||||
ins_encode %{
|
||||
z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, t1, true /* is_atomic */);
|
||||
z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, $tmp$$Register, true /* is_atomic */);
|
||||
__ atomic_xchgal($prev$$Register, $prev$$Register, $mem$$Register);
|
||||
z_uncolor(_masm, this, $prev$$Register);
|
||||
%}
|
||||
|
||||
@@ -50,6 +50,10 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
|
||||
|
||||
#define USE_POINTERS_TO_REGISTER_IMPL_ARRAY
|
||||
|
||||
// The expected size in bytes of a cache line.
|
||||
#define DEFAULT_CACHE_LINE_SIZE 64
|
||||
|
||||
// The default padding size for data structures to avoid false sharing.
|
||||
#define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE
|
||||
|
||||
#endif // CPU_RISCV_GLOBALDEFINITIONS_RISCV_HPP
|
||||
|
||||
@@ -105,6 +105,8 @@ define_pd_global(intx, InlineSmallCode, 1000);
|
||||
product(bool, UseZba, false, "Use Zba instructions") \
|
||||
product(bool, UseZbb, false, "Use Zbb instructions") \
|
||||
product(bool, UseZbs, false, "Use Zbs instructions") \
|
||||
product(bool, UseZfh, false, "Use Zfh instructions") \
|
||||
product(bool, UseZacas, false, EXPERIMENTAL, "Use Zacas instructions") \
|
||||
product(bool, UseZic64b, false, EXPERIMENTAL, "Use Zic64b instructions") \
|
||||
product(bool, UseZicbom, false, EXPERIMENTAL, "Use Zicbom instructions") \
|
||||
product(bool, UseZicbop, false, EXPERIMENTAL, "Use Zicbop instructions") \
|
||||
@@ -112,6 +114,8 @@ define_pd_global(intx, InlineSmallCode, 1000);
|
||||
product(bool, UseZtso, false, EXPERIMENTAL, "Assume Ztso memory model") \
|
||||
product(bool, UseZihintpause, false, EXPERIMENTAL, \
|
||||
"Use Zihintpause instructions") \
|
||||
product(bool, UseZvkn, false, EXPERIMENTAL, \
|
||||
"Use Zvkn group extension, Zvkned, Zvknhb, Zvkb, Zvkt") \
|
||||
product(bool, UseRVVForBigIntegerShiftIntrinsics, true, \
|
||||
"Use RVV instructions for left/right shift of BigInteger")
|
||||
|
||||
|
||||
@@ -777,7 +777,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
||||
assert(lock_offset == 0,
|
||||
"displached header must be first word in BasicObjectLock");
|
||||
|
||||
cmpxchg_obj_header(swap_reg, lock_reg, obj_reg, t0, count, /*fallthrough*/nullptr);
|
||||
cmpxchg_obj_header(swap_reg, lock_reg, obj_reg, tmp, count, /*fallthrough*/nullptr);
|
||||
|
||||
// Test if the oopMark is an obvious stack pointer, i.e.,
|
||||
// 1) (mark & 7) == 0, and
|
||||
@@ -891,7 +891,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg)
|
||||
beqz(header_reg, count);
|
||||
|
||||
// Atomic swap back the old header
|
||||
cmpxchg_obj_header(swap_reg, header_reg, obj_reg, t0, count, /*fallthrough*/nullptr);
|
||||
cmpxchg_obj_header(swap_reg, header_reg, obj_reg, tmp_reg, count, /*fallthrough*/nullptr);
|
||||
}
|
||||
|
||||
// Call the runtime routine for slow case.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
||||
* Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@@ -2725,27 +2725,36 @@ void MacroAssembler::safepoint_poll(Label& slow_path, bool at_return, bool acqui
|
||||
|
||||
void MacroAssembler::cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp,
|
||||
Label &succeed, Label *fail) {
|
||||
assert_different_registers(addr, tmp);
|
||||
assert_different_registers(newv, tmp);
|
||||
assert_different_registers(oldv, tmp);
|
||||
assert_different_registers(addr, tmp, t0);
|
||||
assert_different_registers(newv, tmp, t0);
|
||||
assert_different_registers(oldv, tmp, t0);
|
||||
|
||||
// oldv holds comparison value
|
||||
// newv holds value to write in exchange
|
||||
// addr identifies memory word to compare against/update
|
||||
Label retry_load, nope;
|
||||
bind(retry_load);
|
||||
// Load reserved from the memory location
|
||||
load_reserved(tmp, addr, int64, Assembler::aqrl);
|
||||
// Fail and exit if it is not what we expect
|
||||
bne(tmp, oldv, nope);
|
||||
// If the store conditional succeeds, tmp will be zero
|
||||
store_conditional(tmp, newv, addr, int64, Assembler::rl);
|
||||
beqz(tmp, succeed);
|
||||
// Retry only when the store conditional failed
|
||||
j(retry_load);
|
||||
if (UseZacas) {
|
||||
mv(tmp, oldv);
|
||||
atomic_cas(tmp, newv, addr, Assembler::int64, Assembler::aq, Assembler::rl);
|
||||
beq(tmp, oldv, succeed);
|
||||
} else {
|
||||
Label retry_load, nope;
|
||||
bind(retry_load);
|
||||
// Load reserved from the memory location
|
||||
load_reserved(tmp, addr, int64, Assembler::aqrl);
|
||||
// Fail and exit if it is not what we expect
|
||||
bne(tmp, oldv, nope);
|
||||
// If the store conditional succeeds, tmp will be zero
|
||||
store_conditional(tmp, newv, addr, int64, Assembler::rl);
|
||||
beqz(tmp, succeed);
|
||||
// Retry only when the store conditional failed
|
||||
j(retry_load);
|
||||
|
||||
bind(nope);
|
||||
bind(nope);
|
||||
}
|
||||
|
||||
// neither amocas nor lr/sc have an implied barrier in the failing case
|
||||
membar(AnyAny);
|
||||
|
||||
mv(oldv, tmp);
|
||||
if (fail != nullptr) {
|
||||
j(*fail);
|
||||
@@ -2771,7 +2780,7 @@ void MacroAssembler::load_reserved(Register dst,
|
||||
break;
|
||||
case uint32:
|
||||
lr_w(dst, addr, acquire);
|
||||
zero_extend(t0, t0, 32);
|
||||
zero_extend(dst, dst, 32);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
@@ -2819,7 +2828,7 @@ void MacroAssembler::cmpxchg_narrow_value_helper(Register addr, Register expecte
|
||||
}
|
||||
sll(mask, mask, shift);
|
||||
|
||||
xori(not_mask, mask, -1);
|
||||
notr(not_mask, mask);
|
||||
|
||||
sll(expected, expected, shift);
|
||||
andr(expected, expected, mask);
|
||||
@@ -2829,7 +2838,7 @@ void MacroAssembler::cmpxchg_narrow_value_helper(Register addr, Register expecte
|
||||
}
|
||||
|
||||
// cmpxchg_narrow_value will kill t0, t1, expected, new_val and tmps.
|
||||
// It's designed to implement compare and swap byte/boolean/char/short by lr.w/sc.w,
|
||||
// It's designed to implement compare and swap byte/boolean/char/short by lr.w/sc.w or amocas.w,
|
||||
// which are forced to work with 4-byte aligned address.
|
||||
void MacroAssembler::cmpxchg_narrow_value(Register addr, Register expected,
|
||||
Register new_val,
|
||||
@@ -2844,14 +2853,29 @@ void MacroAssembler::cmpxchg_narrow_value(Register addr, Register expected,
|
||||
Label retry, fail, done;
|
||||
|
||||
bind(retry);
|
||||
lr_w(old, aligned_addr, acquire);
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
sc_w(tmp, tmp, aligned_addr, release);
|
||||
bnez(tmp, retry);
|
||||
if (UseZacas) {
|
||||
lw(old, aligned_addr);
|
||||
|
||||
// if old & mask != expected
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
|
||||
atomic_cas(old, tmp, aligned_addr, operand_size::int32, acquire, release);
|
||||
bne(tmp, old, retry);
|
||||
} else {
|
||||
lr_w(old, aligned_addr, acquire);
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
sc_w(tmp, tmp, aligned_addr, release);
|
||||
bnez(tmp, retry);
|
||||
}
|
||||
|
||||
if (result_as_bool) {
|
||||
mv(result, 1);
|
||||
@@ -2891,14 +2915,28 @@ void MacroAssembler::weak_cmpxchg_narrow_value(Register addr, Register expected,
|
||||
|
||||
Label fail, done;
|
||||
|
||||
lr_w(old, aligned_addr, acquire);
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
if (UseZacas) {
|
||||
lw(old, aligned_addr);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
sc_w(tmp, tmp, aligned_addr, release);
|
||||
bnez(tmp, fail);
|
||||
// if old & mask != expected
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
|
||||
atomic_cas(tmp, new_val, addr, operand_size::int32, acquire, release);
|
||||
bne(tmp, old, fail);
|
||||
} else {
|
||||
lr_w(old, aligned_addr, acquire);
|
||||
andr(tmp, old, mask);
|
||||
bne(tmp, expected, fail);
|
||||
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
sc_w(tmp, tmp, aligned_addr, release);
|
||||
bnez(tmp, fail);
|
||||
}
|
||||
|
||||
// Success
|
||||
mv(result, 1);
|
||||
@@ -2921,6 +2959,19 @@ void MacroAssembler::cmpxchg(Register addr, Register expected,
|
||||
assert_different_registers(expected, t0);
|
||||
assert_different_registers(new_val, t0);
|
||||
|
||||
if (UseZacas) {
|
||||
if (result_as_bool) {
|
||||
mv(t0, expected);
|
||||
atomic_cas(t0, new_val, addr, size, acquire, release);
|
||||
xorr(t0, t0, expected);
|
||||
seqz(result, t0);
|
||||
} else {
|
||||
mv(result, expected);
|
||||
atomic_cas(result, new_val, addr, size, acquire, release);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Label retry_load, done, ne_done;
|
||||
bind(retry_load);
|
||||
load_reserved(t0, addr, size, acquire);
|
||||
@@ -2952,6 +3003,11 @@ void MacroAssembler::cmpxchg_weak(Register addr, Register expected,
|
||||
enum operand_size size,
|
||||
Assembler::Aqrl acquire, Assembler::Aqrl release,
|
||||
Register result) {
|
||||
if (UseZacas) {
|
||||
cmpxchg(addr, expected, new_val, size, acquire, release, result, true);
|
||||
return;
|
||||
}
|
||||
|
||||
assert_different_registers(addr, t0);
|
||||
assert_different_registers(expected, t0);
|
||||
assert_different_registers(new_val, t0);
|
||||
@@ -3018,6 +3074,89 @@ ATOMIC_XCHGU(xchgalwu, xchgalw)
|
||||
|
||||
#undef ATOMIC_XCHGU
|
||||
|
||||
#define ATOMIC_CAS(OP, AOP, ACQUIRE, RELEASE) \
|
||||
void MacroAssembler::atomic_##OP(Register prev, Register newv, Register addr) { \
|
||||
assert(UseZacas, "invariant"); \
|
||||
prev = prev->is_valid() ? prev : zr; \
|
||||
AOP(prev, addr, newv, (Assembler::Aqrl)(ACQUIRE | RELEASE)); \
|
||||
return; \
|
||||
}
|
||||
|
||||
ATOMIC_CAS(cas, amocas_d, Assembler::relaxed, Assembler::relaxed)
|
||||
ATOMIC_CAS(casw, amocas_w, Assembler::relaxed, Assembler::relaxed)
|
||||
ATOMIC_CAS(casl, amocas_d, Assembler::relaxed, Assembler::rl)
|
||||
ATOMIC_CAS(caslw, amocas_w, Assembler::relaxed, Assembler::rl)
|
||||
ATOMIC_CAS(casal, amocas_d, Assembler::aq, Assembler::rl)
|
||||
ATOMIC_CAS(casalw, amocas_w, Assembler::aq, Assembler::rl)
|
||||
|
||||
#undef ATOMIC_CAS
|
||||
|
||||
#define ATOMIC_CASU(OP1, OP2) \
|
||||
void MacroAssembler::atomic_##OP1(Register prev, Register newv, Register addr) { \
|
||||
atomic_##OP2(prev, newv, addr); \
|
||||
zero_extend(prev, prev, 32); \
|
||||
return; \
|
||||
}
|
||||
|
||||
ATOMIC_CASU(caswu, casw)
|
||||
ATOMIC_CASU(caslwu, caslw)
|
||||
ATOMIC_CASU(casalwu, casalw)
|
||||
|
||||
#undef ATOMIC_CASU
|
||||
|
||||
void MacroAssembler::atomic_cas(
|
||||
Register prev, Register newv, Register addr, enum operand_size size, Assembler::Aqrl acquire, Assembler::Aqrl release) {
|
||||
switch (size) {
|
||||
case int64:
|
||||
switch ((Assembler::Aqrl)(acquire | release)) {
|
||||
case Assembler::relaxed:
|
||||
atomic_cas(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::rl:
|
||||
atomic_casl(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::aqrl:
|
||||
atomic_casal(prev, newv, addr);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
break;
|
||||
case int32:
|
||||
switch ((Assembler::Aqrl)(acquire | release)) {
|
||||
case Assembler::relaxed:
|
||||
atomic_casw(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::rl:
|
||||
atomic_caslw(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::aqrl:
|
||||
atomic_casalw(prev, newv, addr);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
break;
|
||||
case uint32:
|
||||
switch ((Assembler::Aqrl)(acquire | release)) {
|
||||
case Assembler::relaxed:
|
||||
atomic_caswu(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::rl:
|
||||
atomic_caslwu(prev, newv, addr);
|
||||
break;
|
||||
case Assembler::aqrl:
|
||||
atomic_casalwu(prev, newv, addr);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
|
||||
void MacroAssembler::far_jump(const Address &entry, Register tmp) {
|
||||
assert(ReservedCodeCacheSize < 4*G, "branch out of range");
|
||||
assert(CodeCache::find_blob(entry.target()) != nullptr,
|
||||
@@ -4342,6 +4481,57 @@ void MacroAssembler::zero_dcache_blocks(Register base, Register cnt, Register tm
|
||||
bge(cnt, tmp1, loop);
|
||||
}
|
||||
|
||||
// java.lang.Math.round(float a)
|
||||
// Returns the closest int to the argument, with ties rounding to positive infinity.
|
||||
void MacroAssembler::java_round_float(Register dst, FloatRegister src, FloatRegister ftmp) {
|
||||
// this instructions calling sequence provides performance improvement on all tested devices;
|
||||
// don't change it without re-verification
|
||||
Label done;
|
||||
mv(t0, jint_cast(0.5f));
|
||||
fmv_w_x(ftmp, t0);
|
||||
|
||||
// dst = 0 if NaN
|
||||
feq_s(t0, src, src); // replacing fclass with feq as performance optimization
|
||||
mv(dst, zr);
|
||||
beqz(t0, done);
|
||||
|
||||
// dst = (src + 0.5f) rounded down towards negative infinity
|
||||
// Adding 0.5f to some floats exceeds the precision limits for a float and rounding takes place.
|
||||
// RDN is required for fadd_s, RNE gives incorrect results:
|
||||
// --------------------------------------------------------------------
|
||||
// fadd.s rne (src + 0.5f): src = 8388609.000000 ftmp = 8388610.000000
|
||||
// fcvt.w.s rdn: ftmp = 8388610.000000 dst = 8388610
|
||||
// --------------------------------------------------------------------
|
||||
// fadd.s rdn (src + 0.5f): src = 8388609.000000 ftmp = 8388609.000000
|
||||
// fcvt.w.s rdn: ftmp = 8388609.000000 dst = 8388609
|
||||
// --------------------------------------------------------------------
|
||||
fadd_s(ftmp, src, ftmp, RoundingMode::rdn);
|
||||
fcvt_w_s(dst, ftmp, RoundingMode::rdn);
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
// java.lang.Math.round(double a)
|
||||
// Returns the closest long to the argument, with ties rounding to positive infinity.
|
||||
void MacroAssembler::java_round_double(Register dst, FloatRegister src, FloatRegister ftmp) {
|
||||
// this instructions calling sequence provides performance improvement on all tested devices;
|
||||
// don't change it without re-verification
|
||||
Label done;
|
||||
mv(t0, julong_cast(0.5));
|
||||
fmv_d_x(ftmp, t0);
|
||||
|
||||
// dst = 0 if NaN
|
||||
feq_d(t0, src, src); // replacing fclass with feq as performance optimization
|
||||
mv(dst, zr);
|
||||
beqz(t0, done);
|
||||
|
||||
// dst = (src + 0.5) rounded down towards negative infinity
|
||||
fadd_d(ftmp, src, ftmp, RoundingMode::rdn); // RDN is required here otherwise some inputs produce incorrect results
|
||||
fcvt_l_d(dst, ftmp, RoundingMode::rdn);
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
#define FCVT_SAFE(FLOATCVT, FLOATSIG) \
|
||||
void MacroAssembler::FLOATCVT##_safe(Register dst, FloatRegister src, Register tmp) { \
|
||||
Label done; \
|
||||
@@ -4488,41 +4678,54 @@ void MacroAssembler::shadd(Register Rd, Register Rs1, Register Rs2, Register tmp
|
||||
}
|
||||
|
||||
void MacroAssembler::zero_extend(Register dst, Register src, int bits) {
|
||||
if (UseZba && bits == 32) {
|
||||
zext_w(dst, src);
|
||||
return;
|
||||
}
|
||||
|
||||
if (UseZbb && bits == 16) {
|
||||
zext_h(dst, src);
|
||||
return;
|
||||
}
|
||||
|
||||
if (bits == 8) {
|
||||
zext_b(dst, src);
|
||||
} else {
|
||||
slli(dst, src, XLEN - bits);
|
||||
srli(dst, dst, XLEN - bits);
|
||||
switch (bits) {
|
||||
case 32:
|
||||
if (UseZba) {
|
||||
zext_w(dst, src);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
if (UseZbb) {
|
||||
zext_h(dst, src);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
if (UseZbb) {
|
||||
zext_b(dst, src);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
slli(dst, src, XLEN - bits);
|
||||
srli(dst, dst, XLEN - bits);
|
||||
}
|
||||
|
||||
void MacroAssembler::sign_extend(Register dst, Register src, int bits) {
|
||||
if (UseZbb) {
|
||||
if (bits == 8) {
|
||||
sext_b(dst, src);
|
||||
switch (bits) {
|
||||
case 32:
|
||||
sext_w(dst, src);
|
||||
return;
|
||||
} else if (bits == 16) {
|
||||
sext_h(dst, src);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (bits == 32) {
|
||||
sext_w(dst, src);
|
||||
} else {
|
||||
slli(dst, src, XLEN - bits);
|
||||
srai(dst, dst, XLEN - bits);
|
||||
case 16:
|
||||
if (UseZbb) {
|
||||
sext_h(dst, src);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
if (UseZbb) {
|
||||
sext_b(dst, src);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
slli(dst, src, XLEN - bits);
|
||||
srai(dst, dst, XLEN - bits);
|
||||
}
|
||||
|
||||
void MacroAssembler::cmp_x2i(Register dst, Register src1, Register src2,
|
||||
@@ -4701,9 +4904,9 @@ void MacroAssembler::object_move(OopMap* map,
|
||||
|
||||
// A float arg may have to do float reg int reg conversion
|
||||
void MacroAssembler::float_move(VMRegPair src, VMRegPair dst, Register tmp) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg() ||
|
||||
src.first()->is_stack() && dst.first()->is_reg(), "Unexpected error");
|
||||
assert((src.first()->is_stack() && dst.first()->is_stack()) ||
|
||||
(src.first()->is_reg() && dst.first()->is_reg()) ||
|
||||
(src.first()->is_stack() && dst.first()->is_reg()), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
lwu(tmp, Address(fp, reg2offset_in(src.first())));
|
||||
@@ -4745,9 +4948,9 @@ void MacroAssembler::long_move(VMRegPair src, VMRegPair dst, Register tmp) {
|
||||
|
||||
// A double move
|
||||
void MacroAssembler::double_move(VMRegPair src, VMRegPair dst, Register tmp) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg() ||
|
||||
src.first()->is_stack() && dst.first()->is_reg(), "Unexpected error");
|
||||
assert((src.first()->is_stack() && dst.first()->is_stack()) ||
|
||||
(src.first()->is_reg() && dst.first()->is_reg()) ||
|
||||
(src.first()->is_stack() && dst.first()->is_reg()), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
ld(tmp, Address(fp, reg2offset_in(src.first())));
|
||||
|
||||
@@ -473,7 +473,11 @@ class MacroAssembler: public Assembler {
|
||||
}
|
||||
|
||||
inline void notr(Register Rd, Register Rs) {
|
||||
xori(Rd, Rs, -1);
|
||||
if (do_compress_zcb(Rd, Rs) && (Rd == Rs)) {
|
||||
c_not(Rd);
|
||||
} else {
|
||||
xori(Rd, Rs, -1);
|
||||
}
|
||||
}
|
||||
|
||||
inline void neg(Register Rd, Register Rs) {
|
||||
@@ -489,7 +493,11 @@ class MacroAssembler: public Assembler {
|
||||
}
|
||||
|
||||
inline void zext_b(Register Rd, Register Rs) {
|
||||
andi(Rd, Rs, 0xFF);
|
||||
if (do_compress_zcb(Rd, Rs) && (Rd == Rs)) {
|
||||
c_zext_b(Rd);
|
||||
} else {
|
||||
andi(Rd, Rs, 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
inline void seqz(Register Rd, Register Rs) {
|
||||
@@ -511,7 +519,12 @@ class MacroAssembler: public Assembler {
|
||||
// Bit-manipulation extension pseudo instructions
|
||||
// zero extend word
|
||||
inline void zext_w(Register Rd, Register Rs) {
|
||||
add_uw(Rd, Rs, zr);
|
||||
assert(UseZba, "must be");
|
||||
if (do_compress_zcb(Rd, Rs) && (Rd == Rs)) {
|
||||
c_zext_w(Rd);
|
||||
} else {
|
||||
add_uw(Rd, Rs, zr);
|
||||
}
|
||||
}
|
||||
|
||||
// Floating-point data-processing pseudo instructions
|
||||
@@ -1063,6 +1076,19 @@ public:
|
||||
void atomic_xchgwu(Register prev, Register newv, Register addr);
|
||||
void atomic_xchgalwu(Register prev, Register newv, Register addr);
|
||||
|
||||
void atomic_cas(Register prev, Register newv, Register addr);
|
||||
void atomic_casw(Register prev, Register newv, Register addr);
|
||||
void atomic_casl(Register prev, Register newv, Register addr);
|
||||
void atomic_caslw(Register prev, Register newv, Register addr);
|
||||
void atomic_casal(Register prev, Register newv, Register addr);
|
||||
void atomic_casalw(Register prev, Register newv, Register addr);
|
||||
void atomic_caswu(Register prev, Register newv, Register addr);
|
||||
void atomic_caslwu(Register prev, Register newv, Register addr);
|
||||
void atomic_casalwu(Register prev, Register newv, Register addr);
|
||||
|
||||
void atomic_cas(Register prev, Register newv, Register addr, enum operand_size size,
|
||||
Assembler::Aqrl acquire = Assembler::relaxed, Assembler::Aqrl release = Assembler::relaxed);
|
||||
|
||||
// Emit a far call/jump. Only invalidates the tmp register which
|
||||
// is used to keep the entry address for jalr.
|
||||
// The address must be inside the code cache.
|
||||
@@ -1252,6 +1278,9 @@ public:
|
||||
void fcvt_w_d_safe(Register dst, FloatRegister src, Register tmp = t0);
|
||||
void fcvt_l_d_safe(Register dst, FloatRegister src, Register tmp = t0);
|
||||
|
||||
void java_round_float(Register dst, FloatRegister src, FloatRegister ftmp);
|
||||
void java_round_double(Register dst, FloatRegister src, FloatRegister ftmp);
|
||||
|
||||
// vector load/store unit-stride instructions
|
||||
void vlex_v(VectorRegister vd, Register base, Assembler::SEW sew, VectorMask vm = unmasked) {
|
||||
switch (sew) {
|
||||
@@ -1345,6 +1374,16 @@ public:
|
||||
vmfle_vv(vd, vs1, vs2, vm);
|
||||
}
|
||||
|
||||
inline void vmsltu_vi(VectorRegister Vd, VectorRegister Vs2, uint32_t imm, VectorMask vm = unmasked) {
|
||||
guarantee(imm >= 1 && imm <= 16, "imm is invalid");
|
||||
vmsleu_vi(Vd, Vs2, imm-1, vm);
|
||||
}
|
||||
|
||||
inline void vmsgeu_vi(VectorRegister Vd, VectorRegister Vs2, uint32_t imm, VectorMask vm = unmasked) {
|
||||
guarantee(imm >= 1 && imm <= 16, "imm is invalid");
|
||||
vmsgtu_vi(Vd, Vs2, imm-1, vm);
|
||||
}
|
||||
|
||||
// Copy mask register
|
||||
inline void vmmv_m(VectorRegister vd, VectorRegister vs) {
|
||||
vmand_mm(vd, vs, vs);
|
||||
@@ -1360,6 +1399,10 @@ public:
|
||||
vmxnor_mm(vd, vd, vd);
|
||||
}
|
||||
|
||||
inline void vnot_v(VectorRegister Vd, VectorRegister Vs, VectorMask vm = unmasked) {
|
||||
vxor_vi(Vd, Vs, -1, vm);
|
||||
}
|
||||
|
||||
static const int zero_words_block_size;
|
||||
|
||||
void cast_primitive_type(BasicType type, Register Rt) {
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.hpp"
|
||||
#include "code/compiledIC.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "nativeInst_riscv.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#include "runtime/handles.hpp"
|
||||
@@ -157,7 +156,6 @@ void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) {
|
||||
CompiledICLocker::is_safe(addr_at(0)),
|
||||
"concurrent code patching");
|
||||
|
||||
ResourceMark rm;
|
||||
address addr_call = addr_at(0);
|
||||
assert(NativeCall::is_call_at(addr_call), "unexpected code at call site");
|
||||
|
||||
@@ -451,16 +449,27 @@ void NativePostCallNop::make_deopt() {
|
||||
NativeDeoptInstruction::insert(addr_at(0));
|
||||
}
|
||||
|
||||
int NativePostCallNop::displacement() const {
|
||||
bool NativePostCallNop::decode(int32_t& oopmap_slot, int32_t& cb_offset) const {
|
||||
// Discard the high 32 bits
|
||||
return (int)(intptr_t)MacroAssembler::get_target_of_li32(addr_at(4));
|
||||
int32_t data = (int32_t)(intptr_t)MacroAssembler::get_target_of_li32(addr_at(4));
|
||||
if (data == 0) {
|
||||
return false; // no information encoded
|
||||
}
|
||||
cb_offset = (data & 0xffffff);
|
||||
oopmap_slot = (data >> 24) & 0xff;
|
||||
return true; // decoding succeeded
|
||||
}
|
||||
|
||||
void NativePostCallNop::patch(jint diff) {
|
||||
assert(diff != 0, "must be");
|
||||
bool NativePostCallNop::patch(int32_t oopmap_slot, int32_t cb_offset) {
|
||||
if (((oopmap_slot & 0xff) != oopmap_slot) || ((cb_offset & 0xffffff) != cb_offset)) {
|
||||
return false; // cannot encode
|
||||
}
|
||||
int32_t data = (oopmap_slot << 24) | cb_offset;
|
||||
assert(data != 0, "must be");
|
||||
assert(is_lui_to_zr_at(addr_at(4)) && is_addiw_to_zr_at(addr_at(8)), "must be");
|
||||
|
||||
MacroAssembler::patch_imm_in_li32(addr_at(4), diff);
|
||||
MacroAssembler::patch_imm_in_li32(addr_at(4), data);
|
||||
return true; // successfully encoded
|
||||
}
|
||||
|
||||
void NativeDeoptInstruction::verify() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user