mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-12 12:29:41 +01:00
Compare commits
575 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fb9e3d674 | ||
|
|
9cccf0515e | ||
|
|
be7cc1c2b0 | ||
|
|
fbd15b2087 | ||
|
|
299a8ee68d | ||
|
|
3a1f4d0f48 | ||
|
|
18e24d0619 | ||
|
|
a3a2b1fbbf | ||
|
|
a9c6e87c6a | ||
|
|
1ecf74c296 | ||
|
|
c3a632dca7 | ||
|
|
77ee7f0e24 | ||
|
|
4abb10eb0b | ||
|
|
3bffe223a3 | ||
|
|
e0d98dd301 | ||
|
|
f2f634448e | ||
|
|
1797efd68d | ||
|
|
0f5f3c9b97 | ||
|
|
4b1e367eda | ||
|
|
96eb0390d6 | ||
|
|
2d252ee06e | ||
|
|
b814c3184e | ||
|
|
50b17d9846 | ||
|
|
51d7169bd9 | ||
|
|
fd89b334c4 | ||
|
|
d1c82156ba | ||
|
|
f356970b89 | ||
|
|
b75c134fac | ||
|
|
4cd318756d | ||
|
|
b02599d22e | ||
|
|
6d911f68a3 | ||
|
|
542b0b6656 | ||
|
|
9ee9f28849 | ||
|
|
729ae1d787 | ||
|
|
e0fd3f4dab | ||
|
|
f1f93988fb | ||
|
|
ab3b941783 | ||
|
|
f31957e6a1 | ||
|
|
fd3042a04b | ||
|
|
209d87a856 | ||
|
|
7777eb5e15 | ||
|
|
51853f7488 | ||
|
|
c3adc61e6e | ||
|
|
1993652653 | ||
|
|
55c1446b68 | ||
|
|
19e92201b4 | ||
|
|
89e6a02e3b | ||
|
|
d395ac2879 | ||
|
|
51671c0b92 | ||
|
|
cdf918b1d0 | ||
|
|
4da28b40f0 | ||
|
|
0377f1abe1 | ||
|
|
df35462a4e | ||
|
|
af32262c28 | ||
|
|
85e320121e | ||
|
|
8796f43c6c | ||
|
|
80642dd7af | ||
|
|
692c9f8821 | ||
|
|
ed068469f3 | ||
|
|
a18b03b86f | ||
|
|
7476e29053 | ||
|
|
63cb1f8818 | ||
|
|
f613e13397 | ||
|
|
adc3604027 | ||
|
|
1ae851387f | ||
|
|
38c01971ff | ||
|
|
6787c4c3dd | ||
|
|
91d8dac9cf | ||
|
|
783ae56634 | ||
|
|
d3c3194ac3 | ||
|
|
144a08ee50 | ||
|
|
b3ecd55601 | ||
|
|
192349eee4 | ||
|
|
6b09a79d64 | ||
|
|
70e7cdcb9e | ||
|
|
ac1cd31949 | ||
|
|
8e45182357 | ||
|
|
cab74b075e | ||
|
|
6b84f9bb3e | ||
|
|
cd11059f10 | ||
|
|
d9331bfd49 | ||
|
|
68206b533b | ||
|
|
1aba78f272 | ||
|
|
a663248786 | ||
|
|
a2229b18bf | ||
|
|
432756b6e5 | ||
|
|
fe78c0f191 | ||
|
|
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
|
||||
|
||||
6
.github/actions/get-jtreg/action.yml
vendored
6
.github/actions/get-jtreg/action.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# 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
|
||||
@@ -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 }}
|
||||
@@ -57,7 +57,7 @@ runs:
|
||||
- name: 'Build JTReg'
|
||||
run: |
|
||||
# Build JTReg and move files to the proper locations
|
||||
bash make/build.sh --jdk "$JAVA_HOME_17_X64"
|
||||
bash make/build.sh --jdk "$(realpath bootjdk/jdk)"
|
||||
mkdir ../installed
|
||||
mv build/images/jtreg/* ../installed
|
||||
working-directory: jtreg/src
|
||||
|
||||
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') }}
|
||||
|
||||
11
.github/workflows/build-macos.yml
vendored
11
.github/workflows/build-macos.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2022, 2023, 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
|
||||
@@ -31,6 +31,9 @@ on:
|
||||
platform:
|
||||
required: true
|
||||
type: string
|
||||
runs-on:
|
||||
required: true
|
||||
type: string
|
||||
extra-conf-options:
|
||||
required: false
|
||||
type: string
|
||||
@@ -55,7 +58,7 @@ on:
|
||||
jobs:
|
||||
build-macos:
|
||||
name: build
|
||||
runs-on: macos-13
|
||||
runs-on: ${{ inputs.runs-on }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -74,7 +77,7 @@ jobs:
|
||||
id: bootjdk
|
||||
uses: ./.github/actions/get-bootjdk
|
||||
with:
|
||||
platform: macos-x64
|
||||
platform: ${{ inputs.platform }}
|
||||
|
||||
- name: 'Get JTReg'
|
||||
id: jtreg
|
||||
@@ -87,7 +90,7 @@ jobs:
|
||||
- name: 'Install toolchain and dependencies'
|
||||
run: |
|
||||
# Run Homebrew installation and xcode-select
|
||||
brew install make
|
||||
brew install autoconf make
|
||||
sudo xcode-select --switch /Applications/Xcode_${{ inputs.xcode-toolset-version }}.app/Contents/Developer
|
||||
# This will make GNU make available as 'make' and not only as 'gmake'
|
||||
echo '/usr/local/opt/make/libexec/gnubin' >> $GITHUB_PATH
|
||||
|
||||
17
.github/workflows/main.yml
vendored
17
.github/workflows/main.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2022, 2023, 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
|
||||
@@ -228,6 +228,7 @@ jobs:
|
||||
uses: ./.github/workflows/build-macos.yml
|
||||
with:
|
||||
platform: macos-x64
|
||||
runs-on: 'macos-13'
|
||||
xcode-toolset-version: '14.3.1'
|
||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||
@@ -239,8 +240,8 @@ jobs:
|
||||
uses: ./.github/workflows/build-macos.yml
|
||||
with:
|
||||
platform: macos-aarch64
|
||||
runs-on: 'macos-14'
|
||||
xcode-toolset-version: '14.3.1'
|
||||
extra-conf-options: '--openjdk-target=aarch64-apple-darwin'
|
||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||
if: needs.select.outputs.macos-aarch64 == 'true'
|
||||
@@ -321,6 +322,16 @@ jobs:
|
||||
bootjdk-platform: macos-x64
|
||||
runs-on: macos-13
|
||||
|
||||
test-macos-aarch64:
|
||||
name: macos-aarch64
|
||||
needs:
|
||||
- build-macos-aarch64
|
||||
uses: ./.github/workflows/test.yml
|
||||
with:
|
||||
platform: macos-aarch64
|
||||
bootjdk-platform: macos-aarch64
|
||||
runs-on: macos-14
|
||||
|
||||
test-windows-x64:
|
||||
name: windows-x64
|
||||
needs:
|
||||
@@ -357,7 +368,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"] }'
|
||||
|
||||
|
||||
11
.github/workflows/test.yml
vendored
11
.github/workflows/test.yml
vendored
@@ -63,6 +63,7 @@ jobs:
|
||||
- 'hs/tier1 compiler part 1'
|
||||
- 'hs/tier1 compiler part 2'
|
||||
- 'hs/tier1 compiler part 3'
|
||||
- 'hs/tier1 compiler not-xcomp'
|
||||
- 'hs/tier1 gc'
|
||||
- 'hs/tier1 runtime'
|
||||
- 'hs/tier1 serviceability'
|
||||
@@ -90,13 +91,17 @@ jobs:
|
||||
debug-suffix: -debug
|
||||
|
||||
- test-name: 'hs/tier1 compiler part 2'
|
||||
test-suite: 'test/hotspot/jtreg/:tier1_compiler_2 test/hotspot/jtreg/:tier1_compiler_not_xcomp'
|
||||
test-suite: 'test/hotspot/jtreg/:tier1_compiler_2'
|
||||
debug-suffix: -debug
|
||||
|
||||
- test-name: 'hs/tier1 compiler part 3'
|
||||
test-suite: 'test/hotspot/jtreg/:tier1_compiler_3'
|
||||
debug-suffix: -debug
|
||||
|
||||
- test-name: 'hs/tier1 compiler not-xcomp'
|
||||
test-suite: 'test/hotspot/jtreg/:tier1_compiler_not_xcomp'
|
||||
debug-suffix: -debug
|
||||
|
||||
- test-name: 'hs/tier1 gc'
|
||||
test-suite: 'test/hotspot/jtreg/:tier1_gc'
|
||||
debug-suffix: -debug
|
||||
@@ -206,7 +211,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 +219,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
|
||||
@@ -123,6 +123,22 @@ AC_DEFUN_ONCE([BASIC_SETUP_BUILD_ENV],
|
||||
]
|
||||
)
|
||||
AC_SUBST(BUILD_ENV)
|
||||
|
||||
if test "x$LOCALE" != x; then
|
||||
# Check if we actually have C.UTF-8; if so, use it
|
||||
if $LOCALE -a | $GREP -q -E "^C\.(utf8|UTF-8)$"; then
|
||||
LOCALE_USED=C.UTF-8
|
||||
else
|
||||
AC_MSG_WARN([C.UTF-8 locale not found, using C locale])
|
||||
LOCALE_USED=C
|
||||
fi
|
||||
else
|
||||
AC_MSG_WARN([locale command not not found, using C locale])
|
||||
LOCALE_USED=C
|
||||
fi
|
||||
|
||||
export LC_ALL=$LOCALE_USED
|
||||
AC_SUBST(LOCALE_USED)
|
||||
])
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -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
|
||||
@@ -54,6 +54,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
|
||||
UTIL_REQUIRE_SPECIAL(SED, [AC_PROG_SED])
|
||||
|
||||
# Tools only needed on some platforms
|
||||
UTIL_LOOKUP_PROGS(LOCALE, locale)
|
||||
UTIL_LOOKUP_PROGS(PATHTOOL, cygpath wslpath)
|
||||
UTIL_LOOKUP_PROGS(CMD, cmd.exe, $PATH:/cygdrive/c/windows/system32:/mnt/c/windows/system32:/c/windows/system32)
|
||||
])
|
||||
|
||||
@@ -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,13 +479,13 @@ 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"
|
||||
CFLAGS_OS_DEF_JDK="-D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
|
||||
elif test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||
CFLAGS_OS_DEF_JVM="-DAIX"
|
||||
CFLAGS_OS_DEF_JVM="-DAIX -D_LARGE_FILES"
|
||||
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
|
||||
CFLAGS_OS_DEF_JDK="-D_ALLBSD_SOURCE"
|
||||
elif test "x$OPENJDK_TARGET_OS" = xwindows; then
|
||||
|
||||
@@ -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
|
||||
@@ -56,8 +56,8 @@ COMMA := ,
|
||||
# What make to use for main processing, after bootstrapping top-level Makefile.
|
||||
MAKE := @MAKE@
|
||||
|
||||
# Make sure all shell commands are executed with the C locale
|
||||
export LC_ALL := C
|
||||
# Make sure all shell commands are executed with a proper locale
|
||||
export LC_ALL := @LOCALE_USED@
|
||||
|
||||
# Make sure we override any local CLASSPATH variable
|
||||
export CLASSPATH := @CLASSPATH@
|
||||
@@ -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
|
||||
])
|
||||
|
||||
@@ -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
|
||||
@@ -36,6 +36,10 @@ MACOS_X64_BOOT_JDK_EXT=tar.gz
|
||||
MACOS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_macos-x64_bin.tar.gz
|
||||
MACOS_X64_BOOT_JDK_SHA256=af32e84c11009f72f783fdcdc9917efc277893988f097e198e2576875d1e88c1
|
||||
|
||||
MACOS_AARCH64_BOOT_JDK_EXT=tar.gz
|
||||
MACOS_AARCH64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_macos-aarch64_bin.tar.gz
|
||||
MACOS_AARCH64_BOOT_JDK_SHA256=f12e1e0a2dffc847951598f597c8ee60fb0913932f24b2b09c62cfd2f0f4dfb9
|
||||
|
||||
WINDOWS_X64_BOOT_JDK_EXT=zip
|
||||
WINDOWS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_windows-x64_bin.zip
|
||||
WINDOWS_X64_BOOT_JDK_SHA256=5434faaf029e66e7ce6e75770ca384de476750984a7d2881ef7686894c4b4944
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -51,7 +51,7 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
endif
|
||||
|
||||
# Set the C++ standard
|
||||
ADLC_CFLAGS += $(ADLC_LANGSTD_CXXFLAG)
|
||||
ADLC_CFLAGS += $(ADLC_LANGSTD_CXXFLAGS)
|
||||
|
||||
# NOTE: The old build didn't set -DASSERT for windows but it doesn't seem to
|
||||
# hurt.
|
||||
|
||||
@@ -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) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 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
|
||||
@@ -35,6 +35,7 @@ import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.net.InetAddress;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
@@ -132,6 +133,8 @@ public class HelloClasslist {
|
||||
String oldDate = String.format("%s%n",
|
||||
DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ROOT)
|
||||
.format(new Date()));
|
||||
StandardCharsets.US_ASCII.encode("");
|
||||
StandardCharsets.UTF_8.encode("");
|
||||
|
||||
// A selection of trivial and common reflection operations
|
||||
var instance = HelloClasslist.class.getConstructor().newInstance();
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -23,7 +23,11 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
DISABLED_WARNINGS_java += this-escape restricted
|
||||
# The base module should be built with all warnings enabled. When a
|
||||
# new warning is added to javac, it can be temporarily added to the
|
||||
# disabled warnings list.
|
||||
#
|
||||
# DISABLED_WARNINGS_java +=
|
||||
|
||||
DOCLINT += -Xdoclint:all/protected \
|
||||
'-Xdoclint/package:java.*,javax.*'
|
||||
@@ -37,7 +41,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
|
||||
|
||||
@@ -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
|
||||
@@ -23,6 +23,10 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# To the extent technically possible, this module should be built with
|
||||
# -Werror and all lint warnings enabled. In particular,
|
||||
# DISABLED_WARNINGS_java should not be augmented.
|
||||
|
||||
DOCLINT += -Xdoclint:all/protected \
|
||||
'-Xdoclint/package:java.*,javax.*'
|
||||
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
@@ -23,6 +23,10 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# To the extent technically possible, this module should be built with
|
||||
# -Werror and all lint warnings enabled. In particular,
|
||||
# DISABLED_WARNINGS_java should not be augmented.
|
||||
|
||||
DOCLINT += -Xdoclint:all/protected \
|
||||
'-Xdoclint/package:-com.sun.tools.*,-jdk.internal.*,sun.tools.serialver.resources.*'
|
||||
JAVAC_FLAGS += -XDstringConcat=inline
|
||||
|
||||
@@ -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
|
||||
@@ -23,6 +23,8 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
DISABLED_WARNINGS_java += this-escape
|
||||
# To the extent technically possible, this module should be built with
|
||||
# -Werror and all lint warnings enabled. In particular,
|
||||
# DISABLED_WARNINGS_java should not be augmented.
|
||||
|
||||
COPY += .xml .css .svg .js .js.template .png .txt
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
@@ -1237,7 +1237,7 @@ source %{
|
||||
|
||||
// r27 is not allocatable when compressed oops is on and heapbase is not
|
||||
// zero, compressed klass pointers doesn't use r27 after JDK-8234794
|
||||
if (UseCompressedOops && (CompressedOops::ptrs_base() != NULL)) {
|
||||
if (UseCompressedOops && (CompressedOops::ptrs_base() != nullptr)) {
|
||||
_NO_SPECIAL_REG32_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg()));
|
||||
_NO_SPECIAL_REG_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg()));
|
||||
_NO_SPECIAL_PTR_REG_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg()));
|
||||
@@ -1581,7 +1581,7 @@ bool needs_releasing_store(const Node *n)
|
||||
{
|
||||
// assert n->is_Store();
|
||||
StoreNode *st = n->as_Store();
|
||||
return st->trailing_membar() != NULL;
|
||||
return st->trailing_membar() != nullptr;
|
||||
}
|
||||
|
||||
// predicate controlling translation of CAS
|
||||
@@ -1593,9 +1593,9 @@ bool needs_acquiring_load_exclusive(const Node *n)
|
||||
assert(is_CAS(n->Opcode(), true), "expecting a compare and swap");
|
||||
LoadStoreNode* ldst = n->as_LoadStore();
|
||||
if (is_CAS(n->Opcode(), false)) {
|
||||
assert(ldst->trailing_membar() != NULL, "expected trailing membar");
|
||||
assert(ldst->trailing_membar() != nullptr, "expected trailing membar");
|
||||
} else {
|
||||
return ldst->trailing_membar() != NULL;
|
||||
return ldst->trailing_membar() != nullptr;
|
||||
}
|
||||
|
||||
// so we can just return true here
|
||||
@@ -1734,7 +1734,7 @@ void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
st->print("mov rscratch1, #%d\n\t", framesize - 2 * wordSize);
|
||||
st->print("sub sp, sp, rscratch1");
|
||||
}
|
||||
if (C->stub_function() == NULL && BarrierSet::barrier_set()->barrier_set_nmethod() != NULL) {
|
||||
if (C->stub_function() == nullptr && BarrierSet::barrier_set()->barrier_set_nmethod() != nullptr) {
|
||||
st->print("\n\t");
|
||||
st->print("ldr rscratch1, [guard]\n\t");
|
||||
st->print("dmb ishld\n\t");
|
||||
@@ -1783,9 +1783,9 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
|
||||
__ build_frame(framesize);
|
||||
|
||||
if (C->stub_function() == NULL) {
|
||||
if (C->stub_function() == nullptr) {
|
||||
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
||||
if (BarrierSet::barrier_set()->barrier_set_nmethod() != NULL) {
|
||||
if (BarrierSet::barrier_set()->barrier_set_nmethod() != nullptr) {
|
||||
// Dummy labels for just measuring the code size
|
||||
Label dummy_slow_path;
|
||||
Label dummy_continuation;
|
||||
@@ -2153,12 +2153,12 @@ void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
if (!ra_)
|
||||
st->print("N%d = SpillCopy(N%d)", _idx, in(1)->_idx);
|
||||
else
|
||||
implementation(NULL, ra_, false, st);
|
||||
implementation(nullptr, ra_, false, st);
|
||||
}
|
||||
#endif
|
||||
|
||||
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
implementation(&cbuf, ra_, false, NULL);
|
||||
implementation(&cbuf, ra_, false, nullptr);
|
||||
}
|
||||
|
||||
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
|
||||
@@ -2249,7 +2249,7 @@ int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf)
|
||||
// That's why we must use the macroassembler to generate a handler.
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
address base = __ start_a_stub(size_exception_handler());
|
||||
if (base == NULL) {
|
||||
if (base == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return 0; // CodeBuffer::expand failed
|
||||
}
|
||||
@@ -2267,7 +2267,7 @@ int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf)
|
||||
// That's why we must use the macroassembler to generate a handler.
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
address base = __ start_a_stub(size_deopt_handler());
|
||||
if (base == NULL) {
|
||||
if (base == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return 0; // CodeBuffer::expand failed
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -2410,7 +2410,7 @@ MachOper* Matcher::pd_specialize_generic_vector_operand(MachOper* generic_opnd,
|
||||
case Op_VecX: return new vecXOper();
|
||||
}
|
||||
ShouldNotReachHere();
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Matcher::is_reg2reg_move(MachNode* m) {
|
||||
@@ -2583,7 +2583,7 @@ Assembler::Condition to_assembler_cond(BoolTest::mask cond) {
|
||||
|
||||
// Binary src (Replicate con)
|
||||
bool is_valid_sve_arith_imm_pattern(Node* n, Node* m) {
|
||||
if (n == NULL || m == NULL) {
|
||||
if (n == nullptr || m == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2624,7 +2624,7 @@ bool is_valid_sve_arith_imm_pattern(Node* n, Node* m) {
|
||||
// (XorV src (Replicate m1))
|
||||
// (XorVMask src (MaskAll m1))
|
||||
bool is_vector_bitwise_not_pattern(Node* n, Node* m) {
|
||||
if (n != NULL && m != NULL) {
|
||||
if (n != nullptr && m != nullptr) {
|
||||
return (n->Opcode() == Op_XorV || n->Opcode() == Op_XorVMask) &&
|
||||
VectorNode::is_all_ones_vector(m);
|
||||
}
|
||||
@@ -3430,7 +3430,7 @@ encode %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
Register dst_reg = as_Register($dst$$reg);
|
||||
address con = (address)$src$$constant;
|
||||
if (con == NULL || con == (address)1) {
|
||||
if (con == nullptr || con == (address)1) {
|
||||
ShouldNotReachHere();
|
||||
} else {
|
||||
relocInfo::relocType rtype = $src->constant_reloc();
|
||||
@@ -3473,7 +3473,7 @@ encode %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
Register dst_reg = as_Register($dst$$reg);
|
||||
address con = (address)$src$$constant;
|
||||
if (con == NULL) {
|
||||
if (con == nullptr) {
|
||||
ShouldNotReachHere();
|
||||
} else {
|
||||
relocInfo::relocType rtype = $src->constant_reloc();
|
||||
@@ -3492,7 +3492,7 @@ encode %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
Register dst_reg = as_Register($dst$$reg);
|
||||
address con = (address)$src$$constant;
|
||||
if (con == NULL) {
|
||||
if (con == nullptr) {
|
||||
ShouldNotReachHere();
|
||||
} else {
|
||||
relocInfo::relocType rtype = $src->constant_reloc();
|
||||
@@ -3675,7 +3675,7 @@ encode %{
|
||||
Label miss;
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
__ check_klass_subtype_slow_path(sub_reg, super_reg, temp_reg, result_reg,
|
||||
NULL, &miss,
|
||||
nullptr, &miss,
|
||||
/*set_cond_codes:*/ true);
|
||||
if ($primary) {
|
||||
__ mov(result_reg, zr);
|
||||
@@ -3691,7 +3691,7 @@ encode %{
|
||||
if (!_method) {
|
||||
// A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
|
||||
call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type));
|
||||
if (call == NULL) {
|
||||
if (call == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -3705,7 +3705,7 @@ encode %{
|
||||
RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index)
|
||||
: static_call_Relocation::spec(method_index);
|
||||
call = __ trampoline_call(Address(addr, rspec));
|
||||
if (call == NULL) {
|
||||
if (call == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -3716,7 +3716,7 @@ encode %{
|
||||
} else {
|
||||
// Emit stub for static call
|
||||
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf, call);
|
||||
if (stub == NULL) {
|
||||
if (stub == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -3735,7 +3735,7 @@ encode %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
int method_index = resolved_method_index(cbuf);
|
||||
address call = __ ic_call((address)$meth$$method, method_index);
|
||||
if (call == NULL) {
|
||||
if (call == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -3764,7 +3764,7 @@ encode %{
|
||||
CodeBlob *cb = CodeCache::find_blob(entry);
|
||||
if (cb) {
|
||||
address call = __ trampoline_call(Address(entry, relocInfo::runtime_call_type));
|
||||
if (call == NULL) {
|
||||
if (call == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -4663,7 +4663,7 @@ operand immP()
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// NULL Pointer Immediate
|
||||
// Null Pointer Immediate
|
||||
operand immP0()
|
||||
%{
|
||||
predicate(n->get_ptr() == 0);
|
||||
@@ -4795,7 +4795,7 @@ operand immN()
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Narrow NULL Pointer Immediate
|
||||
// Narrow Null Pointer Immediate
|
||||
operand immN0()
|
||||
%{
|
||||
predicate(n->get_narrowcon() == 0);
|
||||
@@ -7219,7 +7219,7 @@ instruct loadConP0(iRegPNoSp dst, immP0 con)
|
||||
match(Set dst con);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "mov $dst, $con\t# NULL ptr" %}
|
||||
format %{ "mov $dst, $con\t# null pointer" %}
|
||||
|
||||
ins_encode(aarch64_enc_mov_p0(dst, con));
|
||||
|
||||
@@ -7233,7 +7233,7 @@ instruct loadConP1(iRegPNoSp dst, immP_1 con)
|
||||
match(Set dst con);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "mov $dst, $con\t# NULL ptr" %}
|
||||
format %{ "mov $dst, $con\t# null pointer" %}
|
||||
|
||||
ins_encode(aarch64_enc_mov_p1(dst, con));
|
||||
|
||||
@@ -7275,7 +7275,7 @@ instruct loadConN0(iRegNNoSp dst, immN0 con)
|
||||
match(Set dst con);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "mov $dst, $con\t# compressed NULL ptr" %}
|
||||
format %{ "mov $dst, $con\t# compressed null pointer" %}
|
||||
|
||||
ins_encode(aarch64_enc_mov_n0(dst, con));
|
||||
|
||||
@@ -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);
|
||||
%}
|
||||
@@ -15238,7 +15257,7 @@ instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlag
|
||||
|
||||
ins_encode %{
|
||||
address tpc = __ zero_words($base$$Register, $cnt$$Register);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -15259,7 +15278,7 @@ instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, iRegL_R11 temp, Universe d
|
||||
|
||||
ins_encode %{
|
||||
address tpc = __ zero_words($base$$Register, (uint64_t)$cnt$$constant);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -17086,23 +17105,7 @@ instruct string_equalsL(iRegP_R1 str1, iRegP_R3 str2, iRegI_R4 cnt,
|
||||
ins_encode %{
|
||||
// Count is in 8-bit bytes; non-Compact chars are 16 bits.
|
||||
__ string_equals($str1$$Register, $str2$$Register,
|
||||
$result$$Register, $cnt$$Register, 1);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
|
||||
instruct string_equalsU(iRegP_R1 str1, iRegP_R3 str2, iRegI_R4 cnt,
|
||||
iRegI_R0 result, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU);
|
||||
match(Set result (StrEquals (Binary str1 str2) cnt));
|
||||
effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL cr);
|
||||
|
||||
format %{ "String Equals $str1,$str2,$cnt -> $result" %}
|
||||
ins_encode %{
|
||||
// Count is in 8-bit bytes; non-Compact chars are 16 bits.
|
||||
__ string_equals($str1$$Register, $str2$$Register,
|
||||
$result$$Register, $cnt$$Register, 2);
|
||||
$result$$Register, $cnt$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
@@ -17124,7 +17127,7 @@ instruct array_equalsB(iRegP_R1 ary1, iRegP_R2 ary2, iRegI_R0 result,
|
||||
address tpc = __ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 1);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -17149,7 +17152,7 @@ instruct array_equalsC(iRegP_R1 ary1, iRegP_R2 ary2, iRegI_R0 result,
|
||||
address tpc = __ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 2);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -17164,7 +17167,7 @@ instruct count_positives(iRegP_R1 ary1, iRegI_R2 len, iRegI_R0 result, rFlagsReg
|
||||
format %{ "count positives byte[] $ary1,$len -> $result" %}
|
||||
ins_encode %{
|
||||
address tpc = __ count_positives($ary1$$Register, $len$$Register, $result$$Register);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -17207,7 +17210,7 @@ instruct string_inflate(Universe dummy, iRegP_R0 src, iRegP_R1 dst, iRegI_R2 len
|
||||
address tpc = __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register,
|
||||
$vtmp0$$FloatRegister, $vtmp1$$FloatRegister,
|
||||
$vtmp2$$FloatRegister, $tmp$$Register);
|
||||
if (tpc == NULL) {
|
||||
if (tpc == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) 2015, 2019, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -117,7 +117,7 @@ define_pd_global(intx, InlineSmallCode, 1000);
|
||||
"Use prfm hint with specified distance in compiled code." \
|
||||
"Value -1 means off.") \
|
||||
range(-1, 4096) \
|
||||
product(ccstr, OnSpinWaitInst, "none", DIAGNOSTIC, \
|
||||
product(ccstr, OnSpinWaitInst, "yield", DIAGNOSTIC, \
|
||||
"The instruction to use to implement " \
|
||||
"java.lang.Thread.onSpinWait()." \
|
||||
"Options: none, nop, isb, yield.") \
|
||||
@@ -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) {
|
||||
@@ -4258,108 +4265,117 @@ void MacroAssembler::kernel_crc32_common_fold_using_crypto_pmull(Register crc, R
|
||||
}
|
||||
add(table, table, table_offset);
|
||||
|
||||
// Registers v0..v7 are used as data registers.
|
||||
// Registers v16..v31 are used as tmp registers.
|
||||
sub(buf, buf, 0x10);
|
||||
ldrq(v1, Address(buf, 0x10));
|
||||
ldrq(v2, Address(buf, 0x20));
|
||||
ldrq(v3, Address(buf, 0x30));
|
||||
ldrq(v4, Address(buf, 0x40));
|
||||
ldrq(v5, Address(buf, 0x50));
|
||||
ldrq(v6, Address(buf, 0x60));
|
||||
ldrq(v7, Address(buf, 0x70));
|
||||
ldrq(v8, Address(pre(buf, 0x80)));
|
||||
ldrq(v0, Address(buf, 0x10));
|
||||
ldrq(v1, Address(buf, 0x20));
|
||||
ldrq(v2, Address(buf, 0x30));
|
||||
ldrq(v3, Address(buf, 0x40));
|
||||
ldrq(v4, Address(buf, 0x50));
|
||||
ldrq(v5, Address(buf, 0x60));
|
||||
ldrq(v6, Address(buf, 0x70));
|
||||
ldrq(v7, Address(pre(buf, 0x80)));
|
||||
|
||||
movi(v25, T4S, 0);
|
||||
mov(v25, S, 0, crc);
|
||||
eor(v1, T16B, v1, v25);
|
||||
movi(v31, T4S, 0);
|
||||
mov(v31, S, 0, crc);
|
||||
eor(v0, T16B, v0, v31);
|
||||
|
||||
ldrq(v0, Address(table));
|
||||
// Register v16 contains constants from the crc table.
|
||||
ldrq(v16, Address(table));
|
||||
b(CRC_by128_loop);
|
||||
|
||||
align(OptoLoopAlignment);
|
||||
BIND(CRC_by128_loop);
|
||||
pmull (v9, T1Q, v1, v0, T1D);
|
||||
pmull2(v10, T1Q, v1, v0, T2D);
|
||||
ldrq(v1, Address(buf, 0x10));
|
||||
eor3(v1, T16B, v9, v10, v1);
|
||||
pmull (v17, T1Q, v0, v16, T1D);
|
||||
pmull2(v18, T1Q, v0, v16, T2D);
|
||||
ldrq(v0, Address(buf, 0x10));
|
||||
eor3(v0, T16B, v17, v18, v0);
|
||||
|
||||
pmull (v11, T1Q, v2, v0, T1D);
|
||||
pmull2(v12, T1Q, v2, v0, T2D);
|
||||
ldrq(v2, Address(buf, 0x20));
|
||||
eor3(v2, T16B, v11, v12, v2);
|
||||
pmull (v19, T1Q, v1, v16, T1D);
|
||||
pmull2(v20, T1Q, v1, v16, T2D);
|
||||
ldrq(v1, Address(buf, 0x20));
|
||||
eor3(v1, T16B, v19, v20, v1);
|
||||
|
||||
pmull (v13, T1Q, v3, v0, T1D);
|
||||
pmull2(v14, T1Q, v3, v0, T2D);
|
||||
ldrq(v3, Address(buf, 0x30));
|
||||
eor3(v3, T16B, v13, v14, v3);
|
||||
pmull (v21, T1Q, v2, v16, T1D);
|
||||
pmull2(v22, T1Q, v2, v16, T2D);
|
||||
ldrq(v2, Address(buf, 0x30));
|
||||
eor3(v2, T16B, v21, v22, v2);
|
||||
|
||||
pmull (v15, T1Q, v4, v0, T1D);
|
||||
pmull2(v16, T1Q, v4, v0, T2D);
|
||||
ldrq(v4, Address(buf, 0x40));
|
||||
eor3(v4, T16B, v15, v16, v4);
|
||||
pmull (v23, T1Q, v3, v16, T1D);
|
||||
pmull2(v24, T1Q, v3, v16, T2D);
|
||||
ldrq(v3, Address(buf, 0x40));
|
||||
eor3(v3, T16B, v23, v24, v3);
|
||||
|
||||
pmull (v17, T1Q, v5, v0, T1D);
|
||||
pmull2(v18, T1Q, v5, v0, T2D);
|
||||
ldrq(v5, Address(buf, 0x50));
|
||||
eor3(v5, T16B, v17, v18, v5);
|
||||
pmull (v25, T1Q, v4, v16, T1D);
|
||||
pmull2(v26, T1Q, v4, v16, T2D);
|
||||
ldrq(v4, Address(buf, 0x50));
|
||||
eor3(v4, T16B, v25, v26, v4);
|
||||
|
||||
pmull (v19, T1Q, v6, v0, T1D);
|
||||
pmull2(v20, T1Q, v6, v0, T2D);
|
||||
ldrq(v6, Address(buf, 0x60));
|
||||
eor3(v6, T16B, v19, v20, v6);
|
||||
pmull (v27, T1Q, v5, v16, T1D);
|
||||
pmull2(v28, T1Q, v5, v16, T2D);
|
||||
ldrq(v5, Address(buf, 0x60));
|
||||
eor3(v5, T16B, v27, v28, v5);
|
||||
|
||||
pmull (v21, T1Q, v7, v0, T1D);
|
||||
pmull2(v22, T1Q, v7, v0, T2D);
|
||||
ldrq(v7, Address(buf, 0x70));
|
||||
eor3(v7, T16B, v21, v22, v7);
|
||||
pmull (v29, T1Q, v6, v16, T1D);
|
||||
pmull2(v30, T1Q, v6, v16, T2D);
|
||||
ldrq(v6, Address(buf, 0x70));
|
||||
eor3(v6, T16B, v29, v30, v6);
|
||||
|
||||
pmull (v23, T1Q, v8, v0, T1D);
|
||||
pmull2(v24, T1Q, v8, v0, T2D);
|
||||
ldrq(v8, Address(pre(buf, 0x80)));
|
||||
eor3(v8, T16B, v23, v24, v8);
|
||||
// Reuse registers v23, v24.
|
||||
// Using them won't block the first instruction of the next iteration.
|
||||
pmull (v23, T1Q, v7, v16, T1D);
|
||||
pmull2(v24, T1Q, v7, v16, T2D);
|
||||
ldrq(v7, Address(pre(buf, 0x80)));
|
||||
eor3(v7, T16B, v23, v24, v7);
|
||||
|
||||
subs(len, len, 0x80);
|
||||
br(Assembler::GE, CRC_by128_loop);
|
||||
|
||||
// fold into 512 bits
|
||||
ldrq(v0, Address(table, 0x10));
|
||||
// Use v31 for constants because v16 can be still in use.
|
||||
ldrq(v31, Address(table, 0x10));
|
||||
|
||||
pmull (v10, T1Q, v1, v0, T1D);
|
||||
pmull2(v11, T1Q, v1, v0, T2D);
|
||||
eor3(v1, T16B, v10, v11, v5);
|
||||
pmull (v17, T1Q, v0, v31, T1D);
|
||||
pmull2(v18, T1Q, v0, v31, T2D);
|
||||
eor3(v0, T16B, v17, v18, v4);
|
||||
|
||||
pmull (v12, T1Q, v2, v0, T1D);
|
||||
pmull2(v13, T1Q, v2, v0, T2D);
|
||||
eor3(v2, T16B, v12, v13, v6);
|
||||
pmull (v19, T1Q, v1, v31, T1D);
|
||||
pmull2(v20, T1Q, v1, v31, T2D);
|
||||
eor3(v1, T16B, v19, v20, v5);
|
||||
|
||||
pmull (v14, T1Q, v3, v0, T1D);
|
||||
pmull2(v15, T1Q, v3, v0, T2D);
|
||||
eor3(v3, T16B, v14, v15, v7);
|
||||
pmull (v21, T1Q, v2, v31, T1D);
|
||||
pmull2(v22, T1Q, v2, v31, T2D);
|
||||
eor3(v2, T16B, v21, v22, v6);
|
||||
|
||||
pmull (v16, T1Q, v4, v0, T1D);
|
||||
pmull2(v17, T1Q, v4, v0, T2D);
|
||||
eor3(v4, T16B, v16, v17, v8);
|
||||
pmull (v23, T1Q, v3, v31, T1D);
|
||||
pmull2(v24, T1Q, v3, v31, T2D);
|
||||
eor3(v3, T16B, v23, v24, v7);
|
||||
|
||||
// fold into 128 bits
|
||||
ldrq(v5, Address(table, 0x20));
|
||||
pmull (v10, T1Q, v1, v5, T1D);
|
||||
pmull2(v11, T1Q, v1, v5, T2D);
|
||||
eor3(v4, T16B, v4, v10, v11);
|
||||
// Use v17 for constants because v31 can be still in use.
|
||||
ldrq(v17, Address(table, 0x20));
|
||||
pmull (v25, T1Q, v0, v17, T1D);
|
||||
pmull2(v26, T1Q, v0, v17, T2D);
|
||||
eor3(v3, T16B, v3, v25, v26);
|
||||
|
||||
ldrq(v6, Address(table, 0x30));
|
||||
pmull (v12, T1Q, v2, v6, T1D);
|
||||
pmull2(v13, T1Q, v2, v6, T2D);
|
||||
eor3(v4, T16B, v4, v12, v13);
|
||||
// Use v18 for constants because v17 can be still in use.
|
||||
ldrq(v18, Address(table, 0x30));
|
||||
pmull (v27, T1Q, v1, v18, T1D);
|
||||
pmull2(v28, T1Q, v1, v18, T2D);
|
||||
eor3(v3, T16B, v3, v27, v28);
|
||||
|
||||
ldrq(v7, Address(table, 0x40));
|
||||
pmull (v14, T1Q, v3, v7, T1D);
|
||||
pmull2(v15, T1Q, v3, v7, T2D);
|
||||
eor3(v1, T16B, v4, v14, v15);
|
||||
// Use v19 for constants because v18 can be still in use.
|
||||
ldrq(v19, Address(table, 0x40));
|
||||
pmull (v29, T1Q, v2, v19, T1D);
|
||||
pmull2(v30, T1Q, v2, v19, T2D);
|
||||
eor3(v0, T16B, v3, v29, v30);
|
||||
|
||||
add(len, len, 0x80);
|
||||
add(buf, buf, 0x10);
|
||||
|
||||
mov(tmp0, v1, D, 0);
|
||||
mov(tmp1, v1, D, 1);
|
||||
mov(tmp0, v0, D, 0);
|
||||
mov(tmp1, v0, D, 1);
|
||||
}
|
||||
|
||||
SkipIfEqual::SkipIfEqual(
|
||||
@@ -5339,28 +5355,25 @@ address MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
|
||||
// For Strings we're passed the address of the first characters in a1
|
||||
// and a2 and the length in cnt1.
|
||||
// elem_size is the element size in bytes: either 1 or 2.
|
||||
// There are two implementations. For arrays >= 8 bytes, all
|
||||
// comparisons (including the final one, which may overlap) are
|
||||
// performed 8 bytes at a time. For strings < 8 bytes, we compare a
|
||||
// halfword, then a short, and then a byte.
|
||||
|
||||
void MacroAssembler::string_equals(Register a1, Register a2,
|
||||
Register result, Register cnt1, int elem_size)
|
||||
Register result, Register cnt1)
|
||||
{
|
||||
Label SAME, DONE, SHORT, NEXT_WORD;
|
||||
Register tmp1 = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
Register cnt2 = tmp2; // cnt2 only used in array length compare
|
||||
|
||||
assert(elem_size == 1 || elem_size == 2, "must be 2 or 1 byte");
|
||||
assert_different_registers(a1, a2, result, cnt1, rscratch1, rscratch2);
|
||||
|
||||
#ifndef PRODUCT
|
||||
{
|
||||
const char kind = (elem_size == 2) ? 'U' : 'L';
|
||||
char comment[64];
|
||||
snprintf(comment, sizeof comment, "{string_equals%c", kind);
|
||||
snprintf(comment, sizeof comment, "{string_equalsL");
|
||||
BLOCK_COMMENT(comment);
|
||||
}
|
||||
#endif
|
||||
@@ -5408,14 +5421,12 @@ void MacroAssembler::string_equals(Register a1, Register a2,
|
||||
cbnzw(tmp1, DONE);
|
||||
}
|
||||
bind(TAIL01);
|
||||
if (elem_size == 1) { // Only needed when comparing 1-byte elements
|
||||
tbz(cnt1, 0, SAME); // 0-1 bytes left.
|
||||
tbz(cnt1, 0, SAME); // 0-1 bytes left.
|
||||
{
|
||||
ldrb(tmp1, a1);
|
||||
ldrb(tmp2, a2);
|
||||
eorw(tmp1, tmp1, tmp2);
|
||||
cbnzw(tmp1, DONE);
|
||||
}
|
||||
ldrb(tmp1, a1);
|
||||
ldrb(tmp2, a2);
|
||||
eorw(tmp1, tmp1, tmp2);
|
||||
cbnzw(tmp1, DONE);
|
||||
}
|
||||
// Arrays are equal.
|
||||
bind(SAME);
|
||||
|
||||
@@ -1399,8 +1399,7 @@ public:
|
||||
address arrays_equals(Register a1, Register a2, Register result, Register cnt1,
|
||||
Register tmp1, Register tmp2, Register tmp3, int elem_size);
|
||||
|
||||
void string_equals(Register a1, Register a2, Register result, Register cnt1,
|
||||
int elem_size);
|
||||
void string_equals(Register a1, Register a2, Register result, Register cnt1);
|
||||
|
||||
void fill_words(Register base, Register cnt, Register value);
|
||||
address zero_words(Register base, uint64_t cnt);
|
||||
@@ -1425,11 +1424,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.
|
||||
|
||||
@@ -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, 2022, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -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) {
|
||||
@@ -5487,6 +5474,32 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return entry;
|
||||
}
|
||||
|
||||
// r0 = input (float16)
|
||||
// v0 = result (float)
|
||||
// v1 = temporary float register
|
||||
address generate_float16ToFloat() {
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "float16ToFloat");
|
||||
address entry = __ pc();
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ flt16_to_flt(v0, r0, v1);
|
||||
__ ret(lr);
|
||||
return entry;
|
||||
}
|
||||
|
||||
// v0 = input (float)
|
||||
// r0 = result (float16)
|
||||
// v1 = temporary float register
|
||||
address generate_floatToFloat16() {
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "floatToFloat16");
|
||||
address entry = __ pc();
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ flt_to_flt16(r0, v0, v1);
|
||||
__ ret(lr);
|
||||
return entry;
|
||||
}
|
||||
|
||||
address generate_method_entry_barrier() {
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "nmethod_entry_barrier");
|
||||
@@ -8333,11 +8346,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);
|
||||
}
|
||||
@@ -8345,6 +8353,12 @@ class StubGenerator: public StubCodeGenerator {
|
||||
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dcos)) {
|
||||
StubRoutines::_dcos = generate_dsin_dcos(/* isCos = */ true);
|
||||
}
|
||||
|
||||
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_float16ToFloat) &&
|
||||
vmIntrinsics::is_intrinsic_available(vmIntrinsics::_floatToFloat16)) {
|
||||
StubRoutines::_hf2f = generate_float16ToFloat();
|
||||
StubRoutines::_f2hf = generate_floatToFloat16();
|
||||
}
|
||||
}
|
||||
|
||||
void generate_continuation_stubs() {
|
||||
|
||||
@@ -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
|
||||
@@ -195,7 +195,7 @@ void emit_call_reloc(CodeBuffer &cbuf, const MachCallNode *n, MachOper *m, Reloc
|
||||
assert(maybe_far_call(n) == !__ reachable_from_cache(target), "sanity");
|
||||
assert(cache_reachable() == __ cache_fully_reachable(), "sanity");
|
||||
|
||||
assert(target != NULL, "need real address");
|
||||
assert(target != nullptr, "need real address");
|
||||
|
||||
int ret_addr_offset = -1;
|
||||
if (rspec.type() == relocInfo::runtime_call_type) {
|
||||
@@ -290,7 +290,7 @@ void MachPrologNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
|
||||
st->print ("SUB R_SP, R_SP, " SIZE_FORMAT,framesize);
|
||||
}
|
||||
|
||||
if (C->stub_function() == NULL && BarrierSet::barrier_set()->barrier_set_nmethod() != NULL) {
|
||||
if (C->stub_function() == nullptr && BarrierSet::barrier_set()->barrier_set_nmethod() != nullptr) {
|
||||
st->print("ldr t0, [guard]\n\t");
|
||||
st->print("ldr t1, [Rthread, #thread_disarmed_guard_value_offset]\n\t");
|
||||
st->print("cmp t0, t1\n\t");
|
||||
@@ -332,7 +332,7 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
__ sub_slow(SP, SP, framesize);
|
||||
}
|
||||
|
||||
if (C->stub_function() == NULL) {
|
||||
if (C->stub_function() == nullptr) {
|
||||
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
||||
bs->nmethod_entry_barrier(&_masm);
|
||||
}
|
||||
@@ -454,7 +454,7 @@ uint MachSpillCopyNode::implementation( CodeBuffer *cbuf,
|
||||
return size; // Self copy, no move
|
||||
|
||||
#ifdef TODO
|
||||
if (bottom_type()->isa_vect() != NULL) {
|
||||
if (bottom_type()->isa_vect() != nullptr) {
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -804,16 +804,16 @@ uint MachSpillCopyNode::implementation( CodeBuffer *cbuf,
|
||||
|
||||
#ifndef PRODUCT
|
||||
void MachSpillCopyNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
|
||||
implementation( NULL, ra_, false, st );
|
||||
implementation(nullptr, ra_, false, st );
|
||||
}
|
||||
#endif
|
||||
|
||||
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
implementation( &cbuf, ra_, false, NULL );
|
||||
implementation( &cbuf, ra_, false, nullptr );
|
||||
}
|
||||
|
||||
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
|
||||
return implementation( NULL, ra_, true, NULL );
|
||||
return implementation( nullptr, ra_, true, nullptr );
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
@@ -903,7 +903,7 @@ int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf) {
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
|
||||
address base = __ start_a_stub(size_exception_handler());
|
||||
if (base == NULL) {
|
||||
if (base == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return 0; // CodeBuffer::expand failed
|
||||
}
|
||||
@@ -926,7 +926,7 @@ int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
|
||||
address base = __ start_a_stub(size_deopt_handler());
|
||||
if (base == NULL) {
|
||||
if (base == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return 0; // CodeBuffer::expand failed
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1026,11 +1026,11 @@ bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||
}
|
||||
|
||||
const RegMask* Matcher::predicate_reg_mask(void) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const TypeVectMask* Matcher::predicate_reg_type(const Type* elemTy, int length) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Vector calling convention not yet implemented.
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1094,7 +1094,7 @@ bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
|
||||
|
||||
MachOper* Matcher::pd_specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
|
||||
ShouldNotReachHere(); // generic vector operands not supported
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Matcher::is_reg2reg_move(MachNode* m) {
|
||||
@@ -1242,7 +1242,7 @@ encode %{
|
||||
|
||||
// Emit stubs for static call.
|
||||
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
|
||||
if (stub == NULL) {
|
||||
if (stub == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -1987,7 +1987,7 @@ operand immNKlass()
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// NULL Pointer Immediate
|
||||
// Null Pointer Immediate
|
||||
operand immN0()
|
||||
%{
|
||||
predicate(n->get_narrowcon() == 0);
|
||||
@@ -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, 2022, 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
|
||||
@@ -431,7 +431,7 @@ OptoRegPair c2::return_value(int ideal_reg) {
|
||||
// will point.
|
||||
|
||||
int MachCallStaticJavaNode::ret_addr_offset() {
|
||||
bool far = (_method == NULL) ? maybe_far_call(this) : !cache_reachable();
|
||||
bool far = (_method == nullptr) ? maybe_far_call(this) : !cache_reachable();
|
||||
return ((far ? 3 : 1) + (_method_handle_invoke ? 1 : 0)) *
|
||||
NativeInstruction::instruction_size;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
@@ -1026,7 +1026,7 @@ bool followed_by_acquire(const Node *load) {
|
||||
assert(load->is_Load(), "So far implemented only for loads.");
|
||||
|
||||
// Find MemBarAcquire.
|
||||
const Node *mba = NULL;
|
||||
const Node *mba = nullptr;
|
||||
for (DUIterator_Fast imax, i = load->fast_outs(imax); i < imax; i++) {
|
||||
const Node *out = load->fast_out(i);
|
||||
if (out->Opcode() == Op_MemBarAcquire) {
|
||||
@@ -1043,7 +1043,7 @@ bool followed_by_acquire(const Node *load) {
|
||||
// edge to assure no other operations are in between the two nodes.
|
||||
//
|
||||
// So first get the Proj node, mem_proj, to use it to iterate forward.
|
||||
Node *mem_proj = NULL;
|
||||
Node *mem_proj = nullptr;
|
||||
for (DUIterator_Fast imax, i = mba->fast_outs(imax); i < imax; i++) {
|
||||
mem_proj = mba->fast_out(i); // Runs out of bounds and asserts if Proj not found.
|
||||
assert(mem_proj->is_Proj(), "only projections here");
|
||||
@@ -1270,7 +1270,7 @@ source %{
|
||||
|
||||
void CallStubImpl::emit_trampoline_stub(C2_MacroAssembler &_masm, int destination_toc_offset, int insts_call_instruction_offset) {
|
||||
address stub = __ emit_trampoline_stub(destination_toc_offset, insts_call_instruction_offset);
|
||||
if (stub == NULL) {
|
||||
if (stub == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
}
|
||||
}
|
||||
@@ -1305,11 +1305,11 @@ EmitCallOffsets emit_call_with_trampoline_stub(C2_MacroAssembler &_masm, address
|
||||
offsets.insts_call_instruction_offset = __ offset();
|
||||
|
||||
// No entry point given, use the current pc.
|
||||
if (entry_point == NULL) entry_point = __ pc();
|
||||
if (entry_point == nullptr) entry_point = __ pc();
|
||||
|
||||
// Put the entry point as a constant into the constant pool.
|
||||
const address entry_point_toc_addr = __ address_constant(entry_point, RelocationHolder::none);
|
||||
if (entry_point_toc_addr == NULL) {
|
||||
if (entry_point_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return offsets;
|
||||
}
|
||||
@@ -1355,8 +1355,8 @@ void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, Phase
|
||||
MachNode *m1 = new loadToc_hiNode();
|
||||
MachNode *m2 = new loadToc_loNode();
|
||||
|
||||
m1->add_req(NULL);
|
||||
m2->add_req(NULL, m1);
|
||||
m1->add_req(nullptr);
|
||||
m2->add_req(nullptr, m1);
|
||||
m1->_opnds[0] = op_dst;
|
||||
m2->_opnds[0] = op_dst;
|
||||
m2->_opnds[1] = op_dst;
|
||||
@@ -1398,7 +1398,7 @@ void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
st->print("push frame %ld\n\t", -framesize);
|
||||
}
|
||||
|
||||
if (C->stub_function() == NULL) {
|
||||
if (C->stub_function() == nullptr) {
|
||||
st->print("nmethod entry barrier\n\t");
|
||||
}
|
||||
}
|
||||
@@ -1554,7 +1554,7 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
__ std(return_pc, _abi0(lr), callers_sp);
|
||||
}
|
||||
|
||||
if (C->stub_function() == NULL) {
|
||||
if (C->stub_function() == nullptr) {
|
||||
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
||||
bs->nmethod_entry_barrier(&_masm, push_frame_temp);
|
||||
}
|
||||
@@ -1724,7 +1724,7 @@ uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, boo
|
||||
if (src_lo == dst_lo && src_hi == dst_hi)
|
||||
return size; // Self copy, no move.
|
||||
|
||||
if (bottom_type()->isa_vect() != NULL && ideal_reg() == Op_VecX) {
|
||||
if (bottom_type()->isa_vect() != nullptr && ideal_reg() == Op_VecX) {
|
||||
// Memory->Memory Spill.
|
||||
if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) {
|
||||
int src_offset = ra_->reg2offset(src_lo);
|
||||
@@ -1910,16 +1910,16 @@ void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
if (!ra_)
|
||||
st->print("N%d = SpillCopy(N%d)", _idx, in(1)->_idx);
|
||||
else
|
||||
implementation(NULL, ra_, false, st);
|
||||
implementation(nullptr, ra_, false, st);
|
||||
}
|
||||
#endif
|
||||
|
||||
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
implementation(&cbuf, ra_, false, NULL);
|
||||
implementation(&cbuf, ra_, false, nullptr);
|
||||
}
|
||||
|
||||
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
|
||||
return implementation(NULL, ra_, true, NULL);
|
||||
return implementation(nullptr, ra_, true, nullptr);
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
@@ -1985,7 +1985,7 @@ void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
assert_different_registers(ic_klass, receiver_klass, R11_scratch1, R3_ARG1);
|
||||
assert(R11_scratch1 == R11, "need prologue scratch register");
|
||||
|
||||
// Check for NULL argument if we don't have implicit null checks.
|
||||
// Check for nullptr argument if we don't have implicit null checks.
|
||||
if (!ImplicitNullChecks || !os::zero_page_read_protected()) {
|
||||
if (TrapBasedNullChecks) {
|
||||
__ trap_null_check(R3_ARG1);
|
||||
@@ -1999,7 +1999,7 @@ void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
__ bind(valid);
|
||||
}
|
||||
}
|
||||
// Assume argument is not NULL, load klass from receiver.
|
||||
// Assume argument is not nullptr, load klass from receiver.
|
||||
__ load_klass(receiver_klass, R3_ARG1);
|
||||
|
||||
if (TrapBasedICMissChecks) {
|
||||
@@ -2062,7 +2062,7 @@ int HandlerImpl::emit_exception_handler(CodeBuffer &cbuf) {
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
|
||||
address base = __ start_a_stub(size_exception_handler());
|
||||
if (base == NULL) return 0; // CodeBuffer::expand failed
|
||||
if (base == nullptr) return 0; // CodeBuffer::expand failed
|
||||
|
||||
int offset = __ offset();
|
||||
__ b64_patchable((address)OptoRuntime::exception_blob()->content_begin(),
|
||||
@@ -2079,7 +2079,7 @@ int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
|
||||
address base = __ start_a_stub(size_deopt_handler());
|
||||
if (base == NULL) return 0; // CodeBuffer::expand failed
|
||||
if (base == nullptr) return 0; // CodeBuffer::expand failed
|
||||
|
||||
int offset = __ offset();
|
||||
__ bl64_patchable((address)SharedRuntime::deopt_blob()->unpack(),
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -2193,11 +2193,11 @@ bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||
}
|
||||
|
||||
const RegMask* Matcher::predicate_reg_mask(void) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const TypeVectMask* Matcher::predicate_reg_type(const Type* elemTy, int length) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Vector calling convention not yet implemented.
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -2275,7 +2275,7 @@ bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
|
||||
/* TODO: PPC port
|
||||
// Make a new machine dependent decode node (with its operands).
|
||||
MachTypeNode *Matcher::make_decode_node() {
|
||||
assert(CompressedOops::base() == NULL && CompressedOops::shift() == 0,
|
||||
assert(CompressedOops::base() == nullptr && CompressedOops::shift() == 0,
|
||||
"This method is only implemented for unscaled cOops mode so far");
|
||||
MachTypeNode *decode = new decodeN_unscaledNode();
|
||||
decode->set_opnd_array(0, new iRegPdstOper());
|
||||
@@ -2286,7 +2286,7 @@ MachTypeNode *Matcher::make_decode_node() {
|
||||
|
||||
MachOper* Matcher::pd_specialize_generic_vector_operand(MachOper* original_opnd, uint ideal_reg, bool is_temp) {
|
||||
ShouldNotReachHere(); // generic vector operands not supported
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Matcher::is_reg2reg_move(MachNode* m) {
|
||||
@@ -2545,7 +2545,7 @@ encode %{
|
||||
// Create a non-oop constant, no relocation needed.
|
||||
// If it is an IC, it has a virtual_call_Relocation.
|
||||
const_toc_addr = __ long_constant((jlong)$src$$constant);
|
||||
if (const_toc_addr == NULL) {
|
||||
if (const_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -2568,7 +2568,7 @@ encode %{
|
||||
// Create a non-oop constant, no relocation needed.
|
||||
// If it is an IC, it has a virtual_call_Relocation.
|
||||
const_toc_addr = __ long_constant((jlong)$src$$constant);
|
||||
if (const_toc_addr == NULL) {
|
||||
if (const_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -2607,8 +2607,8 @@ loadConLNodesTuple loadConLNodesTuple_create(PhaseRegAlloc *ra_, Node *toc, immL
|
||||
loadConL_loNode *m2 = new loadConL_loNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m1->add_req(NULL, toc);
|
||||
m2->add_req(NULL, m1);
|
||||
m1->add_req(nullptr, toc);
|
||||
m2->add_req(nullptr, m1);
|
||||
|
||||
// operands for new nodes
|
||||
m1->_opnds[0] = new iRegLdstOper(); // dst
|
||||
@@ -2632,14 +2632,14 @@ loadConLNodesTuple loadConLNodesTuple_create(PhaseRegAlloc *ra_, Node *toc, immL
|
||||
// Create result.
|
||||
nodes._large_hi = m1;
|
||||
nodes._large_lo = m2;
|
||||
nodes._small = NULL;
|
||||
nodes._small = nullptr;
|
||||
nodes._last = nodes._large_lo;
|
||||
assert(m2->bottom_type()->isa_long(), "must be long");
|
||||
} else {
|
||||
loadConLNode *m2 = new loadConLNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m2->add_req(NULL, toc);
|
||||
m2->add_req(nullptr, toc);
|
||||
|
||||
// operands for new nodes
|
||||
m2->_opnds[0] = new iRegLdstOper(); // dst
|
||||
@@ -2653,8 +2653,8 @@ loadConLNodesTuple loadConLNodesTuple_create(PhaseRegAlloc *ra_, Node *toc, immL
|
||||
ra_->set_pair(m2->_idx, reg_second, reg_first);
|
||||
|
||||
// Create result.
|
||||
nodes._large_hi = NULL;
|
||||
nodes._large_lo = NULL;
|
||||
nodes._large_hi = nullptr;
|
||||
nodes._large_lo = nullptr;
|
||||
nodes._small = m2;
|
||||
nodes._last = nodes._small;
|
||||
assert(m2->bottom_type()->isa_long(), "must be long");
|
||||
@@ -2687,10 +2687,10 @@ loadConLReplicatedNodesTuple loadConLReplicatedNodesTuple_create(Compile *C, Pha
|
||||
xxspltdNode *m4 = new xxspltdNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m1->add_req(NULL, toc);
|
||||
m2->add_req(NULL, m1);
|
||||
m3->add_req(NULL, m2);
|
||||
m4->add_req(NULL, m3);
|
||||
m1->add_req(nullptr, toc);
|
||||
m2->add_req(nullptr, m1);
|
||||
m3->add_req(nullptr, m2);
|
||||
m4->add_req(nullptr, m3);
|
||||
|
||||
// operands for new nodes
|
||||
m1->_opnds[0] = new iRegLdstOper(); // dst
|
||||
@@ -2727,7 +2727,7 @@ loadConLReplicatedNodesTuple loadConLReplicatedNodesTuple_create(Compile *C, Pha
|
||||
nodes._large_lo = m2;
|
||||
nodes._moved = m3;
|
||||
nodes._replicated = m4;
|
||||
nodes._small = NULL;
|
||||
nodes._small = nullptr;
|
||||
nodes._last = nodes._replicated;
|
||||
assert(m2->bottom_type()->isa_long(), "must be long");
|
||||
} else {
|
||||
@@ -2736,7 +2736,7 @@ loadConLReplicatedNodesTuple loadConLReplicatedNodesTuple_create(Compile *C, Pha
|
||||
xxspltdNode *m4 = new xxspltdNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m2->add_req(NULL, toc);
|
||||
m2->add_req(nullptr, toc);
|
||||
|
||||
// operands for new nodes
|
||||
m2->_opnds[0] = new iRegLdstOper(); // dst
|
||||
@@ -2760,8 +2760,8 @@ loadConLReplicatedNodesTuple loadConLReplicatedNodesTuple_create(Compile *C, Pha
|
||||
ra_->set_pair(m2->_idx, reg_second, reg_first);
|
||||
|
||||
// Create result.
|
||||
nodes._large_hi = NULL;
|
||||
nodes._large_lo = NULL;
|
||||
nodes._large_hi = nullptr;
|
||||
nodes._large_lo = nullptr;
|
||||
nodes._small = m2;
|
||||
nodes._moved = m3;
|
||||
nodes._replicated = m4;
|
||||
@@ -2815,7 +2815,7 @@ encode %{
|
||||
const_toc_addr = __ long_constant((jlong)$src$$constant);
|
||||
}
|
||||
|
||||
if (const_toc_addr == NULL) {
|
||||
if (const_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -2846,7 +2846,7 @@ encode %{
|
||||
const_toc_addr = __ long_constant((jlong)$src$$constant);
|
||||
}
|
||||
|
||||
if (const_toc_addr == NULL) {
|
||||
if (const_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -2870,8 +2870,8 @@ encode %{
|
||||
loadConP_loNode *m2 = new loadConP_loNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m1->add_req(NULL, n_toc);
|
||||
m2->add_req(NULL, m1);
|
||||
m1->add_req(nullptr, n_toc);
|
||||
m2->add_req(nullptr, m1);
|
||||
|
||||
// operands for new nodes
|
||||
m1->_opnds[0] = new iRegPdstOper(); // dst
|
||||
@@ -2896,7 +2896,7 @@ encode %{
|
||||
loadConPNode *m2 = new loadConPNode();
|
||||
|
||||
// inputs for new nodes
|
||||
m2->add_req(NULL, n_toc);
|
||||
m2->add_req(nullptr, n_toc);
|
||||
|
||||
// operands for new nodes
|
||||
m2->_opnds[0] = new iRegPdstOper(); // dst
|
||||
@@ -2923,7 +2923,7 @@ encode %{
|
||||
m2 = new loadConFNode();
|
||||
}
|
||||
// inputs for new nodes
|
||||
m2->add_req(NULL, n_toc);
|
||||
m2->add_req(nullptr, n_toc);
|
||||
|
||||
// operands for new nodes
|
||||
m2->_opnds[0] = op_dst;
|
||||
@@ -2947,7 +2947,7 @@ encode %{
|
||||
m2 = new loadConDNode();
|
||||
}
|
||||
// inputs for new nodes
|
||||
m2->add_req(NULL, n_toc);
|
||||
m2->add_req(nullptr, n_toc);
|
||||
|
||||
// operands for new nodes
|
||||
m2->_opnds[0] = op_dst;
|
||||
@@ -3258,9 +3258,9 @@ encode %{
|
||||
Label d; // dummy
|
||||
__ bind(d);
|
||||
Label* p = ($lbl$$label);
|
||||
// `p' is `NULL' when this encoding class is used only to
|
||||
// `p' is `nullptr' when this encoding class is used only to
|
||||
// determine the size of the encoded instruction.
|
||||
Label& l = (NULL == p)? d : *(p);
|
||||
Label& l = (nullptr == p)? d : *(p);
|
||||
int cc = $cmp$$cmpcode;
|
||||
int flags_reg = $crx$$reg;
|
||||
assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding");
|
||||
@@ -3287,9 +3287,9 @@ encode %{
|
||||
Label d; // dummy
|
||||
__ bind(d);
|
||||
Label* p = ($lbl$$label);
|
||||
// `p' is `NULL' when this encoding class is used only to
|
||||
// `p' is `nullptr' when this encoding class is used only to
|
||||
// determine the size of the encoded instruction.
|
||||
Label& l = (NULL == p)? d : *(p);
|
||||
Label& l = (nullptr == p)? d : *(p);
|
||||
int cc = $cmp$$cmpcode;
|
||||
int flags_reg = $crx$$reg;
|
||||
int bhint = Assembler::bhintNoHint;
|
||||
@@ -3431,7 +3431,7 @@ encode %{
|
||||
|
||||
// Put the entry point as a constant into the constant pool.
|
||||
const address entry_point_toc_addr = __ address_constant(entry_point, RelocationHolder::none);
|
||||
if (entry_point_toc_addr == NULL) {
|
||||
if (entry_point_toc_addr == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -3453,7 +3453,7 @@ encode %{
|
||||
|
||||
// The stub for call to interpreter.
|
||||
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
|
||||
if (stub == NULL) {
|
||||
if (stub == nullptr) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
@@ -3470,7 +3470,7 @@ encode %{
|
||||
// Create a call trampoline stub for the given method.
|
||||
const address entry_point = !($meth$$method) ? 0 : (address)$meth$$method;
|
||||
const address entry_point_const = __ address_constant(entry_point, RelocationHolder::none);
|
||||
if (entry_point_const == NULL) {
|
||||
if (entry_point_const == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -3479,13 +3479,13 @@ encode %{
|
||||
if (ra_->C->env()->failing()) { return; } // Code cache may be full.
|
||||
|
||||
// Build relocation at call site with ic position as data.
|
||||
assert((_load_ic_hi_node != NULL && _load_ic_node == NULL) ||
|
||||
(_load_ic_hi_node == NULL && _load_ic_node != NULL),
|
||||
assert((_load_ic_hi_node != nullptr && _load_ic_node == nullptr) ||
|
||||
(_load_ic_hi_node == nullptr && _load_ic_node != nullptr),
|
||||
"must have one, but can't have both");
|
||||
assert((_load_ic_hi_node != NULL && _load_ic_hi_node->_cbuf_insts_offset != -1) ||
|
||||
(_load_ic_node != NULL && _load_ic_node->_cbuf_insts_offset != -1),
|
||||
assert((_load_ic_hi_node != nullptr && _load_ic_hi_node->_cbuf_insts_offset != -1) ||
|
||||
(_load_ic_node != nullptr && _load_ic_node->_cbuf_insts_offset != -1),
|
||||
"must contain instruction offset");
|
||||
const int virtual_call_oop_addr_offset = _load_ic_hi_node != NULL
|
||||
const int virtual_call_oop_addr_offset = _load_ic_hi_node != nullptr
|
||||
? _load_ic_hi_node->_cbuf_insts_offset
|
||||
: _load_ic_node->_cbuf_insts_offset;
|
||||
const address virtual_call_oop_addr = __ addr_at(virtual_call_oop_addr_offset);
|
||||
@@ -3625,7 +3625,7 @@ encode %{
|
||||
const address start_pc = __ pc();
|
||||
|
||||
#if defined(ABI_ELFv2)
|
||||
address entry= !($meth$$method) ? NULL : (address)$meth$$method;
|
||||
address entry= !($meth$$method) ? nullptr : (address)$meth$$method;
|
||||
__ call_c(entry, relocInfo::runtime_call_type);
|
||||
__ post_call_nop();
|
||||
#else
|
||||
@@ -3682,13 +3682,13 @@ encode %{
|
||||
|
||||
|
||||
// Create nodes and operands for loading the env pointer.
|
||||
if (fd->env() != NULL) {
|
||||
if (fd->env() != nullptr) {
|
||||
loadConLNodes_Env = loadConLNodesTuple_create(ra_, n_toc, new immLOper((jlong) fd->env()),
|
||||
OptoReg::Name(R11_H_num), OptoReg::Name(R11_num));
|
||||
} else {
|
||||
loadConLNodes_Env._large_hi = NULL;
|
||||
loadConLNodes_Env._large_lo = NULL;
|
||||
loadConLNodes_Env._small = NULL;
|
||||
loadConLNodes_Env._large_hi = nullptr;
|
||||
loadConLNodes_Env._large_lo = nullptr;
|
||||
loadConLNodes_Env._small = nullptr;
|
||||
loadConLNodes_Env._last = new loadConL16Node();
|
||||
loadConLNodes_Env._last->_opnds[0] = new iRegLdstOper();
|
||||
loadConLNodes_Env._last->_opnds[1] = new immL16Oper(0);
|
||||
@@ -3702,7 +3702,7 @@ encode %{
|
||||
// mtctr node
|
||||
MachNode *mtctr = new CallLeafDirect_mtctrNode();
|
||||
|
||||
assert(loadConLNodes_Entry._last != NULL, "entry must exist");
|
||||
assert(loadConLNodes_Entry._last != nullptr, "entry must exist");
|
||||
mtctr->add_req(0, loadConLNodes_Entry._last);
|
||||
|
||||
mtctr->_opnds[0] = new iRegLdstOper();
|
||||
@@ -3722,7 +3722,7 @@ encode %{
|
||||
call->_guaranteed_safepoint = false;
|
||||
call->_oop_map = _oop_map;
|
||||
guarantee(!_jvms, "You must clone the jvms and adapt the offsets by fix_jvms().");
|
||||
call->_jvms = NULL;
|
||||
call->_jvms = nullptr;
|
||||
call->_jvmadj = _jvmadj;
|
||||
call->_in_rms = _in_rms;
|
||||
call->_nesting = _nesting;
|
||||
@@ -3826,7 +3826,7 @@ frame %{
|
||||
// opcodes. This simplifies the register allocator.
|
||||
c_return_value %{
|
||||
assert((ideal_reg >= Op_RegI && ideal_reg <= Op_RegL) ||
|
||||
(ideal_reg == Op_RegN && CompressedOops::base() == NULL && CompressedOops::shift() == 0),
|
||||
(ideal_reg == Op_RegN && CompressedOops::base() == nullptr && CompressedOops::shift() == 0),
|
||||
"only return normal values");
|
||||
// enum names from opcodes.hpp: Op_Node Op_Set Op_RegN Op_RegI Op_RegP Op_RegF Op_RegD Op_RegL
|
||||
static int typeToRegLo[Op_RegL+1] = { 0, 0, R3_num, R3_num, R3_num, F1_num, F1_num, R3_num };
|
||||
@@ -3837,7 +3837,7 @@ frame %{
|
||||
// Location of compiled Java return values. Same as C
|
||||
return_value %{
|
||||
assert((ideal_reg >= Op_RegI && ideal_reg <= Op_RegL) ||
|
||||
(ideal_reg == Op_RegN && CompressedOops::base() == NULL && CompressedOops::shift() == 0),
|
||||
(ideal_reg == Op_RegN && CompressedOops::base() == nullptr && CompressedOops::shift() == 0),
|
||||
"only return normal values");
|
||||
// enum names from opcodes.hpp: Op_Node Op_Set Op_RegN Op_RegI Op_RegP Op_RegF Op_RegD Op_RegL
|
||||
static int typeToRegLo[Op_RegL+1] = { 0, 0, R3_num, R3_num, R3_num, F1_num, F1_num, R3_num };
|
||||
@@ -4110,7 +4110,7 @@ operand immN() %{
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// NULL Pointer Immediate
|
||||
// Null Pointer Immediate
|
||||
operand immN_0() %{
|
||||
predicate(n->get_narrowcon() == 0);
|
||||
match(ConN);
|
||||
@@ -4682,7 +4682,7 @@ operand iRegN2P(iRegNsrc reg) %{
|
||||
%}
|
||||
|
||||
operand iRegN2P_klass(iRegNsrc reg) %{
|
||||
predicate(CompressedKlassPointers::base() == NULL && CompressedKlassPointers::shift() == 0);
|
||||
predicate(CompressedKlassPointers::base() == nullptr && CompressedKlassPointers::shift() == 0);
|
||||
constraint(ALLOC_IN_RC(bits32_reg_ro));
|
||||
match(DecodeNKlass reg);
|
||||
format %{ "$reg" %}
|
||||
@@ -4751,7 +4751,7 @@ operand indirectNarrow(iRegNsrc reg) %{
|
||||
%}
|
||||
|
||||
operand indirectNarrow_klass(iRegNsrc reg) %{
|
||||
predicate(CompressedKlassPointers::base() == NULL && CompressedKlassPointers::shift() == 0);
|
||||
predicate(CompressedKlassPointers::base() == nullptr && CompressedKlassPointers::shift() == 0);
|
||||
constraint(ALLOC_IN_RC(bits64_reg_ro));
|
||||
match(DecodeNKlass reg);
|
||||
op_cost(100);
|
||||
@@ -4780,7 +4780,7 @@ operand indOffset16Narrow(iRegNsrc reg, immL16 offset) %{
|
||||
%}
|
||||
|
||||
operand indOffset16Narrow_klass(iRegNsrc reg, immL16 offset) %{
|
||||
predicate(CompressedKlassPointers::base() == NULL && CompressedKlassPointers::shift() == 0);
|
||||
predicate(CompressedKlassPointers::base() == nullptr && CompressedKlassPointers::shift() == 0);
|
||||
constraint(ALLOC_IN_RC(bits64_reg_ro));
|
||||
match(AddP (DecodeNKlass reg) offset);
|
||||
op_cost(100);
|
||||
@@ -4809,7 +4809,7 @@ operand indOffset16NarrowAlg4(iRegNsrc reg, immL16Alg4 offset) %{
|
||||
%}
|
||||
|
||||
operand indOffset16NarrowAlg4_klass(iRegNsrc reg, immL16Alg4 offset) %{
|
||||
predicate(CompressedKlassPointers::base() == NULL && CompressedKlassPointers::shift() == 0);
|
||||
predicate(CompressedKlassPointers::base() == nullptr && CompressedKlassPointers::shift() == 0);
|
||||
constraint(ALLOC_IN_RC(bits64_reg_ro));
|
||||
match(AddP (DecodeNKlass reg) offset);
|
||||
op_cost(100);
|
||||
@@ -5544,7 +5544,7 @@ instruct loadN2P_unscaled(iRegPdst dst, memory mem) %{
|
||||
|
||||
instruct loadN2P_klass_unscaled(iRegPdst dst, memory mem) %{
|
||||
match(Set dst (DecodeNKlass (LoadNKlass mem)));
|
||||
predicate(CompressedKlassPointers::base() == NULL && CompressedKlassPointers::shift() == 0 &&
|
||||
predicate(CompressedKlassPointers::base() == nullptr && CompressedKlassPointers::shift() == 0 &&
|
||||
_kids[0]->_leaf->as_Load()->is_unordered());
|
||||
ins_cost(MEMORY_REF_COST);
|
||||
|
||||
@@ -5954,7 +5954,7 @@ instruct loadConL_Ex(iRegLdst dst, immL src) %{
|
||||
postalloc_expand( postalloc_expand_load_long_constant(dst, src, constanttablebase) );
|
||||
%}
|
||||
|
||||
// Load NULL as compressed oop.
|
||||
// Load nullptr as compressed oop.
|
||||
instruct loadConN0(iRegNdst dst, immN_0 src) %{
|
||||
match(Set dst src);
|
||||
ins_cost(DEFAULT_COST);
|
||||
@@ -6045,9 +6045,9 @@ instruct loadConN_Ex(iRegNdst dst, immN src) %{
|
||||
MachNode *m1 = new loadConN_hiNode();
|
||||
MachNode *m2 = new loadConN_loNode();
|
||||
MachNode *m3 = new clearMs32bNode();
|
||||
m1->add_req(NULL);
|
||||
m2->add_req(NULL, m1);
|
||||
m3->add_req(NULL, m2);
|
||||
m1->add_req(nullptr);
|
||||
m2->add_req(nullptr, m1);
|
||||
m3->add_req(nullptr, m2);
|
||||
m1->_opnds[0] = op_dst;
|
||||
m1->_opnds[1] = op_src;
|
||||
m2->_opnds[0] = op_dst;
|
||||
@@ -6123,7 +6123,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
|
||||
postalloc_expand %{
|
||||
// Load high bits into register. Sign extended.
|
||||
MachNode *m1 = new loadConNKlass_hiNode();
|
||||
m1->add_req(NULL);
|
||||
m1->add_req(nullptr);
|
||||
m1->_opnds[0] = op_dst;
|
||||
m1->_opnds[1] = op_src;
|
||||
ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
|
||||
@@ -6133,7 +6133,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
|
||||
if (!Assembler::is_uimm((jlong)CompressedKlassPointers::encode((Klass *)op_src->constant()), 31)) {
|
||||
// Value might be 1-extended. Mask out these bits.
|
||||
m2 = new loadConNKlass_maskNode();
|
||||
m2->add_req(NULL, m1);
|
||||
m2->add_req(nullptr, m1);
|
||||
m2->_opnds[0] = op_dst;
|
||||
m2->_opnds[1] = op_src;
|
||||
m2->_opnds[2] = op_dst;
|
||||
@@ -6142,7 +6142,7 @@ instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{
|
||||
}
|
||||
|
||||
MachNode *m3 = new loadConNKlass_loNode();
|
||||
m3->add_req(NULL, m2);
|
||||
m3->add_req(nullptr, m2);
|
||||
m3->_opnds[0] = op_dst;
|
||||
m3->_opnds[1] = op_src;
|
||||
m3->_opnds[2] = op_dst;
|
||||
@@ -6243,7 +6243,7 @@ instruct loadConF(regF dst, immF src, iRegLdst toc) %{
|
||||
size(4);
|
||||
ins_encode %{
|
||||
address float_address = __ float_constant($src$$constant);
|
||||
if (float_address == NULL) {
|
||||
if (float_address == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -6267,7 +6267,7 @@ instruct loadConFComp(regF dst, immF src, iRegLdst toc) %{
|
||||
FloatRegister Rdst = $dst$$FloatRegister;
|
||||
Register Rtoc = $toc$$Register;
|
||||
address float_address = __ float_constant($src$$constant);
|
||||
if (float_address == NULL) {
|
||||
if (float_address == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -6305,7 +6305,7 @@ instruct loadConD(regD dst, immD src, iRegLdst toc) %{
|
||||
size(4);
|
||||
ins_encode %{
|
||||
address float_address = __ double_constant($src$$constant);
|
||||
if (float_address == NULL) {
|
||||
if (float_address == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -6330,7 +6330,7 @@ instruct loadConDComp(regD dst, immD src, iRegLdst toc) %{
|
||||
FloatRegister Rdst = $dst$$FloatRegister;
|
||||
Register Rtoc = $toc$$Register;
|
||||
address float_address = __ double_constant($src$$constant);
|
||||
if (float_address == NULL) {
|
||||
if (float_address == nullptr) {
|
||||
ciEnv::current()->record_out_of_memory_failure();
|
||||
return;
|
||||
}
|
||||
@@ -6632,7 +6632,7 @@ instruct cond_sub_base(iRegNdst dst, flagsRegSrc crx, iRegPsrc src1) %{
|
||||
predicate(false);
|
||||
|
||||
format %{ "BEQ $crx, done\n\t"
|
||||
"SUB $dst, $src1, heapbase \t// encode: subtract base if != NULL\n"
|
||||
"SUB $dst, $src1, heapbase \t// encode: subtract base if != nullptr\n"
|
||||
"done:" %}
|
||||
ins_encode %{
|
||||
Label done;
|
||||
@@ -6701,7 +6701,7 @@ instruct encodeP_not_null_base_null(iRegNdst dst, iRegPsrc src) %{
|
||||
predicate(CompressedOops::shift() != 0 &&
|
||||
CompressedOops::base() ==0);
|
||||
|
||||
format %{ "SRDI $dst, $src, #3 \t// encodeP, $src != NULL" %}
|
||||
format %{ "SRDI $dst, $src, #3 \t// encodeP, $src != nullptr" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ srdi($dst$$Register, $src$$Register, CompressedOops::shift() & 0x3f);
|
||||
@@ -6762,7 +6762,7 @@ instruct cond_add_base(iRegPdst dst, flagsRegSrc crx, iRegPsrc src) %{
|
||||
predicate(false);
|
||||
|
||||
format %{ "BEQ $crx, done\n\t"
|
||||
"ADD $dst, $src, heapbase \t// DecodeN: add oop base if $src != NULL\n"
|
||||
"ADD $dst, $src, heapbase \t// DecodeN: add oop base if $src != nullptr\n"
|
||||
"done:" %}
|
||||
ins_encode %{
|
||||
Label done;
|
||||
@@ -6850,7 +6850,7 @@ instruct decodeN_Disjoint_notNull_Ex(iRegPdst dst, iRegNsrc src) %{
|
||||
"RLDIMI $dst, $src, shift, 32-shift \t// decode with disjoint base" %}
|
||||
postalloc_expand %{
|
||||
loadBaseNode *n1 = new loadBaseNode();
|
||||
n1->add_req(NULL);
|
||||
n1->add_req(nullptr);
|
||||
n1->_opnds[0] = op_dst;
|
||||
|
||||
decodeN_mergeDisjointNode *n2 = new decodeN_mergeDisjointNode();
|
||||
@@ -6882,7 +6882,7 @@ instruct decodeN_Disjoint_isel_Ex(iRegPdst dst, iRegNsrc src, flagsReg crx) %{
|
||||
format %{ "DecodeN $dst, $src \t// decode with disjoint base using isel" %}
|
||||
postalloc_expand %{
|
||||
loadBaseNode *n1 = new loadBaseNode();
|
||||
n1->add_req(NULL);
|
||||
n1->add_req(nullptr);
|
||||
n1->_opnds[0] = op_dst;
|
||||
|
||||
cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node();
|
||||
@@ -6929,7 +6929,7 @@ instruct decodeN_notNull_addBase_Ex(iRegPdst dst, iRegNsrc src) %{
|
||||
CompressedOops::base() != 0);
|
||||
ins_cost(2 * DEFAULT_COST);
|
||||
|
||||
format %{ "DecodeN $dst, $src \t// $src != NULL, postalloc expanded" %}
|
||||
format %{ "DecodeN $dst, $src \t// $src != nullptr, postalloc expanded" %}
|
||||
postalloc_expand( postalloc_expand_decode_oop_not_null(dst, src));
|
||||
%}
|
||||
|
||||
@@ -7086,7 +7086,7 @@ instruct decodeNKlass_notNull_addBase_Ex(iRegPdst dst, iRegLsrc base, iRegNsrc s
|
||||
//effect(kill src); // We need a register for the immediate result after shifting.
|
||||
predicate(false);
|
||||
|
||||
format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %}
|
||||
format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != nullptr, postalloc expanded" %}
|
||||
postalloc_expand %{
|
||||
decodeNKlass_add_baseNode *n1 = new decodeNKlass_add_baseNode();
|
||||
n1->add_req(n_region, n_base, n_src);
|
||||
@@ -7115,7 +7115,7 @@ instruct decodeNKlass_notNull_addBase_ExEx(iRegPdst dst, iRegNsrc src) %{
|
||||
// predicate(CompressedKlassPointers::shift() != 0 &&
|
||||
// CompressedKlassPointers::base() != 0);
|
||||
|
||||
//format %{ "DecodeNKlass $dst, $src \t// $src != NULL, expanded" %}
|
||||
//format %{ "DecodeNKlass $dst, $src \t// $src != nullptr, expanded" %}
|
||||
|
||||
ins_cost(DEFAULT_COST*2); // Don't count constant.
|
||||
expand %{
|
||||
@@ -7602,7 +7602,7 @@ instruct compareAndSwapL_regP_regL_regL(iRegIdst res, iRegPdst mem_ptr, iRegLsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, NULL, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@@ -7621,7 +7621,7 @@ instruct compareAndSwapP_regP_regP_regP(iRegIdst res, iRegPdst mem_ptr, iRegPsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, NULL, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@@ -7815,7 +7815,7 @@ instruct weakCompareAndSwapL_regP_regL_regL(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// value is never passed to caller.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, NULL, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -7831,7 +7831,7 @@ instruct weakCompareAndSwapL_acq_regP_regL_regL(iRegIdst res, iRegPdst mem_ptr,
|
||||
// value is never passed to caller.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, NULL, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -7845,7 +7845,7 @@ instruct weakCompareAndSwapP_regP_regP_regP(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, NULL, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -7861,7 +7861,7 @@ instruct weakCompareAndSwapP_acq_regP_regP_regP(iRegIdst res, iRegPdst mem_ptr,
|
||||
// value is never passed to caller.
|
||||
__ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, NULL, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -8081,7 +8081,7 @@ instruct compareAndExchangeL_regP_regL_regL(iRegLdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, NULL, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -8095,7 +8095,7 @@ instruct compareAndExchangeL_acq_regP_regL_regL(iRegLdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, NULL, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@@ -8116,7 +8116,7 @@ instruct compareAndExchangeP_regP_regP_regP(iRegPdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, NULL, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -8131,7 +8131,7 @@ instruct compareAndExchangeP_acq_regP_regP_regP(iRegPdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgd(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, NULL, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@@ -12043,9 +12043,9 @@ instruct branch(label labl) %{
|
||||
Label d; // dummy
|
||||
__ bind(d);
|
||||
Label* p = $labl$$label;
|
||||
// `p' is `NULL' when this encoding class is used only to
|
||||
// `p' is `nullptr' when this encoding class is used only to
|
||||
// determine the size of the encoded instruction.
|
||||
Label& l = (NULL == p)? d : *(p);
|
||||
Label& l = (nullptr == p)? d : *(p);
|
||||
__ b(l);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
@@ -12139,7 +12139,7 @@ instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P supe
|
||||
format %{ "PartialSubtypeCheck $result = ($subklass instanceOf $superklass) tmp: $tmp_klass, $tmp_arrayptr" %}
|
||||
ins_encode %{
|
||||
__ check_klass_subtype_slow_path($subklass$$Register, $superklass$$Register, $tmp_arrayptr$$Register,
|
||||
$tmp_klass$$Register, NULL, $result$$Register);
|
||||
$tmp_klass$$Register, nullptr, $result$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@@ -12318,21 +12318,6 @@ instruct string_equalsL(rarg1RegP str1, rarg2RegP str2, rarg3RegI cnt, iRegIdst
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct string_equalsU(rarg1RegP str1, rarg2RegP str2, rarg3RegI cnt, iRegIdst result,
|
||||
iRegIdst tmp, regCTR ctr, flagsRegCR0 cr0) %{
|
||||
predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU);
|
||||
match(Set result (StrEquals (Binary str1 str2) cnt));
|
||||
effect(TEMP_DEF result, USE_KILL str1, USE_KILL str2, USE_KILL cnt, TEMP tmp, KILL ctr, KILL cr0);
|
||||
ins_cost(300);
|
||||
format %{ "String Equals char[] $str1,$str2,$cnt -> $result \t// KILL $tmp" %}
|
||||
ins_encode %{
|
||||
__ array_equals(false, $str1$$Register, $str2$$Register,
|
||||
$cnt$$Register, $tmp$$Register,
|
||||
$result$$Register, false /* byte */);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct array_equalsB(rarg1RegP ary1, rarg2RegP ary2, iRegIdst result,
|
||||
iRegIdst tmp1, iRegIdst tmp2, regCTR ctr, flagsRegCR0 cr0, flagsRegCR0 cr1) %{
|
||||
predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL);
|
||||
@@ -12670,7 +12655,7 @@ instruct indexOf_U(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, iRe
|
||||
ins_encode %{
|
||||
__ string_indexof($result$$Register,
|
||||
$haystack$$Register, $haycnt$$Register,
|
||||
$needle$$Register, NULL, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$needle$$Register, nullptr, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register, StrIntrinsicNode::UU);
|
||||
%}
|
||||
ins_pipe(pipe_class_compare);
|
||||
@@ -12691,7 +12676,7 @@ instruct indexOf_L(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, iRe
|
||||
ins_encode %{
|
||||
__ string_indexof($result$$Register,
|
||||
$haystack$$Register, $haycnt$$Register,
|
||||
$needle$$Register, NULL, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$needle$$Register, nullptr, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register, StrIntrinsicNode::LL);
|
||||
%}
|
||||
ins_pipe(pipe_class_compare);
|
||||
@@ -12712,7 +12697,7 @@ instruct indexOf_UL(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, iR
|
||||
ins_encode %{
|
||||
__ string_indexof($result$$Register,
|
||||
$haystack$$Register, $haycnt$$Register,
|
||||
$needle$$Register, NULL, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$needle$$Register, nullptr, $needlecnt$$Register, 0, // needlecnt not constant.
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register, StrIntrinsicNode::UL);
|
||||
%}
|
||||
ins_pipe(pipe_class_compare);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -3643,8 +3643,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#define VALID_B64 0x80
|
||||
#define VB64(x) (VALID_B64 | x)
|
||||
|
||||
#define VEC_ALIGN __attribute__ ((aligned(16)))
|
||||
|
||||
#define BLK_OFFSETOF(x) (offsetof(constant_block, x))
|
||||
|
||||
// In little-endian mode, the lxv instruction loads the element at EA into
|
||||
@@ -3681,7 +3679,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
unsigned char pack_permute_val[16];
|
||||
} constant_block;
|
||||
|
||||
static const constant_block VEC_ALIGN const_block = {
|
||||
alignas(16) static const constant_block const_block = {
|
||||
|
||||
.offsetLUT_val = {
|
||||
ARRAY_TO_LXV_ORDER(
|
||||
@@ -4263,7 +4261,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
unsigned char base64_48_63_URL_val[16];
|
||||
} constant_block;
|
||||
|
||||
static const constant_block VEC_ALIGN const_block = {
|
||||
alignas(16) static const constant_block const_block = {
|
||||
.expand_permute_val = {
|
||||
ARRAY_TO_LXV_ORDER(
|
||||
0, 4, 5, 6,
|
||||
|
||||
@@ -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)
|
||||
@@ -1358,7 +1358,6 @@ void C2_MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
|
||||
// For Strings we're passed the address of the first characters in a1
|
||||
// and a2 and the length in cnt1.
|
||||
// elem_size is the element size in bytes: either 1 or 2.
|
||||
// There are two implementations. For arrays >= 8 bytes, all
|
||||
// comparisons (for hw supporting unaligned access: including the final one,
|
||||
// which may overlap) are performed 8 bytes at a time.
|
||||
@@ -1367,13 +1366,12 @@ void C2_MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
// halfword, then a short, and then a byte.
|
||||
|
||||
void C2_MacroAssembler::string_equals(Register a1, Register a2,
|
||||
Register result, Register cnt1, int elem_size)
|
||||
Register result, Register cnt1)
|
||||
{
|
||||
Label SAME, DONE, SHORT, NEXT_WORD;
|
||||
Register tmp1 = t0;
|
||||
Register tmp2 = t1;
|
||||
|
||||
assert(elem_size == 1 || elem_size == 2, "must be 2 or 1 byte");
|
||||
assert_different_registers(a1, a2, result, cnt1, tmp1, tmp2);
|
||||
|
||||
BLOCK_COMMENT("string_equals {");
|
||||
@@ -1439,15 +1437,13 @@ void C2_MacroAssembler::string_equals(Register a1, Register a2,
|
||||
}
|
||||
|
||||
bind(TAIL01);
|
||||
if (elem_size == 1) { // Only needed when comparing 1-byte elements
|
||||
// 0-1 bytes left.
|
||||
test_bit(tmp1, cnt1, 0);
|
||||
beqz(tmp1, SAME);
|
||||
{
|
||||
lbu(tmp1, Address(a1, 0));
|
||||
lbu(tmp2, Address(a2, 0));
|
||||
bne(tmp1, tmp2, DONE);
|
||||
}
|
||||
// 0-1 bytes left.
|
||||
test_bit(tmp1, cnt1, 0);
|
||||
beqz(tmp1, SAME);
|
||||
{
|
||||
lbu(tmp1, Address(a1, 0));
|
||||
lbu(tmp2, Address(a2, 0));
|
||||
bne(tmp1, tmp2, DONE);
|
||||
}
|
||||
|
||||
// Arrays are equal.
|
||||
@@ -1783,6 +1779,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);
|
||||
|
||||
@@ -1896,7 +1981,7 @@ void C2_MacroAssembler::element_compare(Register a1, Register a2, Register resul
|
||||
mv(result, true);
|
||||
}
|
||||
|
||||
void C2_MacroAssembler::string_equals_v(Register a1, Register a2, Register result, Register cnt, int elem_size) {
|
||||
void C2_MacroAssembler::string_equals_v(Register a1, Register a2, Register result, Register cnt) {
|
||||
Label DONE;
|
||||
Register tmp1 = t0;
|
||||
Register tmp2 = t1;
|
||||
@@ -1905,11 +1990,7 @@ void C2_MacroAssembler::string_equals_v(Register a1, Register a2, Register resul
|
||||
|
||||
mv(result, false);
|
||||
|
||||
if (elem_size == 2) {
|
||||
srli(cnt, cnt, 1);
|
||||
}
|
||||
|
||||
element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, elem_size == 1, DONE);
|
||||
element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, true, DONE);
|
||||
|
||||
bind(DONE);
|
||||
BLOCK_COMMENT("} string_equals_v");
|
||||
|
||||
@@ -92,8 +92,7 @@
|
||||
void arrays_hashcode_elload(Register dst, Address src, BasicType eltype);
|
||||
|
||||
void string_equals(Register r1, Register r2,
|
||||
Register result, Register cnt1,
|
||||
int elem_size);
|
||||
Register result, Register cnt1);
|
||||
|
||||
// refer to conditional_branches and float_conditional_branches
|
||||
static const int bool_test_bits = 3;
|
||||
@@ -172,8 +171,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.
|
||||
@@ -184,8 +187,7 @@
|
||||
void expand_bits_l_v(Register dst, Register src, Register mask);
|
||||
|
||||
void string_equals_v(Register r1, Register r2,
|
||||
Register result, Register cnt1,
|
||||
int elem_size);
|
||||
Register result, Register cnt1);
|
||||
|
||||
void arrays_equals_v(Register r1, Register r2,
|
||||
Register result, Register cnt1,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user