mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-16 22:39:41 +01:00
Compare commits
898 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02fe095d29 | ||
|
|
a3fd4248b7 | ||
|
|
f61b247fe3 | ||
|
|
ed260e8cae | ||
|
|
f0e706698d | ||
|
|
9439d76309 | ||
|
|
b735ef99b2 | ||
|
|
5ede5b47d4 | ||
|
|
5febc4e3bb | ||
|
|
a7c0f4b845 | ||
|
|
c74c60fb8b | ||
|
|
78d50c0215 | ||
|
|
2e06a91765 | ||
|
|
ecab52c09b | ||
|
|
ed7d5fe840 | ||
|
|
be6c15ecb4 | ||
|
|
9041f4c47f | ||
|
|
3e60ab51fe | ||
|
|
5ca8d7c2a7 | ||
|
|
ebf5ae8435 | ||
|
|
e912977a66 | ||
|
|
1383b8ef87 | ||
|
|
51d710e3cc | ||
|
|
908f3c9697 | ||
|
|
169d145e99 | ||
|
|
70f3469310 | ||
|
|
9c338f6f87 | ||
|
|
4ffd2a8aa4 | ||
|
|
c220a6c7bb | ||
|
|
40bc083267 | ||
|
|
320235ccb8 | ||
|
|
b453eb63c6 | ||
|
|
506625b768 | ||
|
|
640b71da48 | ||
|
|
eca2032c06 | ||
|
|
95577ca97f | ||
|
|
55e7494dee | ||
|
|
3bbaa772b0 | ||
|
|
0858743dee | ||
|
|
884076f6e2 | ||
|
|
024292ac4d | ||
|
|
0755477c9a | ||
|
|
4ed268ff9a | ||
|
|
0b2d0817f1 | ||
|
|
999761d0f6 | ||
|
|
812434c420 | ||
|
|
626bea80ab | ||
|
|
4c80780f6a | ||
|
|
655dc516c2 | ||
|
|
f2f7a490c0 | ||
|
|
e04a310375 | ||
|
|
ec7361e082 | ||
|
|
a0053012a4 | ||
|
|
bad38a0f92 | ||
|
|
285adff24e | ||
|
|
c9ecedd226 | ||
|
|
2a16cc890b | ||
|
|
81c6ed3882 | ||
|
|
c1198bba0e | ||
|
|
a42ba1ff1a | ||
|
|
6e91ccd1c3 | ||
|
|
2b756ab1e8 | ||
|
|
ca753ebad6 | ||
|
|
190e113031 | ||
|
|
166ea12d73 | ||
|
|
e7ca8c7d55 | ||
|
|
f364fcab79 | ||
|
|
bd65d483df | ||
|
|
57210af9bc | ||
|
|
a70521c62e | ||
|
|
b023fea062 | ||
|
|
b69a3849b2 | ||
|
|
6e760b9b74 | ||
|
|
39a3652968 | ||
|
|
08db4b9962 | ||
|
|
dbae90c950 | ||
|
|
059b49b955 | ||
|
|
b6d5f49b8d | ||
|
|
5856dc34c8 | ||
|
|
fa2eb61648 | ||
|
|
e3aeebec17 | ||
|
|
6fb6f3d39b | ||
|
|
44b19c01ac | ||
|
|
a65f200220 | ||
|
|
8c363b3e3e | ||
|
|
c5cbcac828 | ||
|
|
dccca0fb7a | ||
|
|
ba23105231 | ||
|
|
26ccb3cef1 | ||
|
|
b0f98df75a | ||
|
|
dd113c8df0 | ||
|
|
41520998aa | ||
|
|
98f54d90ea | ||
|
|
7698c373a6 | ||
|
|
e320162815 | ||
|
|
3e3298509f | ||
|
|
a6be228642 | ||
|
|
c22e01d776 | ||
|
|
9dcc502cc8 | ||
|
|
9c266ae83c | ||
|
|
9660320041 | ||
|
|
4680dc9831 | ||
|
|
ecbdd3405a | ||
|
|
38a261415d | ||
|
|
899e13f40a | ||
|
|
001aaa1e49 | ||
|
|
f3b34d32d6 | ||
|
|
e77cdd93ea | ||
|
|
72e22b4de5 | ||
|
|
25480f0011 | ||
|
|
636c61a386 | ||
|
|
87d734012e | ||
|
|
d023982600 | ||
|
|
4c03e5938d | ||
|
|
ad0fd13f20 | ||
|
|
a382996bb4 | ||
|
|
391ea15118 | ||
|
|
19a76a45e9 | ||
|
|
95b7a8b3e3 | ||
|
|
16e461ef31 | ||
|
|
3c0eed8e47 | ||
|
|
f155f7d6e5 | ||
|
|
b81f4faed7 | ||
|
|
5a442197d2 | ||
|
|
db12f1934a | ||
|
|
d78fa5a9f6 | ||
|
|
72d3a2a977 | ||
|
|
6927fc3904 | ||
|
|
9593730a23 | ||
|
|
8cd79752c6 | ||
|
|
958383d69c | ||
|
|
e9e331b2a9 | ||
|
|
bdb1646a1e | ||
|
|
23985c29b4 | ||
|
|
0ad919c1e5 | ||
|
|
43cfd80c1c | ||
|
|
a60e523f88 | ||
|
|
fd766b27b9 | ||
|
|
8b5bb01355 | ||
|
|
1fc0b01601 | ||
|
|
0c39228ec1 | ||
|
|
10762d408b | ||
|
|
f28126ebc2 | ||
|
|
c31f4861fb | ||
|
|
15e8609a2c | ||
|
|
022e29a775 | ||
|
|
e13b4c8de9 | ||
|
|
f83454cd61 | ||
|
|
8ad1fcc48a | ||
|
|
c1c0155604 | ||
|
|
cd50d78d44 | ||
|
|
241808e13f | ||
|
|
1b3e23110b | ||
|
|
a26a6f3152 | ||
|
|
47017e3864 | ||
|
|
bcca5cee2d | ||
|
|
198782c957 | ||
|
|
d0624f8b62 | ||
|
|
4c9eaddaef | ||
|
|
c71be802b5 | ||
|
|
b8acbc3ed8 | ||
|
|
244e6293c3 | ||
|
|
c0e6ffabc2 | ||
|
|
5116d9e5fe | ||
|
|
78117eff56 | ||
|
|
02e187119d | ||
|
|
90ea42f716 | ||
|
|
e29346dbd6 | ||
|
|
e606278fc8 | ||
|
|
83953c458e | ||
|
|
bc3d865640 | ||
|
|
8d73fe91bc | ||
|
|
c56fb0b6ef | ||
|
|
487cc3c5be | ||
|
|
078d0d4968 | ||
|
|
7e484e2a63 | ||
|
|
f95af744b0 | ||
|
|
72d1066ae3 | ||
|
|
0ceb366dc2 | ||
|
|
9dffbc9c4c | ||
|
|
e304d37996 | ||
|
|
8d529bc4f3 | ||
|
|
ca41644538 | ||
|
|
6656e767db | ||
|
|
68a35511eb | ||
|
|
d906e45026 | ||
|
|
8a571ee7f2 | ||
|
|
ba0ae4cb28 | ||
|
|
df736eb582 | ||
|
|
d25b9befe0 | ||
|
|
67ba8b45dd | ||
|
|
febd4b26b2 | ||
|
|
c0c7d39b59 | ||
|
|
6b360ac99a | ||
|
|
0f4c3dc944 | ||
|
|
84a4a3647c | ||
|
|
f96b6bcd4d | ||
|
|
dc4d9b4849 | ||
|
|
da3a5da81b | ||
|
|
0d0d93e8f6 | ||
|
|
d1e362e9a8 | ||
|
|
05f8a6fca8 | ||
|
|
b5f450a599 | ||
|
|
6c52b73465 | ||
|
|
567c0c9335 | ||
|
|
fc4755535d | ||
|
|
a9f3d3a290 | ||
|
|
500462fb69 | ||
|
|
68a4396dbc | ||
|
|
da0d9598d0 | ||
|
|
b96b9c3d5b | ||
|
|
3bc449797e | ||
|
|
cf5a25538e | ||
|
|
ea7e943874 | ||
|
|
3387b3195c | ||
|
|
8269fdc78e | ||
|
|
57553ca1db | ||
|
|
158e59ab91 | ||
|
|
1a206d2a6c | ||
|
|
a5e0c9d0c5 | ||
|
|
819de07117 | ||
|
|
f40381e41d | ||
|
|
e801e51311 | ||
|
|
7ea08d3928 | ||
|
|
8e921aee5a | ||
|
|
6d0bbc8a18 | ||
|
|
ee3665bca0 | ||
|
|
2ba8a06f0c | ||
|
|
8ac4a88f3c | ||
|
|
6c5804722b | ||
|
|
812bd8e94d | ||
|
|
7fbeede14c | ||
|
|
d80b5c8728 | ||
|
|
7d63c9fa4d | ||
|
|
beda14e3cb | ||
|
|
ae11d8f446 | ||
|
|
e82d7f5810 | ||
|
|
577ac0610a | ||
|
|
c9b8bd6ff4 | ||
|
|
913d318c97 | ||
|
|
724e8c076e | ||
|
|
e0e82066fe | ||
|
|
443afdc77f | ||
|
|
fe09e93b8f | ||
|
|
d19442399c | ||
|
|
c4fbfa2103 | ||
|
|
1b9efaa11e | ||
|
|
b2b56cfc00 | ||
|
|
53d152e7db | ||
|
|
d4705947d8 | ||
|
|
5f357fa27d | ||
|
|
e544cd9920 | ||
|
|
458f033d4d | ||
|
|
3f21c8bd1f | ||
|
|
ddb64836e5 | ||
|
|
8ed214f3b1 | ||
|
|
b9f7caed77 | ||
|
|
ebb7f5d39b | ||
|
|
05c63e8009 | ||
|
|
559795b0eb | ||
|
|
413ac74ecc | ||
|
|
3bdac53178 | ||
|
|
57d02d9ac5 | ||
|
|
a2e86ff3c5 | ||
|
|
e2feff8599 | ||
|
|
16da81eb43 | ||
|
|
c851735631 | ||
|
|
317dacc308 | ||
|
|
a6fb87dbe8 | ||
|
|
7af3cd9558 | ||
|
|
4da1c9df52 | ||
|
|
302508df9e | ||
|
|
c6d64edfbe | ||
|
|
1be412dca0 | ||
|
|
164d0368f6 | ||
|
|
c671089d6e | ||
|
|
3488f53d2c | ||
|
|
330ee87131 | ||
|
|
d5d311f026 | ||
|
|
ea754316fd | ||
|
|
c239c0ab00 | ||
|
|
0226c0298f | ||
|
|
965b68107f | ||
|
|
a34994476e | ||
|
|
2202156acc | ||
|
|
3fe0d29ec3 | ||
|
|
28297411b1 | ||
|
|
4669005123 | ||
|
|
3e4e5dd06f | ||
|
|
ea0b49c36d | ||
|
|
fe4d7f8c1b | ||
|
|
f53d0519b9 | ||
|
|
70ebb5e8c9 | ||
|
|
b4028c91d5 | ||
|
|
08b0b34623 | ||
|
|
7bf4c608e7 | ||
|
|
b7703f7948 | ||
|
|
d25ad881eb | ||
|
|
011de4c894 | ||
|
|
3e2d12d85a | ||
|
|
bdc1ef2021 | ||
|
|
af5932efb5 | ||
|
|
3b0da29879 | ||
|
|
e307b5cca8 | ||
|
|
4189fcbac4 | ||
|
|
3263361a28 | ||
|
|
8fcbb110e9 | ||
|
|
de59da27a6 | ||
|
|
d288ca28be | ||
|
|
e756c0dbbb | ||
|
|
89fe586edd | ||
|
|
9e209fef86 | ||
|
|
75ff7e15fe | ||
|
|
06fdb61e1c | ||
|
|
41c94eed37 | ||
|
|
518d5f4bbb | ||
|
|
f79bd54bbb | ||
|
|
52155dbbb0 | ||
|
|
ac9e51023f | ||
|
|
971ea23c95 | ||
|
|
4e53a9d9df | ||
|
|
8477630970 | ||
|
|
2f1aed2a16 | ||
|
|
67e93281a4 | ||
|
|
ed9066bdf4 | ||
|
|
7a22b76b73 | ||
|
|
0ba2942c6e | ||
|
|
fc8038441d | ||
|
|
b746701e57 | ||
|
|
2da0cdadb8 | ||
|
|
ad510fb25e | ||
|
|
2292246f8c | ||
|
|
03e9ea169b | ||
|
|
594c080b2b | ||
|
|
e6ebefaa40 | ||
|
|
38cd860daa | ||
|
|
743c821289 | ||
|
|
b02c125676 | ||
|
|
06f9ff047f | ||
|
|
e6ac956a7a | ||
|
|
9f796da377 | ||
|
|
ceb0c0fc39 | ||
|
|
5160cfb496 | ||
|
|
0735dc27c7 | ||
|
|
79f9d8d832 | ||
|
|
4994bd5942 | ||
|
|
016694bf74 | ||
|
|
5540a7859b | ||
|
|
aae9902234 | ||
|
|
ea6674fec8 | ||
|
|
d714b5d3da | ||
|
|
ce02836232 | ||
|
|
ac141c2fa1 | ||
|
|
ed70910b0f | ||
|
|
f155661151 | ||
|
|
c68697e178 | ||
|
|
dccb1782ec | ||
|
|
699b8112f8 | ||
|
|
0385975f44 | ||
|
|
7d7d308d9a | ||
|
|
eceb3bbc80 | ||
|
|
3acdba38ce | ||
|
|
523993e9e8 | ||
|
|
b8da9695f0 | ||
|
|
48ba9d415f | ||
|
|
9dd93c6a2c | ||
|
|
f8c8bcf4fd | ||
|
|
15b5b54ac7 | ||
|
|
644e400cd1 | ||
|
|
fd7f78a535 | ||
|
|
1b94a3466e | ||
|
|
13bab09bff | ||
|
|
8f1bb59e1a | ||
|
|
1bd683b588 | ||
|
|
37b70707bd | ||
|
|
62a58062e5 | ||
|
|
9609f57cef | ||
|
|
441dbde2c3 | ||
|
|
ee0bcc5526 | ||
|
|
ceb51d4444 | ||
|
|
d83346dcff | ||
|
|
9334fe2eca | ||
|
|
03230f8565 | ||
|
|
a3843e8e6e | ||
|
|
60c29ff57b | ||
|
|
30d2003698 | ||
|
|
9dc62825b5 | ||
|
|
6949e34575 | ||
|
|
7da274ded4 | ||
|
|
4e0b03580d | ||
|
|
a23987fecb | ||
|
|
04c0b130f0 | ||
|
|
cab515962b | ||
|
|
bd55d7a495 | ||
|
|
2b11a28997 | ||
|
|
5ed72775a7 | ||
|
|
dc08cf016e | ||
|
|
ea774b74e8 | ||
|
|
365660e667 | ||
|
|
1d73f8842a | ||
|
|
cb9358b561 | ||
|
|
bc9ece9698 | ||
|
|
1cde536b98 | ||
|
|
1a6cbe421f | ||
|
|
3fd89be6d1 | ||
|
|
18190519e7 | ||
|
|
be0161a8e6 | ||
|
|
bc72f476d1 | ||
|
|
a65d9532ed | ||
|
|
20b5f09777 | ||
|
|
3b44d7bfa4 | ||
|
|
8193856af8 | ||
|
|
10ae602944 | ||
|
|
770d2b41d1 | ||
|
|
70c1ff7e15 | ||
|
|
6ed81641b1 | ||
|
|
5e4a2ead71 | ||
|
|
b787ad6f69 | ||
|
|
6b4a5ef105 | ||
|
|
9f7dc19ffd | ||
|
|
805f1deebc | ||
|
|
b85440d085 | ||
|
|
fd2ee0844a | ||
|
|
27c58c06cf | ||
|
|
cbb3d23e19 | ||
|
|
6e368e0c69 | ||
|
|
e1b2229b0b | ||
|
|
bdd37b0e5e | ||
|
|
5ddeb56759 | ||
|
|
a5c9bc7032 | ||
|
|
5fd2b7d61a | ||
|
|
9bef2d1610 | ||
|
|
6fc032de2c | ||
|
|
413c6bd040 | ||
|
|
2eaddd5b0a | ||
|
|
7db8bff9e1 | ||
|
|
5ad102ca3f | ||
|
|
a56cd371a2 | ||
|
|
d3429ada8f | ||
|
|
db3f6eabb5 | ||
|
|
017dc093ac | ||
|
|
1d8cca2b84 | ||
|
|
eefbfdce31 | ||
|
|
401af27b9d | ||
|
|
38af17d078 | ||
|
|
820263e48a | ||
|
|
b65fdf5af0 | ||
|
|
d2082c58ff | ||
|
|
563e876246 | ||
|
|
c70258ca1c | ||
|
|
9697e5bf74 | ||
|
|
c9ecc82666 | ||
|
|
bf225c201f | ||
|
|
e5ab210713 | ||
|
|
18c2e40de7 | ||
|
|
40d159d4a9 | ||
|
|
25e509b0db | ||
|
|
0acd065bf5 | ||
|
|
f36147b326 | ||
|
|
5cf672e778 | ||
|
|
a10ee46e6d | ||
|
|
6cff49c0fe | ||
|
|
ebb1095805 | ||
|
|
bcd86d575f | ||
|
|
5edd546585 | ||
|
|
a531c9aece | ||
|
|
99c299f098 | ||
|
|
272e66d017 | ||
|
|
14c79be161 | ||
|
|
7c34bdf73c | ||
|
|
0029554d20 | ||
|
|
77bd417c99 | ||
|
|
bc828c8fb6 | ||
|
|
917d0182cb | ||
|
|
3bacf7ea85 | ||
|
|
4a351e3e57 | ||
|
|
189017f750 | ||
|
|
3f59eae3d0 | ||
|
|
46988e1073 | ||
|
|
f7e8d255cc | ||
|
|
26b002805a | ||
|
|
8c00c374ec | ||
|
|
59bec29c35 | ||
|
|
a86dd56de3 | ||
|
|
76442f39b9 | ||
|
|
445e5ecd98 | ||
|
|
3ffc5b9ef7 | ||
|
|
529049be6b | ||
|
|
eddfc6449f | ||
|
|
2e7e272d7b | ||
|
|
ee0d309bbd | ||
|
|
2300a212dd | ||
|
|
3d74cbe0ac | ||
|
|
f5afbbd32a | ||
|
|
cbc7090b91 | ||
|
|
f735275021 | ||
|
|
3d37c4e37a | ||
|
|
73ab54e4c3 | ||
|
|
80662a485a | ||
|
|
c118543efe | ||
|
|
13e0f99626 | ||
|
|
bf3cfbeff4 | ||
|
|
2a53f5a5c2 | ||
|
|
f67e435431 | ||
|
|
c28bb8bf7a | ||
|
|
518536c607 | ||
|
|
0f7808f333 | ||
|
|
c9bea77342 | ||
|
|
6681fc72d3 | ||
|
|
7282f68cee | ||
|
|
6e203384f8 | ||
|
|
6249259c80 | ||
|
|
a41d35073e | ||
|
|
7daf9813c0 | ||
|
|
a201be8555 | ||
|
|
db4b4a5b35 | ||
|
|
d886ae12a2 | ||
|
|
eec04dd010 | ||
|
|
a9bd1ad40c | ||
|
|
b1fa1ecc98 | ||
|
|
83feb7a238 | ||
|
|
963b83fcf1 | ||
|
|
68b27b88b5 | ||
|
|
e0245682c8 | ||
|
|
4761479608 | ||
|
|
fe26467633 | ||
|
|
e2c5d03546 | ||
|
|
19bb6ebfaf | ||
|
|
54e37629f6 | ||
|
|
974ad4e8cd | ||
|
|
117f0b4051 | ||
|
|
dedcce0450 | ||
|
|
03526e250d | ||
|
|
1de2acea77 | ||
|
|
fa32bfe113 | ||
|
|
91df797879 | ||
|
|
92712ef45d | ||
|
|
5850bf4488 | ||
|
|
853319439e | ||
|
|
63e08d4af7 | ||
|
|
5c67e3d6e5 | ||
|
|
2349304bb1 | ||
|
|
0bd2f9cba2 | ||
|
|
27e6a4d2f7 | ||
|
|
1934bd8d2c | ||
|
|
7b255b8a62 | ||
|
|
310ef85667 | ||
|
|
5205eae6ff | ||
|
|
bbc5c98b14 | ||
|
|
563a3358f6 | ||
|
|
ec7c6be6a9 | ||
|
|
197fde5363 | ||
|
|
ec3bb93d79 | ||
|
|
39c9de2ace | ||
|
|
05c9eec8d0 | ||
|
|
fea73c1d40 | ||
|
|
afb4a1be9e | ||
|
|
7c13a2cd9a | ||
|
|
4df9c87345 | ||
|
|
9449fea2cd | ||
|
|
1fa772e814 | ||
|
|
8ad4836883 | ||
|
|
d75ea7e679 | ||
|
|
e9a434165a | ||
|
|
45300dd123 | ||
|
|
44cff9d6ab | ||
|
|
3bcbcc5747 | ||
|
|
f3e0588d0b | ||
|
|
f2d2eef988 | ||
|
|
1c560727b8 | ||
|
|
f153e415d7 | ||
|
|
fba74f796e | ||
|
|
56ebb8c1b9 | ||
|
|
5cf349c3b0 | ||
|
|
21f2e9a71c | ||
|
|
854de8c9c6 | ||
|
|
16af473397 | ||
|
|
da0a51ce97 | ||
|
|
566279af49 | ||
|
|
77e69e02eb | ||
|
|
dcc7254a38 | ||
|
|
003be0dee2 | ||
|
|
2d9f0324ba | ||
|
|
25ed36f3ef | ||
|
|
a2315ddd2a | ||
|
|
66836d40b8 | ||
|
|
3daa03c30f | ||
|
|
24117c6e9a | ||
|
|
5e40fb6bda | ||
|
|
2528c620a6 | ||
|
|
1be29bd725 | ||
|
|
2f683fdc4a | ||
|
|
c75df634be | ||
|
|
fd13e1ce98 | ||
|
|
6c9236c80c | ||
|
|
1926aeb1a3 | ||
|
|
74822ce12a | ||
|
|
ea86a20e6d | ||
|
|
5e30bf6835 | ||
|
|
c50370599e | ||
|
|
c460f842bf | ||
|
|
549b875866 | ||
|
|
832bfbc0dd | ||
|
|
3066a67e62 | ||
|
|
ce9986991d | ||
|
|
eac8f5d2c9 | ||
|
|
2304044ab2 | ||
|
|
0f1cd987b3 | ||
|
|
1ac7489874 | ||
|
|
055d2ffa69 | ||
|
|
2bff8e0a13 | ||
|
|
c6448dc3af | ||
|
|
1703915d3f | ||
|
|
a910b20b51 | ||
|
|
7d7e60c8ae | ||
|
|
534d2b33dc | ||
|
|
e9a62d79cd | ||
|
|
13a3927855 | ||
|
|
282ee40a56 | ||
|
|
e7a450038a | ||
|
|
38f59f84c9 | ||
|
|
e1681c4828 | ||
|
|
e138297323 | ||
|
|
7583a7b857 | ||
|
|
e85c7d09df | ||
|
|
eec1153993 | ||
|
|
fc739fee53 | ||
|
|
aeca49e43f | ||
|
|
54c95cf226 | ||
|
|
cd6caedd0a | ||
|
|
b32ccf2cb2 | ||
|
|
0572b6ece7 | ||
|
|
d1052c70cb | ||
|
|
61a590e9be | ||
|
|
9d518b3213 | ||
|
|
1dda79cfab | ||
|
|
aa1911191c | ||
|
|
00adbbe553 | ||
|
|
c2d76f9844 | ||
|
|
4dd1b3a610 | ||
|
|
240541e1c1 | ||
|
|
a23de2ec09 | ||
|
|
3525a40f39 | ||
|
|
712d866b72 | ||
|
|
da7080fffb | ||
|
|
4edf791aec | ||
|
|
12196baf67 | ||
|
|
a471fe992f | ||
|
|
839cede1a4 | ||
|
|
ecd2d83096 | ||
|
|
d8f9b188fa | ||
|
|
aa26cede63 | ||
|
|
20e983a97c | ||
|
|
97ec9d3e0a | ||
|
|
01b15bc1f9 | ||
|
|
6d05a1d3f4 | ||
|
|
8ea544c33f | ||
|
|
334683e634 | ||
|
|
20e0055e20 | ||
|
|
83fe688d80 | ||
|
|
a49ecb26c5 | ||
|
|
7f702cf483 | ||
|
|
bd666f90eb | ||
|
|
a0c3efa6a8 | ||
|
|
7576064a10 | ||
|
|
8df6b2c4a3 | ||
|
|
ff24088c86 | ||
|
|
5a1301df19 | ||
|
|
5039b42de1 | ||
|
|
1ca008fd02 | ||
|
|
cf75f1f9c6 | ||
|
|
52526080ba | ||
|
|
f799cf180a | ||
|
|
56c75453cd | ||
|
|
7447276475 | ||
|
|
c90c31b07e | ||
|
|
52c6044fe4 | ||
|
|
4e1bf31368 | ||
|
|
878497fb85 | ||
|
|
f2ef809719 | ||
|
|
1fa090524a | ||
|
|
f71d64fbeb | ||
|
|
850bc20306 | ||
|
|
75ce44aa84 | ||
|
|
5c4f92ba9a | ||
|
|
263e32bb85 | ||
|
|
7d6c902ce8 | ||
|
|
5091057614 | ||
|
|
ba0c12231b | ||
|
|
cbcf401170 | ||
|
|
f8de5bc582 | ||
|
|
9a726df373 | ||
|
|
2af869b193 | ||
|
|
5c1f77fab1 | ||
|
|
54acadbe66 | ||
|
|
0514cee6c8 | ||
|
|
28e96e333b | ||
|
|
f5201ac117 | ||
|
|
a3609ba5ac | ||
|
|
116b8543b0 | ||
|
|
fdfc557878 | ||
|
|
54fec2b98b | ||
|
|
03d66d9ee2 | ||
|
|
f6ff38ab42 | ||
|
|
dbbfa76b73 | ||
|
|
9af36b13c5 | ||
|
|
34412da52b | ||
|
|
a350a1115a | ||
|
|
bcad87eacb | ||
|
|
2a70a6dc58 | ||
|
|
6df0f5e390 | ||
|
|
9c3eaa49f7 | ||
|
|
dfcea0547e | ||
|
|
c748d358b2 | ||
|
|
72679c94ee | ||
|
|
10e6eec9e6 | ||
|
|
251f2ac785 | ||
|
|
fe7ec31259 | ||
|
|
516197f50b | ||
|
|
ad1033d68f | ||
|
|
c220b1358c | ||
|
|
9ae39b62b9 | ||
|
|
3d35b408e1 | ||
|
|
de34bb8e66 | ||
|
|
620df7ec34 | ||
|
|
6b4393917a | ||
|
|
81985d422d | ||
|
|
d627282f0c | ||
|
|
96f71a9a6b | ||
|
|
17cf49746d | ||
|
|
c6ab63d306 | ||
|
|
ff54a6493a | ||
|
|
c11f36e620 | ||
|
|
8f121a173c | ||
|
|
33970629ac | ||
|
|
c51bed739d | ||
|
|
a6464b74a8 | ||
|
|
0dd50dbb3e | ||
|
|
dec42bebb8 | ||
|
|
2fe1298447 | ||
|
|
2e3bdec985 | ||
|
|
c4fb00a7be | ||
|
|
01d4b772de | ||
|
|
c7125aa2af | ||
|
|
0dce98b716 | ||
|
|
08b1fa4cb3 | ||
|
|
23e1e2ff4a | ||
|
|
5a62e99523 | ||
|
|
982064e50c | ||
|
|
b52af182c4 | ||
|
|
7bc0d82450 | ||
|
|
b7fcd0b235 | ||
|
|
984d7f9cdf | ||
|
|
42d3604a31 | ||
|
|
cf78925859 | ||
|
|
ba32b78bfa | ||
|
|
547ce03016 | ||
|
|
f07f5ce984 | ||
|
|
cabd7c1f7a | ||
|
|
57266064a7 | ||
|
|
2b94b70ef5 | ||
|
|
1130c1bc33 | ||
|
|
2f63d3aee5 | ||
|
|
382f870cd5 | ||
|
|
8c760e78b9 | ||
|
|
afa52e4681 | ||
|
|
164cae469c | ||
|
|
49a82d8806 | ||
|
|
96070212ad | ||
|
|
53a83d15a1 | ||
|
|
21b72dea78 | ||
|
|
51877f568b | ||
|
|
c1deb9eebf | ||
|
|
f62f1178aa | ||
|
|
a08208283b | ||
|
|
f7cd3fad24 | ||
|
|
ff75f763c0 | ||
|
|
a16d23557b | ||
|
|
e55ddabffa | ||
|
|
9a1c1f2efb | ||
|
|
e57a214e2a | ||
|
|
2f2acb2e3f | ||
|
|
06d804a0f0 | ||
|
|
6e390ef17c | ||
|
|
9652ae9a8d | ||
|
|
59460ff700 | ||
|
|
9d060574e5 | ||
|
|
fedd0a0ee3 | ||
|
|
79497ef7f5 | ||
|
|
8416ca3104 | ||
|
|
d8c3533a91 | ||
|
|
eacfcd86d3 | ||
|
|
534a8605e5 | ||
|
|
6fe9143bbb | ||
|
|
1a01839f8c | ||
|
|
26848a7d6c | ||
|
|
0e725c6fb1 | ||
|
|
b3f56086c9 | ||
|
|
ee35f6384f | ||
|
|
12a0dd03b8 | ||
|
|
366650a438 | ||
|
|
78b1360e7d | ||
|
|
417f8ecf07 | ||
|
|
57cabc6d74 | ||
|
|
b4c4496ef8 | ||
|
|
b5334fe237 | ||
|
|
e8ef93ae9d | ||
|
|
25b22c9b55 | ||
|
|
ead4529c92 | ||
|
|
3a1887269b | ||
|
|
e7f63ba310 | ||
|
|
a0fb35c837 | ||
|
|
032ead1d90 | ||
|
|
a8b4284848 | ||
|
|
ed39e17e34 | ||
|
|
6749c62b9e | ||
|
|
9aeacf2de5 | ||
|
|
991097b7bf | ||
|
|
523a4efe1c | ||
|
|
0dd7c69b9e | ||
|
|
66535fe26d | ||
|
|
db7af2b3c3 | ||
|
|
99829950f6 | ||
|
|
0ef0986731 | ||
|
|
610a18e7b3 | ||
|
|
8d33ea7395 | ||
|
|
3c53057fa6 | ||
|
|
1fcede053c | ||
|
|
fae9c7a3f0 | ||
|
|
dd68829017 | ||
|
|
b85fe02be5 | ||
|
|
e18277b470 | ||
|
|
e5ce5c57c8 | ||
|
|
91fdd72c97 | ||
|
|
b6ec93b038 | ||
|
|
65e63b6ab4 | ||
|
|
3f0fef2c9c | ||
|
|
3e0ef832cc | ||
|
|
7b7136b4ec | ||
|
|
5886ef728f | ||
|
|
d7aa349820 | ||
|
|
3b32f6a8ec | ||
|
|
8f73357004 | ||
|
|
429158218b | ||
|
|
ef4cbec6fb | ||
|
|
e9216efefc | ||
|
|
e5196fc24d | ||
|
|
c98dffa186 | ||
|
|
7d7fc69355 | ||
|
|
42ab8fcfb9 | ||
|
|
bf7d40d048 | ||
|
|
5ae32c4c86 | ||
|
|
56ce70c5df | ||
|
|
abc76c6b5b | ||
|
|
9586817cea | ||
|
|
38b877e941 | ||
|
|
8f487d26c0 | ||
|
|
500a3a2d0a | ||
|
|
a2f99fd88b | ||
|
|
0582bd290d | ||
|
|
3ff83ec49e | ||
|
|
7c9c8ba363 | ||
|
|
ca7b885873 | ||
|
|
92be7821f5 | ||
|
|
bcf860703d | ||
|
|
d186dacdb7 | ||
|
|
ef45c8154c | ||
|
|
cd9b1bc820 | ||
|
|
fcb68ea22d | ||
|
|
eb256deb80 | ||
|
|
156187accc | ||
|
|
a377773fa7 | ||
|
|
cae1fd3385 | ||
|
|
eb8ee8bdc7 | ||
|
|
2103dc15cb | ||
|
|
1c72b350e4 | ||
|
|
52338c94f6 | ||
|
|
91f12600d2 | ||
|
|
6c616c71ec | ||
|
|
e94ad551c6 | ||
|
|
d735255919 | ||
|
|
d024f58e61 | ||
|
|
026975a1aa | ||
|
|
8adb052b46 | ||
|
|
9658cecde3 | ||
|
|
b2e7cda6a0 | ||
|
|
65fda5c02a | ||
|
|
d1b788005b | ||
|
|
bb2611ad43 | ||
|
|
e918a59b1d | ||
|
|
28acca609b | ||
|
|
029e3bf8f5 | ||
|
|
78158f30ae | ||
|
|
c793de989f | ||
|
|
15178aa298 | ||
|
|
fe3be498b8 | ||
|
|
62fde68708 | ||
|
|
af87035b71 |
2
.github/actions/build-jtreg/action.yml
vendored
2
.github/actions/build-jtreg/action.yml
vendored
@@ -65,4 +65,4 @@ runs:
|
|||||||
with:
|
with:
|
||||||
name: bundles-jtreg-${{ steps.version.outputs.value }}
|
name: bundles-jtreg-${{ steps.version.outputs.value }}
|
||||||
path: jtreg/installed
|
path: jtreg/installed
|
||||||
retention-days: 1
|
retention-days: 5
|
||||||
|
|||||||
8
.github/actions/get-msys2/action.yml
vendored
8
.github/actions/get-msys2/action.yml
vendored
@@ -30,15 +30,15 @@ runs:
|
|||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: 'Install MSYS2'
|
- name: 'Install MSYS2'
|
||||||
uses: msys2/setup-msys2@v2.22.0
|
id: msys2
|
||||||
|
uses: msys2/setup-msys2@v2.28.0
|
||||||
with:
|
with:
|
||||||
install: 'autoconf tar unzip zip make'
|
install: 'autoconf tar unzip zip make'
|
||||||
path-type: minimal
|
path-type: minimal
|
||||||
location: ${{ runner.tool_cache }}/msys2
|
release: false
|
||||||
|
|
||||||
# We can't run bash until this is completed, so stick with pwsh
|
# We can't run bash until this is completed, so stick with pwsh
|
||||||
- name: 'Set MSYS2 path'
|
- name: 'Set MSYS2 path'
|
||||||
run: |
|
run: |
|
||||||
# Prepend msys2/msys64/usr/bin to the PATH
|
echo "${{ steps.msys2.outputs.msys2-location }}/usr/bin" >> $env:GITHUB_PATH
|
||||||
echo "$env:RUNNER_TOOL_CACHE/msys2/msys64/usr/bin" >> $env:GITHUB_PATH
|
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|||||||
2
.github/actions/upload-bundles/action.yml
vendored
2
.github/actions/upload-bundles/action.yml
vendored
@@ -91,5 +91,5 @@ runs:
|
|||||||
with:
|
with:
|
||||||
name: bundles-${{ inputs.platform }}${{ inputs.debug-suffix }}${{ inputs.static-suffix }}${{ inputs.bundle-suffix }}
|
name: bundles-${{ inputs.platform }}${{ inputs.debug-suffix }}${{ inputs.static-suffix }}${{ inputs.bundle-suffix }}
|
||||||
path: bundles
|
path: bundles
|
||||||
retention-days: 1
|
retention-days: 5
|
||||||
if: steps.bundles.outputs.bundles-found == 'true'
|
if: steps.bundles.outputs.bundles-found == 'true'
|
||||||
|
|||||||
6
.github/workflows/build-alpine-linux.yml
vendored
6
.github/workflows/build-alpine-linux.yml
vendored
@@ -51,6 +51,10 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
@@ -104,9 +108,11 @@ jobs:
|
|||||||
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Upload bundles'
|
- name: 'Upload bundles'
|
||||||
uses: ./.github/actions/upload-bundles
|
uses: ./.github/actions/upload-bundles
|
||||||
with:
|
with:
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|||||||
14
.github/workflows/build-cross-compile.yml
vendored
14
.github/workflows/build-cross-compile.yml
vendored
@@ -40,6 +40,10 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-cross-compile:
|
build-cross-compile:
|
||||||
@@ -60,26 +64,26 @@ jobs:
|
|||||||
gnu-arch: aarch64
|
gnu-arch: aarch64
|
||||||
debian-arch: arm64
|
debian-arch: arm64
|
||||||
debian-repository: https://httpredir.debian.org/debian/
|
debian-repository: https://httpredir.debian.org/debian/
|
||||||
debian-version: bullseye
|
debian-version: bookworm
|
||||||
tolerate-sysroot-errors: false
|
tolerate-sysroot-errors: false
|
||||||
- target-cpu: arm
|
- target-cpu: arm
|
||||||
gnu-arch: arm
|
gnu-arch: arm
|
||||||
debian-arch: armhf
|
debian-arch: armhf
|
||||||
debian-repository: https://httpredir.debian.org/debian/
|
debian-repository: https://httpredir.debian.org/debian/
|
||||||
debian-version: bullseye
|
debian-version: bookworm
|
||||||
tolerate-sysroot-errors: false
|
tolerate-sysroot-errors: false
|
||||||
gnu-abi: eabihf
|
gnu-abi: eabihf
|
||||||
- target-cpu: s390x
|
- target-cpu: s390x
|
||||||
gnu-arch: s390x
|
gnu-arch: s390x
|
||||||
debian-arch: s390x
|
debian-arch: s390x
|
||||||
debian-repository: https://httpredir.debian.org/debian/
|
debian-repository: https://httpredir.debian.org/debian/
|
||||||
debian-version: bullseye
|
debian-version: bookworm
|
||||||
tolerate-sysroot-errors: false
|
tolerate-sysroot-errors: false
|
||||||
- target-cpu: ppc64le
|
- target-cpu: ppc64le
|
||||||
gnu-arch: powerpc64le
|
gnu-arch: powerpc64le
|
||||||
debian-arch: ppc64el
|
debian-arch: ppc64el
|
||||||
debian-repository: https://httpredir.debian.org/debian/
|
debian-repository: https://httpredir.debian.org/debian/
|
||||||
debian-version: bullseye
|
debian-version: bookworm
|
||||||
tolerate-sysroot-errors: false
|
tolerate-sysroot-errors: false
|
||||||
- target-cpu: riscv64
|
- target-cpu: riscv64
|
||||||
gnu-arch: riscv64
|
gnu-arch: riscv64
|
||||||
@@ -189,4 +193,4 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
make-target: 'hotspot ${{ inputs.make-arguments }}'
|
make-target: 'hotspot ${{ inputs.make-arguments }}'
|
||||||
platform: linux-${{ matrix.target-cpu }}
|
platform: linux-${{ matrix.target-cpu }}
|
||||||
if: steps.create-sysroot.outcome == 'success' || steps.get-cached-sysroot.outputs.cache-hit == 'true'
|
if: ((steps.create-sysroot.outcome == 'success' || steps.get-cached-sysroot.outputs.cache-hit == 'true') && inputs.dry-run == false)
|
||||||
|
|||||||
6
.github/workflows/build-linux.yml
vendored
6
.github/workflows/build-linux.yml
vendored
@@ -61,6 +61,10 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
bundle-suffix:
|
bundle-suffix:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
@@ -139,6 +143,7 @@ jobs:
|
|||||||
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: "${{ matrix.debug-level == 'debug' && '-debug' || '' }}"
|
debug-suffix: "${{ matrix.debug-level == 'debug' && '-debug' || '' }}"
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Upload bundles'
|
- name: 'Upload bundles'
|
||||||
uses: ./.github/actions/upload-bundles
|
uses: ./.github/actions/upload-bundles
|
||||||
@@ -147,3 +152,4 @@ jobs:
|
|||||||
debug-suffix: "${{ matrix.debug-level == 'debug' && '-debug' || '' }}"
|
debug-suffix: "${{ matrix.debug-level == 'debug' && '-debug' || '' }}"
|
||||||
bundle-suffix: ${{ inputs.bundle-suffix }}
|
bundle-suffix: ${{ inputs.bundle-suffix }}
|
||||||
static-suffix: ${{ inputs.static-suffix }}
|
static-suffix: ${{ inputs.static-suffix }}
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|||||||
6
.github/workflows/build-macos.yml
vendored
6
.github/workflows/build-macos.yml
vendored
@@ -54,6 +54,10 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-macos:
|
build-macos:
|
||||||
@@ -118,9 +122,11 @@ jobs:
|
|||||||
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Upload bundles'
|
- name: 'Upload bundles'
|
||||||
uses: ./.github/actions/upload-bundles
|
uses: ./.github/actions/upload-bundles
|
||||||
with:
|
with:
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|||||||
7
.github/workflows/build-windows.yml
vendored
7
.github/workflows/build-windows.yml
vendored
@@ -54,6 +54,10 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# These are needed to make the MSYS2 bash work properly
|
# These are needed to make the MSYS2 bash work properly
|
||||||
@@ -139,6 +143,7 @@ jobs:
|
|||||||
# Set PATH to "", so just GITHUB_PATH is included
|
# Set PATH to "", so just GITHUB_PATH is included
|
||||||
PATH: ''
|
PATH: ''
|
||||||
shell: env /usr/bin/bash --login -eo pipefail {0}
|
shell: env /usr/bin/bash --login -eo pipefail {0}
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Build'
|
- name: 'Build'
|
||||||
id: build
|
id: build
|
||||||
@@ -147,9 +152,11 @@ jobs:
|
|||||||
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
make-target: '${{ inputs.make-target }} ${{ inputs.make-arguments }}'
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Upload bundles'
|
- name: 'Upload bundles'
|
||||||
uses: ./.github/actions/upload-bundles
|
uses: ./.github/actions/upload-bundles
|
||||||
with:
|
with:
|
||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: '${{ matrix.suffix }}'
|
debug-suffix: '${{ matrix.suffix }}'
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|||||||
62
.github/workflows/main.yml
vendored
62
.github/workflows/main.yml
vendored
@@ -28,9 +28,7 @@ name: 'OpenJDK GHA Sanity Checks'
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches-ignore:
|
||||||
- master
|
|
||||||
- pr/*
|
- pr/*
|
||||||
- jdk*
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
platforms:
|
platforms:
|
||||||
@@ -43,6 +41,9 @@ on:
|
|||||||
make-arguments:
|
make-arguments:
|
||||||
description: 'Additional make arguments'
|
description: 'Additional make arguments'
|
||||||
required: false
|
required: false
|
||||||
|
dry-run:
|
||||||
|
description: 'Dry run: skip actual builds and tests'
|
||||||
|
required: false
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@@ -70,6 +71,7 @@ jobs:
|
|||||||
windows-x64: ${{ steps.include.outputs.windows-x64 }}
|
windows-x64: ${{ steps.include.outputs.windows-x64 }}
|
||||||
windows-aarch64: ${{ steps.include.outputs.windows-aarch64 }}
|
windows-aarch64: ${{ steps.include.outputs.windows-aarch64 }}
|
||||||
docs: ${{ steps.include.outputs.docs }}
|
docs: ${{ steps.include.outputs.docs }}
|
||||||
|
dry-run: ${{ steps.include.outputs.dry-run }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout the scripts'
|
- name: 'Checkout the scripts'
|
||||||
@@ -143,6 +145,35 @@ jobs:
|
|||||||
echo 'false'
|
echo 'false'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function check_dry_run() {
|
||||||
|
if [[ $GITHUB_EVENT_NAME == workflow_dispatch ]]; then
|
||||||
|
# Take the user-specified one.
|
||||||
|
echo '${{ github.event.inputs.dry-run }}'
|
||||||
|
return
|
||||||
|
elif [[ $GITHUB_EVENT_NAME == push ]]; then
|
||||||
|
# Cut out the real branch name
|
||||||
|
BRANCH=${GITHUB_REF##*/}
|
||||||
|
|
||||||
|
# Dry run rebuilds the caches in current branch, so they can be reused
|
||||||
|
# for any child PR branches. Because of this, we want to trigger this
|
||||||
|
# workflow in master branch, so that actual PR branches can use the cache.
|
||||||
|
# This workflow would trigger every time contributors sync their master
|
||||||
|
# branches in their personal forks.
|
||||||
|
if [[ $BRANCH == "master" ]]; then
|
||||||
|
echo 'true'
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ...same for stabilization branches
|
||||||
|
if [[ $BRANCH =~ "jdk(.*)" ]]; then
|
||||||
|
echo 'true'
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 'false'
|
||||||
|
}
|
||||||
|
|
||||||
echo "linux-x64=$(check_platform linux-x64 linux x64)" >> $GITHUB_OUTPUT
|
echo "linux-x64=$(check_platform linux-x64 linux x64)" >> $GITHUB_OUTPUT
|
||||||
echo "linux-x64-variants=$(check_platform linux-x64-variants variants)" >> $GITHUB_OUTPUT
|
echo "linux-x64-variants=$(check_platform linux-x64-variants variants)" >> $GITHUB_OUTPUT
|
||||||
echo "linux-cross-compile=$(check_platform linux-cross-compile cross-compile)" >> $GITHUB_OUTPUT
|
echo "linux-cross-compile=$(check_platform linux-cross-compile cross-compile)" >> $GITHUB_OUTPUT
|
||||||
@@ -152,6 +183,7 @@ jobs:
|
|||||||
echo "windows-x64=$(check_platform windows-x64 windows x64)" >> $GITHUB_OUTPUT
|
echo "windows-x64=$(check_platform windows-x64 windows x64)" >> $GITHUB_OUTPUT
|
||||||
echo "windows-aarch64=$(check_platform windows-aarch64 windows aarch64)" >> $GITHUB_OUTPUT
|
echo "windows-aarch64=$(check_platform windows-aarch64 windows aarch64)" >> $GITHUB_OUTPUT
|
||||||
echo "docs=$(check_platform docs)" >> $GITHUB_OUTPUT
|
echo "docs=$(check_platform docs)" >> $GITHUB_OUTPUT
|
||||||
|
echo "dry-run=$(check_dry_run)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
###
|
###
|
||||||
### Build jobs
|
### Build jobs
|
||||||
@@ -166,6 +198,7 @@ jobs:
|
|||||||
gcc-major-version: '10'
|
gcc-major-version: '10'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-x64 == 'true'
|
if: needs.prepare.outputs.linux-x64 == 'true'
|
||||||
|
|
||||||
build-linux-x64-hs-nopch:
|
build-linux-x64-hs-nopch:
|
||||||
@@ -180,6 +213,7 @@ jobs:
|
|||||||
extra-conf-options: '--disable-precompiled-headers'
|
extra-conf-options: '--disable-precompiled-headers'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
||||||
|
|
||||||
build-linux-x64-hs-zero:
|
build-linux-x64-hs-zero:
|
||||||
@@ -194,6 +228,7 @@ jobs:
|
|||||||
extra-conf-options: '--with-jvm-variants=zero --disable-precompiled-headers'
|
extra-conf-options: '--with-jvm-variants=zero --disable-precompiled-headers'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
||||||
|
|
||||||
build-linux-x64-hs-minimal:
|
build-linux-x64-hs-minimal:
|
||||||
@@ -208,6 +243,7 @@ jobs:
|
|||||||
extra-conf-options: '--with-jvm-variants=minimal --disable-precompiled-headers'
|
extra-conf-options: '--with-jvm-variants=minimal --disable-precompiled-headers'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
||||||
|
|
||||||
build-linux-x64-hs-optimized:
|
build-linux-x64-hs-optimized:
|
||||||
@@ -223,6 +259,7 @@ jobs:
|
|||||||
extra-conf-options: '--with-debug-level=optimized --disable-precompiled-headers'
|
extra-conf-options: '--with-debug-level=optimized --disable-precompiled-headers'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
if: needs.prepare.outputs.linux-x64-variants == 'true'
|
||||||
|
|
||||||
build-linux-x64-static:
|
build-linux-x64-static:
|
||||||
@@ -238,6 +275,7 @@ jobs:
|
|||||||
gcc-major-version: '10'
|
gcc-major-version: '10'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
static-suffix: "-static"
|
static-suffix: "-static"
|
||||||
if: needs.prepare.outputs.linux-x64 == 'true'
|
if: needs.prepare.outputs.linux-x64 == 'true'
|
||||||
|
|
||||||
@@ -254,6 +292,7 @@ jobs:
|
|||||||
gcc-major-version: '10'
|
gcc-major-version: '10'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
# Upload static libs bundles separately to avoid interference with normal linux-x64 bundle.
|
# Upload static libs bundles separately to avoid interference with normal linux-x64 bundle.
|
||||||
# This bundle is not used by testing jobs, but downstreams use it to check that
|
# This bundle is not used by testing jobs, but downstreams use it to check that
|
||||||
# dependent projects, e.g. libgraal, builds fine.
|
# dependent projects, e.g. libgraal, builds fine.
|
||||||
@@ -268,6 +307,7 @@ jobs:
|
|||||||
gcc-major-version: '10'
|
gcc-major-version: '10'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.linux-cross-compile == 'true'
|
if: needs.prepare.outputs.linux-cross-compile == 'true'
|
||||||
|
|
||||||
build-alpine-linux-x64:
|
build-alpine-linux-x64:
|
||||||
@@ -278,6 +318,7 @@ jobs:
|
|||||||
platform: alpine-linux-x64
|
platform: alpine-linux-x64
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.alpine-linux-x64 == 'true'
|
if: needs.prepare.outputs.alpine-linux-x64 == 'true'
|
||||||
|
|
||||||
build-macos-x64:
|
build-macos-x64:
|
||||||
@@ -290,6 +331,7 @@ jobs:
|
|||||||
xcode-toolset-version: '14.3.1'
|
xcode-toolset-version: '14.3.1'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.macos-x64 == 'true'
|
if: needs.prepare.outputs.macos-x64 == 'true'
|
||||||
|
|
||||||
build-macos-aarch64:
|
build-macos-aarch64:
|
||||||
@@ -302,6 +344,7 @@ jobs:
|
|||||||
xcode-toolset-version: '15.4'
|
xcode-toolset-version: '15.4'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.macos-aarch64 == 'true'
|
if: needs.prepare.outputs.macos-aarch64 == 'true'
|
||||||
|
|
||||||
build-windows-x64:
|
build-windows-x64:
|
||||||
@@ -310,10 +353,11 @@ jobs:
|
|||||||
uses: ./.github/workflows/build-windows.yml
|
uses: ./.github/workflows/build-windows.yml
|
||||||
with:
|
with:
|
||||||
platform: windows-x64
|
platform: windows-x64
|
||||||
msvc-toolset-version: '14.43'
|
msvc-toolset-version: '14.44'
|
||||||
msvc-toolset-architecture: 'x86.x64'
|
msvc-toolset-architecture: 'x86.x64'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.windows-x64 == 'true'
|
if: needs.prepare.outputs.windows-x64 == 'true'
|
||||||
|
|
||||||
build-windows-aarch64:
|
build-windows-aarch64:
|
||||||
@@ -322,12 +366,13 @@ jobs:
|
|||||||
uses: ./.github/workflows/build-windows.yml
|
uses: ./.github/workflows/build-windows.yml
|
||||||
with:
|
with:
|
||||||
platform: windows-aarch64
|
platform: windows-aarch64
|
||||||
msvc-toolset-version: '14.43'
|
msvc-toolset-version: '14.44'
|
||||||
msvc-toolset-architecture: 'arm64'
|
msvc-toolset-architecture: 'arm64'
|
||||||
make-target: 'hotspot'
|
make-target: 'hotspot'
|
||||||
extra-conf-options: '--openjdk-target=aarch64-unknown-cygwin'
|
extra-conf-options: '--openjdk-target=aarch64-unknown-cygwin'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.windows-aarch64 == 'true'
|
if: needs.prepare.outputs.windows-aarch64 == 'true'
|
||||||
|
|
||||||
build-docs:
|
build-docs:
|
||||||
@@ -344,6 +389,7 @@ jobs:
|
|||||||
gcc-major-version: '10'
|
gcc-major-version: '10'
|
||||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
if: needs.prepare.outputs.docs == 'true'
|
if: needs.prepare.outputs.docs == 'true'
|
||||||
|
|
||||||
###
|
###
|
||||||
@@ -353,17 +399,20 @@ jobs:
|
|||||||
test-linux-x64:
|
test-linux-x64:
|
||||||
name: linux-x64
|
name: linux-x64
|
||||||
needs:
|
needs:
|
||||||
|
- prepare
|
||||||
- build-linux-x64
|
- build-linux-x64
|
||||||
uses: ./.github/workflows/test.yml
|
uses: ./.github/workflows/test.yml
|
||||||
with:
|
with:
|
||||||
platform: linux-x64
|
platform: linux-x64
|
||||||
bootjdk-platform: linux-x64
|
bootjdk-platform: linux-x64
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
debug-suffix: -debug
|
debug-suffix: -debug
|
||||||
|
|
||||||
test-linux-x64-static:
|
test-linux-x64-static:
|
||||||
name: linux-x64-static
|
name: linux-x64-static
|
||||||
needs:
|
needs:
|
||||||
|
- prepare
|
||||||
- build-linux-x64
|
- build-linux-x64
|
||||||
- build-linux-x64-static
|
- build-linux-x64-static
|
||||||
uses: ./.github/workflows/test.yml
|
uses: ./.github/workflows/test.yml
|
||||||
@@ -371,27 +420,32 @@ jobs:
|
|||||||
platform: linux-x64
|
platform: linux-x64
|
||||||
bootjdk-platform: linux-x64
|
bootjdk-platform: linux-x64
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
static-suffix: "-static"
|
static-suffix: "-static"
|
||||||
|
|
||||||
test-macos-aarch64:
|
test-macos-aarch64:
|
||||||
name: macos-aarch64
|
name: macos-aarch64
|
||||||
needs:
|
needs:
|
||||||
|
- prepare
|
||||||
- build-macos-aarch64
|
- build-macos-aarch64
|
||||||
uses: ./.github/workflows/test.yml
|
uses: ./.github/workflows/test.yml
|
||||||
with:
|
with:
|
||||||
platform: macos-aarch64
|
platform: macos-aarch64
|
||||||
bootjdk-platform: macos-aarch64
|
bootjdk-platform: macos-aarch64
|
||||||
runs-on: macos-14
|
runs-on: macos-14
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
xcode-toolset-version: '15.4'
|
xcode-toolset-version: '15.4'
|
||||||
debug-suffix: -debug
|
debug-suffix: -debug
|
||||||
|
|
||||||
test-windows-x64:
|
test-windows-x64:
|
||||||
name: windows-x64
|
name: windows-x64
|
||||||
needs:
|
needs:
|
||||||
|
- prepare
|
||||||
- build-windows-x64
|
- build-windows-x64
|
||||||
uses: ./.github/workflows/test.yml
|
uses: ./.github/workflows/test.yml
|
||||||
with:
|
with:
|
||||||
platform: windows-x64
|
platform: windows-x64
|
||||||
bootjdk-platform: windows-x64
|
bootjdk-platform: windows-x64
|
||||||
runs-on: windows-2025
|
runs-on: windows-2025
|
||||||
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
debug-suffix: -debug
|
debug-suffix: -debug
|
||||||
|
|||||||
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@@ -40,6 +40,10 @@ on:
|
|||||||
xcode-toolset-version:
|
xcode-toolset-version:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
dry-run:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
debug-suffix:
|
debug-suffix:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
@@ -147,6 +151,7 @@ jobs:
|
|||||||
platform: ${{ inputs.platform }}
|
platform: ${{ inputs.platform }}
|
||||||
debug-suffix: ${{ matrix.debug-suffix }}
|
debug-suffix: ${{ matrix.debug-suffix }}
|
||||||
static-suffix: ${{ inputs.static-suffix }}
|
static-suffix: ${{ inputs.static-suffix }}
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
- name: 'Install dependencies'
|
- name: 'Install dependencies'
|
||||||
run: |
|
run: |
|
||||||
@@ -199,6 +204,7 @@ jobs:
|
|||||||
&& bash ./.github/scripts/gen-test-summary.sh "$GITHUB_STEP_SUMMARY" "$GITHUB_OUTPUT"
|
&& bash ./.github/scripts/gen-test-summary.sh "$GITHUB_STEP_SUMMARY" "$GITHUB_OUTPUT"
|
||||||
env:
|
env:
|
||||||
PATH: ${{ steps.path.outputs.value }}
|
PATH: ${{ steps.path.outputs.value }}
|
||||||
|
if: ${{ inputs.dry-run == false }}
|
||||||
|
|
||||||
# This is a separate step, since if the markdown from a step gets bigger than
|
# This is a separate step, since if the markdown from a step gets bigger than
|
||||||
# 1024 kB it is skipped, but then the short summary above is still generated
|
# 1024 kB it is skipped, but then the short summary above is still generated
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[general]
|
[general]
|
||||||
project=jdk
|
project=jdk
|
||||||
jbs=JDK
|
jbs=JDK
|
||||||
version=25
|
version=26
|
||||||
|
|
||||||
[checks]
|
[checks]
|
||||||
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists,copyright
|
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists,copyright
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ if [ -d "$TOPLEVEL_DIR/.hg" ] ; then
|
|||||||
VCS_TYPE="hg4idea"
|
VCS_TYPE="hg4idea"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$TOPLEVEL_DIR/.git" ] ; then
|
# Git worktrees use a '.git' file rather than directory, so test both.
|
||||||
|
if [ -d "$TOPLEVEL_DIR/.git" -o -f "$TOPLEVEL_DIR/.git" ] ; then
|
||||||
VCS_TYPE="Git"
|
VCS_TYPE="Git"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -78,7 +78,6 @@ src/jdk.jdi : jdk/src/jdk.jdi
|
|||||||
src/jdk.jdwp.agent : jdk/src/jdk.jdwp.agent
|
src/jdk.jdwp.agent : jdk/src/jdk.jdwp.agent
|
||||||
src/jdk.jlink : jdk/src/jdk.jlink
|
src/jdk.jlink : jdk/src/jdk.jlink
|
||||||
src/jdk.jshell : langtools/src/jdk.jshell
|
src/jdk.jshell : langtools/src/jdk.jshell
|
||||||
src/jdk.jsobject : jdk/src/jdk.jsobject
|
|
||||||
src/jdk.jstatd : jdk/src/jdk.jstatd
|
src/jdk.jstatd : jdk/src/jdk.jstatd
|
||||||
src/jdk.localedata : jdk/src/jdk.localedata
|
src/jdk.localedata : jdk/src/jdk.localedata
|
||||||
src/jdk.management : jdk/src/jdk.management
|
src/jdk.management : jdk/src/jdk.management
|
||||||
|
|||||||
@@ -1451,10 +1451,10 @@ of a cross-compiling toolchain and a sysroot environment which can
|
|||||||
easily be used together with the <code>--with-devkit</code> configure
|
easily be used together with the <code>--with-devkit</code> configure
|
||||||
option to cross compile the JDK. On Linux/x86_64, the following
|
option to cross compile the JDK. On Linux/x86_64, the following
|
||||||
command:</p>
|
command:</p>
|
||||||
<pre><code>bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64-linux-gnu && make</code></pre>
|
<pre><code>bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64le-linux-gnu && make</code></pre>
|
||||||
<p>will configure and build the JDK for Linux/ppc64 assuming that
|
<p>will configure and build the JDK for Linux/ppc64le assuming that
|
||||||
<code><devkit-path></code> points to a Linux/x86_64 to Linux/ppc64
|
<code><devkit-path></code> points to a Linux/x86_64 to
|
||||||
devkit.</p>
|
Linux/ppc64le devkit.</p>
|
||||||
<p>Devkits can be created from the <code>make/devkit</code> directory by
|
<p>Devkits can be created from the <code>make/devkit</code> directory by
|
||||||
executing:</p>
|
executing:</p>
|
||||||
<pre><code>make [ TARGETS="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ]</code></pre>
|
<pre><code>make [ TARGETS="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ]</code></pre>
|
||||||
@@ -1481,22 +1481,22 @@ following targets are known to work:</p>
|
|||||||
<td>arm-linux-gnueabihf</td>
|
<td>arm-linux-gnueabihf</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td>ppc64-linux-gnu</td>
|
<td>ppc64le-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="odd">
|
<tr class="odd">
|
||||||
<td>ppc64le-linux-gnu</td>
|
<td>riscv64-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td>s390x-linux-gnu</td>
|
<td>s390x-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><code>BASE_OS</code> must be one of "OEL6" for Oracle Enterprise
|
<p><code>BASE_OS</code> must be one of <code>OL</code> for Oracle
|
||||||
Linux 6 or "Fedora" (if not specified "OEL6" will be the default). If
|
Enterprise Linux or <code>Fedora</code>. If the base OS is
|
||||||
the base OS is "Fedora" the corresponding Fedora release can be
|
<code>Fedora</code> the corresponding Fedora release can be specified
|
||||||
specified with the help of the <code>BASE_OS_VERSION</code> option (with
|
with the help of the <code>BASE_OS_VERSION</code> option. If the build
|
||||||
"27" as default version). If the build is successful, the new devkits
|
is successful, the new devkits can be found in the
|
||||||
can be found in the <code>build/devkit/result</code> subdirectory:</p>
|
<code>build/devkit/result</code> subdirectory:</p>
|
||||||
<pre><code>cd make/devkit
|
<pre><code>cd make/devkit
|
||||||
make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21
|
make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21
|
||||||
ls -1 ../../build/devkit/result/
|
ls -1 ../../build/devkit/result/
|
||||||
|
|||||||
@@ -1258,11 +1258,11 @@ toolchain and a sysroot environment which can easily be used together with the
|
|||||||
following command:
|
following command:
|
||||||
|
|
||||||
```
|
```
|
||||||
bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64-linux-gnu && make
|
bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64le-linux-gnu && make
|
||||||
```
|
```
|
||||||
|
|
||||||
will configure and build the JDK for Linux/ppc64 assuming that `<devkit-path>`
|
will configure and build the JDK for Linux/ppc64le assuming that `<devkit-path>`
|
||||||
points to a Linux/x86_64 to Linux/ppc64 devkit.
|
points to a Linux/x86_64 to Linux/ppc64le devkit.
|
||||||
|
|
||||||
Devkits can be created from the `make/devkit` directory by executing:
|
Devkits can be created from the `make/devkit` directory by executing:
|
||||||
|
|
||||||
@@ -1281,16 +1281,14 @@ at least the following targets are known to work:
|
|||||||
| x86_64-linux-gnu |
|
| x86_64-linux-gnu |
|
||||||
| aarch64-linux-gnu |
|
| aarch64-linux-gnu |
|
||||||
| arm-linux-gnueabihf |
|
| arm-linux-gnueabihf |
|
||||||
| ppc64-linux-gnu |
|
|
||||||
| ppc64le-linux-gnu |
|
| ppc64le-linux-gnu |
|
||||||
|
| riscv64-linux-gnu |
|
||||||
| s390x-linux-gnu |
|
| s390x-linux-gnu |
|
||||||
|
|
||||||
`BASE_OS` must be one of "OEL6" for Oracle Enterprise Linux 6 or "Fedora" (if
|
`BASE_OS` must be one of `OL` for Oracle Enterprise Linux or `Fedora`. If the
|
||||||
not specified "OEL6" will be the default). If the base OS is "Fedora" the
|
base OS is `Fedora` the corresponding Fedora release can be specified with the
|
||||||
corresponding Fedora release can be specified with the help of the
|
help of the `BASE_OS_VERSION` option. If the build is successful, the new
|
||||||
`BASE_OS_VERSION` option (with "27" as default version). If the build is
|
devkits can be found in the `build/devkit/result` subdirectory:
|
||||||
successful, the new devkits can be found in the `build/devkit/result`
|
|
||||||
subdirectory:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
cd make/devkit
|
cd make/devkit
|
||||||
|
|||||||
@@ -77,6 +77,9 @@ SFINAE</a></li>
|
|||||||
<li><a href="#thread_local" id="toc-thread_local">thread_local</a></li>
|
<li><a href="#thread_local" id="toc-thread_local">thread_local</a></li>
|
||||||
<li><a href="#nullptr" id="toc-nullptr">nullptr</a></li>
|
<li><a href="#nullptr" id="toc-nullptr">nullptr</a></li>
|
||||||
<li><a href="#atomic" id="toc-atomic"><atomic></a></li>
|
<li><a href="#atomic" id="toc-atomic"><atomic></a></li>
|
||||||
|
<li><a href="#initializing-variables-with-static-storage-duration"
|
||||||
|
id="toc-initializing-variables-with-static-storage-duration">Initializing
|
||||||
|
variables with static storage duration</a></li>
|
||||||
<li><a href="#uniform-initialization"
|
<li><a href="#uniform-initialization"
|
||||||
id="toc-uniform-initialization">Uniform Initialization</a></li>
|
id="toc-uniform-initialization">Uniform Initialization</a></li>
|
||||||
<li><a href="#local-function-objects"
|
<li><a href="#local-function-objects"
|
||||||
@@ -84,6 +87,7 @@ id="toc-local-function-objects">Local Function Objects</a></li>
|
|||||||
<li><a href="#inheriting-constructors"
|
<li><a href="#inheriting-constructors"
|
||||||
id="toc-inheriting-constructors">Inheriting constructors</a></li>
|
id="toc-inheriting-constructors">Inheriting constructors</a></li>
|
||||||
<li><a href="#attributes" id="toc-attributes">Attributes</a></li>
|
<li><a href="#attributes" id="toc-attributes">Attributes</a></li>
|
||||||
|
<li><a href="#noexcept" id="toc-noexcept">noexcept</a></li>
|
||||||
<li><a href="#additional-permitted-features"
|
<li><a href="#additional-permitted-features"
|
||||||
id="toc-additional-permitted-features">Additional Permitted
|
id="toc-additional-permitted-features">Additional Permitted
|
||||||
Features</a></li>
|
Features</a></li>
|
||||||
@@ -791,6 +795,33 @@ differ from what the Java compilers implement.</p>
|
|||||||
"conservative" memory ordering, which may differ from (may be stronger
|
"conservative" memory ordering, which may differ from (may be stronger
|
||||||
than) sequentially consistent. There are algorithms in HotSpot that are
|
than) sequentially consistent. There are algorithms in HotSpot that are
|
||||||
believed to rely on that ordering.</p>
|
believed to rely on that ordering.</p>
|
||||||
|
<h3
|
||||||
|
id="initializing-variables-with-static-storage-duration">Initializing
|
||||||
|
variables with static storage duration</h3>
|
||||||
|
<p>Variables with static storage duration and <em>dynamic
|
||||||
|
initialization</em> <a
|
||||||
|
href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf">C++14
|
||||||
|
3.6.2</a>). should be avoided, unless an implementation is permitted to
|
||||||
|
perform the initialization as a static initialization. The order in
|
||||||
|
which dynamic initializations occur is incompletely specified.
|
||||||
|
Initialization order problems can be difficult to deal with and lead to
|
||||||
|
surprises.</p>
|
||||||
|
<p>Variables with static storage duration and non-trivial destructors
|
||||||
|
should be avoided. HotSpot doesn't generally try to cleanup on exit, and
|
||||||
|
running destructors at exit can lead to problems.</p>
|
||||||
|
<p>Some of the approaches used in HotSpot to avoid dynamic
|
||||||
|
initialization include:</p>
|
||||||
|
<ul>
|
||||||
|
<li><p>Use the <code>Deferred<T></code> class template. Add a call
|
||||||
|
to its initialization function at an appropriate place during VM
|
||||||
|
initialization. The underlying object is never destroyed.</p></li>
|
||||||
|
<li><p>For objects of class type, use a variable whose value is a
|
||||||
|
pointer to the class, initialized to <code>nullptr</code>. Provide an
|
||||||
|
initialization function that sets the variable to a dynamically
|
||||||
|
allocated object. Add a call to that function at an appropriate place
|
||||||
|
during VM initialization. Such objects are usually never
|
||||||
|
destroyed.</p></li>
|
||||||
|
</ul>
|
||||||
<h3 id="uniform-initialization">Uniform Initialization</h3>
|
<h3 id="uniform-initialization">Uniform Initialization</h3>
|
||||||
<p>The use of <em>uniform initialization</em> (<a
|
<p>The use of <em>uniform initialization</em> (<a
|
||||||
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">n2672</a>),
|
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">n2672</a>),
|
||||||
@@ -1110,6 +1141,58 @@ function name and the parameter list.</li>
|
|||||||
<code>memory_order_consume</code>.</li>
|
<code>memory_order_consume</code>.</li>
|
||||||
<li><code>[[deprecated]]</code> - Not relevant in HotSpot code.</li>
|
<li><code>[[deprecated]]</code> - Not relevant in HotSpot code.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<h3 id="noexcept">noexcept</h3>
|
||||||
|
<p>Use of <code>noexcept</code> exception specifications (<a
|
||||||
|
href="http://wg21.link/n3050">n3050</a>) are permitted with restrictions
|
||||||
|
described below.</p>
|
||||||
|
<ul>
|
||||||
|
<li>Only the argument-less form of <code>noexcept</code> exception
|
||||||
|
specifications are permitted.</li>
|
||||||
|
<li>Allocation functions that may return <code>nullptr</code> to
|
||||||
|
indicate allocation failure must be declared <code>noexcept</code>.</li>
|
||||||
|
<li>All other uses of <code>noexcept</code> exception specifications are
|
||||||
|
forbidden.</li>
|
||||||
|
<li><code>noexcept</code> expressions are forbidden.</li>
|
||||||
|
<li>Dynamic exception specifications are forbidden.</li>
|
||||||
|
</ul>
|
||||||
|
<p>HotSpot is built with exceptions disabled, e.g. compile with
|
||||||
|
<code>-fno-exceptions</code> (gcc, clang) or no <code>/EH</code> option
|
||||||
|
(MSVC++). So why do we need to consider <code>noexcept</code> at all?
|
||||||
|
It's because <code>noexcept</code> exception specifications serve two
|
||||||
|
distinct purposes.</p>
|
||||||
|
<p>The first is to allow the compiler to avoid generating code or data
|
||||||
|
in support of exceptions being thrown by a function. But this is
|
||||||
|
unnecessary, because exceptions are disabled.</p>
|
||||||
|
<p>The second is to allow the compiler and library code to choose
|
||||||
|
different algorithms, depending on whether some function may throw
|
||||||
|
exceptions. This is only relevant to a certain set of functions.</p>
|
||||||
|
<ul>
|
||||||
|
<li><p>Some allocation functions (<code>operator new</code> and
|
||||||
|
<code>operator new[]</code>) return <code>nullptr</code> to indicate
|
||||||
|
allocation failure. If a <code>new</code> expression calls such an
|
||||||
|
allocation function, it must check for and handle that possibility.
|
||||||
|
Declaring such a function <code>noexcept</code> informs the compiler
|
||||||
|
that <code>nullptr</code> is a possible result. If an allocation
|
||||||
|
function is not declared <code>noexcept</code> then the compiler may
|
||||||
|
elide that checking and handling for a <code>new</code> expression
|
||||||
|
calling that function.</p></li>
|
||||||
|
<li><p>Certain Standard Library facilities (notably containers) provide
|
||||||
|
different guarantees for some operations (and may choose different
|
||||||
|
algorithms to implement those operations), depending on whether certain
|
||||||
|
functions (constructors, copy/move operations, swap) are nothrow or not.
|
||||||
|
They detect this using type traits that test whether a function is
|
||||||
|
declared <code>noexcept</code>. This can have a significant performance
|
||||||
|
impact if, for example, copying is chosen over a potentially throwing
|
||||||
|
move. But this isn't relevant, since HotSpot forbids the use of most
|
||||||
|
Standard Library facilities.</p></li>
|
||||||
|
</ul>
|
||||||
|
<p>HotSpot code can assume no exceptions will ever be thrown, even from
|
||||||
|
functions not declared <code>noexcept</code>. So HotSpot code doesn't
|
||||||
|
ever need to check, either with conditional exception specifications or
|
||||||
|
with <code>noexcept</code> expressions.</p>
|
||||||
|
<p>Dynamic exception specifications were deprecated in C++11. C++17
|
||||||
|
removed all but <code>throw()</code>, with that remaining a deprecated
|
||||||
|
equivalent to <code>noexcept</code>.</p>
|
||||||
<h3 id="additional-permitted-features">Additional Permitted
|
<h3 id="additional-permitted-features">Additional Permitted
|
||||||
Features</h3>
|
Features</h3>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -1198,12 +1281,6 @@ Library names.</p></li>
|
|||||||
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html">n2179</a>)
|
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html">n2179</a>)
|
||||||
— HotSpot does not permit the use of exceptions, so this feature isn't
|
— HotSpot does not permit the use of exceptions, so this feature isn't
|
||||||
useful.</p></li>
|
useful.</p></li>
|
||||||
<li><p>Avoid non-local variables with non-constexpr initialization. In
|
|
||||||
particular, avoid variables with types requiring non-trivial
|
|
||||||
initialization or destruction. Initialization order problems can be
|
|
||||||
difficult to deal with and lead to surprises, as can destruction
|
|
||||||
ordering. HotSpot doesn't generally try to cleanup on exit, and running
|
|
||||||
destructors at exit can also lead to problems.</p></li>
|
|
||||||
<li><p>Avoid most operator overloading, preferring named functions. When
|
<li><p>Avoid most operator overloading, preferring named functions. When
|
||||||
operator overloading is used, ensure the semantics conform to the normal
|
operator overloading is used, ensure the semantics conform to the normal
|
||||||
expected behavior of the operation.</p></li>
|
expected behavior of the operation.</p></li>
|
||||||
|
|||||||
@@ -770,6 +770,32 @@ ordering, which may differ from (may be stronger than) sequentially
|
|||||||
consistent. There are algorithms in HotSpot that are believed to rely
|
consistent. There are algorithms in HotSpot that are believed to rely
|
||||||
on that ordering.
|
on that ordering.
|
||||||
|
|
||||||
|
### Initializing variables with static storage duration
|
||||||
|
|
||||||
|
Variables with static storage duration and _dynamic initialization_
|
||||||
|
[C++14 3.6.2](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf)).
|
||||||
|
should be avoided, unless an implementation is permitted to perform the
|
||||||
|
initialization as a static initialization. The order in which dynamic
|
||||||
|
initializations occur is incompletely specified. Initialization order
|
||||||
|
problems can be difficult to deal with and lead to surprises.
|
||||||
|
|
||||||
|
Variables with static storage duration and non-trivial destructors should be
|
||||||
|
avoided. HotSpot doesn't generally try to cleanup on exit, and running
|
||||||
|
destructors at exit can lead to problems.
|
||||||
|
|
||||||
|
Some of the approaches used in HotSpot to avoid dynamic initialization
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Use the `Deferred<T>` class template. Add a call to its initialization
|
||||||
|
function at an appropriate place during VM initialization. The underlying
|
||||||
|
object is never destroyed.
|
||||||
|
|
||||||
|
* For objects of class type, use a variable whose value is a pointer to the
|
||||||
|
class, initialized to `nullptr`. Provide an initialization function that sets
|
||||||
|
the variable to a dynamically allocated object. Add a call to that function at
|
||||||
|
an appropriate place during VM initialization. Such objects are usually never
|
||||||
|
destroyed.
|
||||||
|
|
||||||
### Uniform Initialization
|
### Uniform Initialization
|
||||||
|
|
||||||
The use of _uniform initialization_
|
The use of _uniform initialization_
|
||||||
@@ -1104,6 +1130,57 @@ The following attributes are expressly forbidden:
|
|||||||
* `[[carries_dependency]]` - Related to `memory_order_consume`.
|
* `[[carries_dependency]]` - Related to `memory_order_consume`.
|
||||||
* `[[deprecated]]` - Not relevant in HotSpot code.
|
* `[[deprecated]]` - Not relevant in HotSpot code.
|
||||||
|
|
||||||
|
### noexcept
|
||||||
|
|
||||||
|
Use of `noexcept` exception specifications
|
||||||
|
([n3050](http://wg21.link/n3050))
|
||||||
|
are permitted with restrictions described below.
|
||||||
|
|
||||||
|
* Only the argument-less form of `noexcept` exception specifications are
|
||||||
|
permitted.
|
||||||
|
* Allocation functions that may return `nullptr` to indicate allocation
|
||||||
|
failure must be declared `noexcept`.
|
||||||
|
* All other uses of `noexcept` exception specifications are forbidden.
|
||||||
|
* `noexcept` expressions are forbidden.
|
||||||
|
* Dynamic exception specifications are forbidden.
|
||||||
|
|
||||||
|
HotSpot is built with exceptions disabled, e.g. compile with `-fno-exceptions`
|
||||||
|
(gcc, clang) or no `/EH` option (MSVC++). So why do we need to consider
|
||||||
|
`noexcept` at all? It's because `noexcept` exception specifications serve two
|
||||||
|
distinct purposes.
|
||||||
|
|
||||||
|
The first is to allow the compiler to avoid generating code or data in support
|
||||||
|
of exceptions being thrown by a function. But this is unnecessary, because
|
||||||
|
exceptions are disabled.
|
||||||
|
|
||||||
|
The second is to allow the compiler and library code to choose different
|
||||||
|
algorithms, depending on whether some function may throw exceptions. This is
|
||||||
|
only relevant to a certain set of functions.
|
||||||
|
|
||||||
|
* Some allocation functions (`operator new` and `operator new[]`) return
|
||||||
|
`nullptr` to indicate allocation failure. If a `new` expression calls such an
|
||||||
|
allocation function, it must check for and handle that possibility. Declaring
|
||||||
|
such a function `noexcept` informs the compiler that `nullptr` is a possible
|
||||||
|
result. If an allocation function is not declared `noexcept` then the compiler
|
||||||
|
may elide that checking and handling for a `new` expression calling that
|
||||||
|
function.
|
||||||
|
|
||||||
|
* Certain Standard Library facilities (notably containers) provide different
|
||||||
|
guarantees for some operations (and may choose different algorithms to
|
||||||
|
implement those operations), depending on whether certain functions
|
||||||
|
(constructors, copy/move operations, swap) are nothrow or not. They detect
|
||||||
|
this using type traits that test whether a function is declared `noexcept`.
|
||||||
|
This can have a significant performance impact if, for example, copying is
|
||||||
|
chosen over a potentially throwing move. But this isn't relevant, since
|
||||||
|
HotSpot forbids the use of most Standard Library facilities.
|
||||||
|
|
||||||
|
HotSpot code can assume no exceptions will ever be thrown, even from functions
|
||||||
|
not declared `noexcept`. So HotSpot code doesn't ever need to check, either
|
||||||
|
with conditional exception specifications or with `noexcept` expressions.
|
||||||
|
|
||||||
|
Dynamic exception specifications were deprecated in C++11. C++17 removed all
|
||||||
|
but `throw()`, with that remaining a deprecated equivalent to `noexcept`.
|
||||||
|
|
||||||
### Additional Permitted Features
|
### Additional Permitted Features
|
||||||
|
|
||||||
* `alignof`
|
* `alignof`
|
||||||
@@ -1199,13 +1276,6 @@ namespace std;` to avoid needing to qualify Standard Library names.
|
|||||||
([n2179](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html)) —
|
([n2179](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html)) —
|
||||||
HotSpot does not permit the use of exceptions, so this feature isn't useful.
|
HotSpot does not permit the use of exceptions, so this feature isn't useful.
|
||||||
|
|
||||||
* Avoid non-local variables with non-constexpr initialization.
|
|
||||||
In particular, avoid variables with types requiring non-trivial
|
|
||||||
initialization or destruction. Initialization order problems can be
|
|
||||||
difficult to deal with and lead to surprises, as can destruction
|
|
||||||
ordering. HotSpot doesn't generally try to cleanup on exit, and
|
|
||||||
running destructors at exit can also lead to problems.
|
|
||||||
|
|
||||||
* Avoid most operator overloading, preferring named functions. When
|
* Avoid most operator overloading, preferring named functions. When
|
||||||
operator overloading is used, ensure the semantics conform to the
|
operator overloading is used, ensure the semantics conform to the
|
||||||
normal expected behavior of the operation.
|
normal expected behavior of the operation.
|
||||||
|
|||||||
@@ -11,11 +11,8 @@
|
|||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
ul.task-list{list-style: none;}
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
ul.task-list li input[type="checkbox"] {
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
width: 0.8em;
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
margin: 0 0.8em 0.2em -1.6em;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|||||||
@@ -72,11 +72,9 @@ id="toc-notes-for-specific-tests">Notes for Specific Tests</a>
|
|||||||
<li><a href="#non-us-locale" id="toc-non-us-locale">Non-US
|
<li><a href="#non-us-locale" id="toc-non-us-locale">Non-US
|
||||||
locale</a></li>
|
locale</a></li>
|
||||||
<li><a href="#pkcs11-tests" id="toc-pkcs11-tests">PKCS11 Tests</a></li>
|
<li><a href="#pkcs11-tests" id="toc-pkcs11-tests">PKCS11 Tests</a></li>
|
||||||
</ul></li>
|
|
||||||
<li><a href="#testing-ahead-of-time-optimizations"
|
<li><a href="#testing-ahead-of-time-optimizations"
|
||||||
id="toc-testing-ahead-of-time-optimizations">### Testing Ahead-of-time
|
id="toc-testing-ahead-of-time-optimizations">Testing Ahead-of-time
|
||||||
Optimizations</a>
|
Optimizations</a></li>
|
||||||
<ul>
|
|
||||||
<li><a href="#testing-with-alternative-security-providers"
|
<li><a href="#testing-with-alternative-security-providers"
|
||||||
id="toc-testing-with-alternative-security-providers">Testing with
|
id="toc-testing-with-alternative-security-providers">Testing with
|
||||||
alternative security providers</a></li>
|
alternative security providers</a></li>
|
||||||
@@ -435,6 +433,9 @@ the diff between the specified revision and the repository tip.</p>
|
|||||||
<p>The report is stored in
|
<p>The report is stored in
|
||||||
<code>build/$BUILD/test-results/jcov-output/diff_coverage_report</code>
|
<code>build/$BUILD/test-results/jcov-output/diff_coverage_report</code>
|
||||||
file.</p>
|
file.</p>
|
||||||
|
<h4 id="aot_jdk">AOT_JDK</h4>
|
||||||
|
<p>See <a href="#testing-ahead-of-time-optimizations">Testing
|
||||||
|
Ahead-of-time optimizations</a>.</p>
|
||||||
<h3 id="jtreg-keywords">JTReg keywords</h3>
|
<h3 id="jtreg-keywords">JTReg keywords</h3>
|
||||||
<h4 id="jobs-1">JOBS</h4>
|
<h4 id="jobs-1">JOBS</h4>
|
||||||
<p>The test concurrency (<code>-concurrency</code>).</p>
|
<p>The test concurrency (<code>-concurrency</code>).</p>
|
||||||
@@ -457,6 +458,12 @@ class, named Virtual, is currently part of the JDK build in the
|
|||||||
<code>test/jtreg_test_thread_factory/</code> directory. This class gets
|
<code>test/jtreg_test_thread_factory/</code> directory. This class gets
|
||||||
compiled during the test image build. The implementation of the Virtual
|
compiled during the test image build. The implementation of the Virtual
|
||||||
class creates a new virtual thread for executing each test class.</p>
|
class creates a new virtual thread for executing each test class.</p>
|
||||||
|
<h4 id="jvmti_stress_agent">JVMTI_STRESS_AGENT</h4>
|
||||||
|
<p>Executes JTReg tests with JVM TI stress agent. The stress agent is
|
||||||
|
the part of test library and located in
|
||||||
|
<code>test/lib/jdk/test/lib/jvmti/libJvmtiStressAgent.cpp</code>. The
|
||||||
|
value of this argument is set as JVM TI agent options. This mode uses
|
||||||
|
ProblemList-jvmti-stress-agent.txt as an additional exclude list.</p>
|
||||||
<h4 id="test_mode">TEST_MODE</h4>
|
<h4 id="test_mode">TEST_MODE</h4>
|
||||||
<p>The test mode (<code>agentvm</code> or <code>othervm</code>).</p>
|
<p>The test mode (<code>agentvm</code> or <code>othervm</code>).</p>
|
||||||
<p>Defaults to <code>agentvm</code>.</p>
|
<p>Defaults to <code>agentvm</code>.</p>
|
||||||
@@ -556,6 +563,12 @@ each fork. Same as specifying <code>-wi <num></code>.</p>
|
|||||||
same values as <code>-rff</code>, i.e., <code>text</code>,
|
same values as <code>-rff</code>, i.e., <code>text</code>,
|
||||||
<code>csv</code>, <code>scsv</code>, <code>json</code>, or
|
<code>csv</code>, <code>scsv</code>, <code>json</code>, or
|
||||||
<code>latex</code>.</p>
|
<code>latex</code>.</p>
|
||||||
|
<h4 id="test_jdk">TEST_JDK</h4>
|
||||||
|
<p>The path to the JDK that will be used to run the benchmarks.</p>
|
||||||
|
<p>Defaults to <code>build/<CONF-NAME>/jdk</code>.</p>
|
||||||
|
<h4 id="benchmarks_jar">BENCHMARKS_JAR</h4>
|
||||||
|
<p>The path to the JAR containing the benchmarks.</p>
|
||||||
|
<p>Defaults to <code>test/micro/benchmarks.jar</code>.</p>
|
||||||
<h4 id="vm_options-2">VM_OPTIONS</h4>
|
<h4 id="vm_options-2">VM_OPTIONS</h4>
|
||||||
<p>Additional VM arguments to provide to forked off VMs. Same as
|
<p>Additional VM arguments to provide to forked off VMs. Same as
|
||||||
<code>-jvmArgs <args></code></p>
|
<code>-jvmArgs <args></code></p>
|
||||||
@@ -601,8 +614,8 @@ element of the appropriate <code>@Artifact</code> class. (See
|
|||||||
JTREG="JAVA_OPTIONS=-Djdk.test.lib.artifacts.nsslib-linux_aarch64=/path/to/NSS-libs"</code></pre>
|
JTREG="JAVA_OPTIONS=-Djdk.test.lib.artifacts.nsslib-linux_aarch64=/path/to/NSS-libs"</code></pre>
|
||||||
<p>For more notes about the PKCS11 tests, please refer to
|
<p>For more notes about the PKCS11 tests, please refer to
|
||||||
test/jdk/sun/security/pkcs11/README.</p>
|
test/jdk/sun/security/pkcs11/README.</p>
|
||||||
<h2 id="testing-ahead-of-time-optimizations">### Testing Ahead-of-time
|
<h3 id="testing-ahead-of-time-optimizations">Testing Ahead-of-time
|
||||||
Optimizations</h2>
|
Optimizations</h3>
|
||||||
<p>One way to improve test coverage of ahead-of-time (AOT) optimizations
|
<p>One way to improve test coverage of ahead-of-time (AOT) optimizations
|
||||||
in the JDK is to run existing jtreg test cases in a special "AOT_JDK"
|
in the JDK is to run existing jtreg test cases in a special "AOT_JDK"
|
||||||
mode. Example:</p>
|
mode. Example:</p>
|
||||||
|
|||||||
@@ -367,6 +367,10 @@ between the specified revision and the repository tip.
|
|||||||
The report is stored in
|
The report is stored in
|
||||||
`build/$BUILD/test-results/jcov-output/diff_coverage_report` file.
|
`build/$BUILD/test-results/jcov-output/diff_coverage_report` file.
|
||||||
|
|
||||||
|
#### AOT_JDK
|
||||||
|
|
||||||
|
See [Testing Ahead-of-time optimizations](#testing-ahead-of-time-optimizations).
|
||||||
|
|
||||||
### JTReg keywords
|
### JTReg keywords
|
||||||
|
|
||||||
#### JOBS
|
#### JOBS
|
||||||
@@ -397,6 +401,13 @@ the `test/jtreg_test_thread_factory/` directory. This class gets compiled
|
|||||||
during the test image build. The implementation of the Virtual class creates a
|
during the test image build. The implementation of the Virtual class creates a
|
||||||
new virtual thread for executing each test class.
|
new virtual thread for executing each test class.
|
||||||
|
|
||||||
|
#### JVMTI_STRESS_AGENT
|
||||||
|
|
||||||
|
Executes JTReg tests with JVM TI stress agent. The stress agent is the part of
|
||||||
|
test library and located in `test/lib/jdk/test/lib/jvmti/libJvmtiStressAgent.cpp`.
|
||||||
|
The value of this argument is set as JVM TI agent options.
|
||||||
|
This mode uses ProblemList-jvmti-stress-agent.txt as an additional exclude list.
|
||||||
|
|
||||||
#### TEST_MODE
|
#### TEST_MODE
|
||||||
|
|
||||||
The test mode (`agentvm` or `othervm`).
|
The test mode (`agentvm` or `othervm`).
|
||||||
@@ -545,6 +556,18 @@ Amount of time to spend in each warmup iteration. Same as specifying `-w
|
|||||||
Specify to have the test run save a log of the values. Accepts the same values
|
Specify to have the test run save a log of the values. Accepts the same values
|
||||||
as `-rff`, i.e., `text`, `csv`, `scsv`, `json`, or `latex`.
|
as `-rff`, i.e., `text`, `csv`, `scsv`, `json`, or `latex`.
|
||||||
|
|
||||||
|
#### TEST_JDK
|
||||||
|
|
||||||
|
The path to the JDK that will be used to run the benchmarks.
|
||||||
|
|
||||||
|
Defaults to `build/<CONF-NAME>/jdk`.
|
||||||
|
|
||||||
|
#### BENCHMARKS_JAR
|
||||||
|
|
||||||
|
The path to the JAR containing the benchmarks.
|
||||||
|
|
||||||
|
Defaults to `test/micro/benchmarks.jar`.
|
||||||
|
|
||||||
#### VM_OPTIONS
|
#### VM_OPTIONS
|
||||||
|
|
||||||
Additional VM arguments to provide to forked off VMs. Same as `-jvmArgs <args>`
|
Additional VM arguments to provide to forked off VMs. Same as `-jvmArgs <args>`
|
||||||
@@ -612,7 +635,7 @@ For more notes about the PKCS11 tests, please refer to
|
|||||||
test/jdk/sun/security/pkcs11/README.
|
test/jdk/sun/security/pkcs11/README.
|
||||||
|
|
||||||
### Testing Ahead-of-time Optimizations
|
### Testing Ahead-of-time Optimizations
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
One way to improve test coverage of ahead-of-time (AOT) optimizations in
|
One way to improve test coverage of ahead-of-time (AOT) optimizations in
|
||||||
the JDK is to run existing jtreg test cases in a special "AOT_JDK" mode.
|
the JDK is to run existing jtreg test cases in a special "AOT_JDK" mode.
|
||||||
Example:
|
Example:
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ CreateHkTargets = \
|
|||||||
################################################################################
|
################################################################################
|
||||||
# Include module specific build settings
|
# Include module specific build settings
|
||||||
|
|
||||||
THIS_SNIPPET := modules/$(MODULE)/Java.gmk
|
THIS_SNIPPET := $(call GetModuleSnippetName, Java)
|
||||||
|
|
||||||
ifneq ($(wildcard $(THIS_SNIPPET)), )
|
ifneq ($(wildcard $(THIS_SNIPPET)), )
|
||||||
include MakeSnippetStart.gmk
|
include MakeSnippetStart.gmk
|
||||||
@@ -115,6 +115,7 @@ $(eval $(call SetupJavaCompilation, $(MODULE), \
|
|||||||
EXCLUDE_FILES := $(EXCLUDE_FILES), \
|
EXCLUDE_FILES := $(EXCLUDE_FILES), \
|
||||||
EXCLUDE_PATTERNS := -files, \
|
EXCLUDE_PATTERNS := -files, \
|
||||||
KEEP_ALL_TRANSLATIONS := $(KEEP_ALL_TRANSLATIONS), \
|
KEEP_ALL_TRANSLATIONS := $(KEEP_ALL_TRANSLATIONS), \
|
||||||
|
TARGET_RELEASE := $(TARGET_RELEASE), \
|
||||||
JAVAC_FLAGS := \
|
JAVAC_FLAGS := \
|
||||||
$(DOCLINT) \
|
$(DOCLINT) \
|
||||||
$(JAVAC_FLAGS) \
|
$(JAVAC_FLAGS) \
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ endif
|
|||||||
################################################################################
|
################################################################################
|
||||||
# Include module specific build settings
|
# Include module specific build settings
|
||||||
|
|
||||||
THIS_SNIPPET := modules/$(MODULE)/Jmod.gmk
|
THIS_SNIPPET := $(call GetModuleSnippetName, Jmod)
|
||||||
|
|
||||||
ifneq ($(wildcard $(THIS_SNIPPET)), )
|
ifneq ($(wildcard $(THIS_SNIPPET)), )
|
||||||
include MakeSnippetStart.gmk
|
include MakeSnippetStart.gmk
|
||||||
|
|||||||
@@ -236,8 +236,8 @@ define create_overview_file
|
|||||||
#
|
#
|
||||||
ifneq ($$($1_GROUPS), )
|
ifneq ($$($1_GROUPS), )
|
||||||
$1_OVERVIEW_TEXT += \
|
$1_OVERVIEW_TEXT += \
|
||||||
<p>This document is divided into \
|
<p>This document has \
|
||||||
$$(subst 2,two,$$(subst 3,three,$$(words $$($1_GROUPS)))) sections:</p> \
|
$$(subst 2,two,$$(subst 3,three,$$(words $$($1_GROUPS)))) major sections:</p> \
|
||||||
<blockquote><dl> \
|
<blockquote><dl> \
|
||||||
#
|
#
|
||||||
$1_OVERVIEW_TEXT += $$(foreach g, $$($1_GROUPS), \
|
$1_OVERVIEW_TEXT += $$(foreach g, $$($1_GROUPS), \
|
||||||
@@ -246,7 +246,10 @@ define create_overview_file
|
|||||||
)
|
)
|
||||||
$1_OVERVIEW_TEXT += \
|
$1_OVERVIEW_TEXT += \
|
||||||
</dl></blockquote> \
|
</dl></blockquote> \
|
||||||
#
|
<p><a href="../specs/index.html">Related documents</a> specify the Java \
|
||||||
|
programming language, the Java Virtual Machine, various protocols and file \
|
||||||
|
formats pertaining to the Java platform, and tools included in the JDK.</p> \
|
||||||
|
#
|
||||||
endif
|
endif
|
||||||
$1_OVERVIEW_TEXT += \
|
$1_OVERVIEW_TEXT += \
|
||||||
</body></html> \
|
</body></html> \
|
||||||
|
|||||||
@@ -270,6 +270,7 @@ endif
|
|||||||
# Since debug symbols are not included in the jmod files, they need to be copied
|
# Since debug symbols are not included in the jmod files, they need to be copied
|
||||||
# in manually after generating the images.
|
# in manually after generating the images.
|
||||||
|
|
||||||
|
# These variables are read by SetupCopyDebuginfo
|
||||||
ALL_JDK_MODULES := $(JDK_MODULES)
|
ALL_JDK_MODULES := $(JDK_MODULES)
|
||||||
ALL_JRE_MODULES := $(sort $(JRE_MODULES), $(foreach m, $(JRE_MODULES), \
|
ALL_JRE_MODULES := $(sort $(JRE_MODULES), $(foreach m, $(JRE_MODULES), \
|
||||||
$(call FindTransitiveDepsForModule, $m)))
|
$(call FindTransitiveDepsForModule, $m)))
|
||||||
|
|||||||
@@ -1014,7 +1014,7 @@ else
|
|||||||
else ifeq ($(EXTERNAL_BUILDJDK), false)
|
else ifeq ($(EXTERNAL_BUILDJDK), false)
|
||||||
# When not cross compiling, the BUILD_JDK is the interim jdk image, and
|
# When not cross compiling, the BUILD_JDK is the interim jdk image, and
|
||||||
# the javac launcher is needed.
|
# the javac launcher is needed.
|
||||||
jdk.compiler-gendata: jdk.compiler-launchers
|
jdk.compiler-gendata: jdk.compiler-launchers java.base-launchers
|
||||||
jdk.javadoc-gendata: jdk.compiler-launchers
|
jdk.javadoc-gendata: jdk.compiler-launchers
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -1407,7 +1407,7 @@ CLEAN_SUPPORT_DIRS += demos
|
|||||||
CLEAN_SUPPORT_DIR_TARGETS := $(addprefix clean-, $(CLEAN_SUPPORT_DIRS))
|
CLEAN_SUPPORT_DIR_TARGETS := $(addprefix clean-, $(CLEAN_SUPPORT_DIRS))
|
||||||
CLEAN_TESTS += hotspot-jtreg-native jdk-jtreg-native lib
|
CLEAN_TESTS += hotspot-jtreg-native jdk-jtreg-native lib
|
||||||
CLEAN_TEST_TARGETS += $(addprefix clean-test-, $(CLEAN_TESTS))
|
CLEAN_TEST_TARGETS += $(addprefix clean-test-, $(CLEAN_TESTS))
|
||||||
CLEAN_PHASES := gensrc java native include
|
CLEAN_PHASES += gensrc java native include
|
||||||
CLEAN_PHASE_TARGETS := $(addprefix clean-, $(CLEAN_PHASES))
|
CLEAN_PHASE_TARGETS := $(addprefix clean-, $(CLEAN_PHASES))
|
||||||
CLEAN_MODULE_TARGETS := $(addprefix clean-, $(ALL_MODULES))
|
CLEAN_MODULE_TARGETS := $(addprefix clean-, $(ALL_MODULES))
|
||||||
# Construct targets of the form clean-$module-$phase
|
# Construct targets of the form clean-$module-$phase
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ endef
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
PHASE_MAKEDIRS := $(TOPDIR)/make
|
PHASE_MAKEDIRS += $(TOPDIR)/make
|
||||||
|
|
||||||
# Helper macro for DeclareRecipesForPhase
|
# Helper macro for DeclareRecipesForPhase
|
||||||
# Declare a recipe for calling the module and phase specific makefile.
|
# Declare a recipe for calling the module and phase specific makefile.
|
||||||
|
|||||||
@@ -34,18 +34,23 @@ include MakeFileStart.gmk
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
include CopyFiles.gmk
|
include CopyFiles.gmk
|
||||||
|
include Modules.gmk
|
||||||
|
|
||||||
MODULE_SRC := $(TOPDIR)/src/$(MODULE)
|
MODULE_SRC := $(TOPDIR)/src/$(MODULE)
|
||||||
|
|
||||||
# Define the snippet for MakeSnippetStart/End
|
################################################################################
|
||||||
THIS_SNIPPET := modules/$(MODULE)/$(MAKEFILE_PREFIX).gmk
|
# Include module specific build settings
|
||||||
|
|
||||||
include MakeSnippetStart.gmk
|
THIS_SNIPPET := $(call GetModuleSnippetName, $(MAKEFILE_PREFIX))
|
||||||
|
|
||||||
# Include the file being wrapped.
|
ifneq ($(wildcard $(THIS_SNIPPET)), )
|
||||||
include $(THIS_SNIPPET)
|
include MakeSnippetStart.gmk
|
||||||
|
|
||||||
include MakeSnippetEnd.gmk
|
# Include the file being wrapped.
|
||||||
|
include $(THIS_SNIPPET)
|
||||||
|
|
||||||
|
include MakeSnippetEnd.gmk
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MAKEFILE_PREFIX), Lib)
|
ifeq ($(MAKEFILE_PREFIX), Lib)
|
||||||
# We need to keep track of what libraries are generated/needed by this
|
# We need to keep track of what libraries are generated/needed by this
|
||||||
|
|||||||
@@ -204,8 +204,9 @@ $(eval $(call SetTestOpt,AOT_JDK,JTREG))
|
|||||||
|
|
||||||
$(eval $(call ParseKeywordVariable, JTREG, \
|
$(eval $(call ParseKeywordVariable, JTREG, \
|
||||||
SINGLE_KEYWORDS := JOBS TIMEOUT_FACTOR FAILURE_HANDLER_TIMEOUT \
|
SINGLE_KEYWORDS := JOBS TIMEOUT_FACTOR FAILURE_HANDLER_TIMEOUT \
|
||||||
TEST_MODE ASSERT VERBOSE RETAIN TEST_THREAD_FACTORY MAX_MEM RUN_PROBLEM_LISTS \
|
TEST_MODE ASSERT VERBOSE RETAIN TEST_THREAD_FACTORY JVMTI_STRESS_AGENT \
|
||||||
RETRY_COUNT REPEAT_COUNT MAX_OUTPUT REPORT AOT_JDK $(CUSTOM_JTREG_SINGLE_KEYWORDS), \
|
MAX_MEM RUN_PROBLEM_LISTS RETRY_COUNT REPEAT_COUNT MAX_OUTPUT REPORT \
|
||||||
|
AOT_JDK $(CUSTOM_JTREG_SINGLE_KEYWORDS), \
|
||||||
STRING_KEYWORDS := OPTIONS JAVA_OPTIONS VM_OPTIONS KEYWORDS \
|
STRING_KEYWORDS := OPTIONS JAVA_OPTIONS VM_OPTIONS KEYWORDS \
|
||||||
EXTRA_PROBLEM_LISTS LAUNCHER_OPTIONS \
|
EXTRA_PROBLEM_LISTS LAUNCHER_OPTIONS \
|
||||||
$(CUSTOM_JTREG_STRING_KEYWORDS), \
|
$(CUSTOM_JTREG_STRING_KEYWORDS), \
|
||||||
@@ -876,6 +877,15 @@ define SetupRunJtregTestBody
|
|||||||
))
|
))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($$(JTREG_JVMTI_STRESS_AGENT), )
|
||||||
|
AGENT := $$(LIBRARY_PREFIX)JvmtiStressAgent$$(SHARED_LIBRARY_SUFFIX)=$$(JTREG_JVMTI_STRESS_AGENT)
|
||||||
|
$1_JTREG_BASIC_OPTIONS += -javaoption:'-agentpath:$(TEST_IMAGE_DIR)/hotspot/jtreg/native/$$(AGENT)'
|
||||||
|
$1_JTREG_BASIC_OPTIONS += $$(addprefix $$(JTREG_PROBLEM_LIST_PREFIX), $$(wildcard \
|
||||||
|
$$(addprefix $$($1_TEST_ROOT)/, ProblemList-jvmti-stress-agent.txt) \
|
||||||
|
))
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifneq ($$(JTREG_LAUNCHER_OPTIONS), )
|
ifneq ($$(JTREG_LAUNCHER_OPTIONS), )
|
||||||
$1_JTREG_LAUNCHER_OPTIONS += $$(JTREG_LAUNCHER_OPTIONS)
|
$1_JTREG_LAUNCHER_OPTIONS += $$(JTREG_LAUNCHER_OPTIONS)
|
||||||
endif
|
endif
|
||||||
@@ -1243,7 +1253,7 @@ UseSpecialTestHandler = \
|
|||||||
# Now process each test to run and setup a proper make rule
|
# Now process each test to run and setup a proper make rule
|
||||||
$(foreach test, $(TESTS_TO_RUN), \
|
$(foreach test, $(TESTS_TO_RUN), \
|
||||||
$(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \
|
$(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \
|
||||||
$(TR) -cs '[a-z][A-Z][0-9]\n' '[_*1000]')) \
|
$(TR) -cs '[a-z][A-Z][0-9]\n' '_')) \
|
||||||
$(eval ALL_TEST_IDS += $(TEST_ID)) \
|
$(eval ALL_TEST_IDS += $(TEST_ID)) \
|
||||||
$(if $(call UseCustomTestHandler, $(test)), \
|
$(if $(call UseCustomTestHandler, $(test)), \
|
||||||
$(eval $(call SetupRunCustomTest, $(TEST_ID), \
|
$(eval $(call SetupRunCustomTest, $(TEST_ID), \
|
||||||
@@ -1323,9 +1333,9 @@ run-test-report: post-run-test
|
|||||||
TEST TOTAL PASS FAIL ERROR SKIP " "
|
TEST TOTAL PASS FAIL ERROR SKIP " "
|
||||||
$(foreach test, $(TESTS_TO_RUN), \
|
$(foreach test, $(TESTS_TO_RUN), \
|
||||||
$(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \
|
$(eval TEST_ID := $(shell $(ECHO) $(strip $(test)) | \
|
||||||
$(TR) -cs '[a-z][A-Z][0-9]\n' '[_*1000]')) \
|
$(TR) -cs '[a-z][A-Z][0-9]\n' '_')) \
|
||||||
$(ECHO) >> $(TEST_LAST_IDS) $(TEST_ID) $(NEWLINE) \
|
$(ECHO) >> $(TEST_LAST_IDS) $(TEST_ID) $(NEWLINE) \
|
||||||
$(eval NAME_PATTERN := $(shell $(ECHO) $(test) | $(TR) -c '\n' '[_*1000]')) \
|
$(eval NAME_PATTERN := $(shell $(ECHO) $(test) | $(TR) -c '\n' '_')) \
|
||||||
$(if $(filter __________________________________________________%, $(NAME_PATTERN)), \
|
$(if $(filter __________________________________________________%, $(NAME_PATTERN)), \
|
||||||
$(eval TEST_NAME := ) \
|
$(eval TEST_NAME := ) \
|
||||||
$(PRINTF) >> $(TEST_SUMMARY) "%2s %-49s\n" " " "$(test)" $(NEWLINE) \
|
$(PRINTF) >> $(TEST_SUMMARY) "%2s %-49s\n" " " "$(test)" $(NEWLINE) \
|
||||||
|
|||||||
@@ -176,3 +176,19 @@ ULIMIT := ulimit
|
|||||||
ifeq ($(OPENJDK_BUILD_OS), windows)
|
ifeq ($(OPENJDK_BUILD_OS), windows)
|
||||||
PATHTOOL := cygpath
|
PATHTOOL := cygpath
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# These settings are needed to run testing with jvmti agent
|
||||||
|
ifeq ($(OPENJDK_BUILD_OS), linux)
|
||||||
|
LIBRARY_PREFIX := lib
|
||||||
|
SHARED_LIBRARY_SUFFIX := .so
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(OPENJDK_BUILD_OS), windows)
|
||||||
|
LIBRARY_PREFIX :=
|
||||||
|
SHARED_LIBRARY_SUFFIX := .dll
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(OPENJDK_BUILD_OS), macosx)
|
||||||
|
LIBRARY_PREFIX := lib
|
||||||
|
SHARED_LIBRARY_SUFFIX := .dylib
|
||||||
|
endif
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ TOOL_GENERATECACERTS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_class
|
|||||||
TOOL_GENERATEEXTRAPROPERTIES = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
TOOL_GENERATEEXTRAPROPERTIES = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||||
build.tools.generateextraproperties.GenerateExtraProperties
|
build.tools.generateextraproperties.GenerateExtraProperties
|
||||||
|
|
||||||
|
TOOL_GENERATECASEFOLDING = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||||
|
build.tools.generatecharacter.CaseFolding
|
||||||
|
|
||||||
TOOL_MAKEZIPREPRODUCIBLE = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
TOOL_MAKEZIPREPRODUCIBLE = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||||
build.tools.makezipreproducible.MakeZipReproducible
|
build.tools.makezipreproducible.MakeZipReproducible
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ $(eval $(call SetupJavaCompilation, BUILD_TOOLS_LANGTOOLS, \
|
|||||||
COMPILER := bootjdk, \
|
COMPILER := bootjdk, \
|
||||||
TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
|
TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
|
||||||
SRC := $(TOPDIR)/make/langtools/tools, \
|
SRC := $(TOPDIR)/make/langtools/tools, \
|
||||||
INCLUDES := compileproperties propertiesparser, \
|
INCLUDES := compileproperties flagsgenerator propertiesparser, \
|
||||||
COPY := .properties, \
|
COPY := .properties, \
|
||||||
BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes, \
|
BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes, \
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -395,11 +395,9 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK],
|
|||||||
|
|
||||||
# When compiling code to be executed by the Boot JDK, force compatibility with the
|
# When compiling code to be executed by the Boot JDK, force compatibility with the
|
||||||
# oldest supported bootjdk.
|
# oldest supported bootjdk.
|
||||||
OLDEST_BOOT_JDK=`$ECHO $DEFAULT_ACCEPTABLE_BOOT_VERSIONS \
|
OLDEST_BOOT_JDK_VERSION=`$ECHO $DEFAULT_ACCEPTABLE_BOOT_VERSIONS \
|
||||||
| $TR " " "\n" | $SORT -n | $HEAD -n1`
|
| $TR " " "\n" | $SORT -n | $HEAD -n1`
|
||||||
# -Xlint:-options is added to avoid "warning: [options] system modules path not set in conjunction with -source"
|
AC_SUBST(OLDEST_BOOT_JDK_VERSION)
|
||||||
BOOT_JDK_SOURCETARGET="-source $OLDEST_BOOT_JDK -target $OLDEST_BOOT_JDK -Xlint:-options"
|
|
||||||
AC_SUBST(BOOT_JDK_SOURCETARGET)
|
|
||||||
|
|
||||||
# Check if the boot jdk is 32 or 64 bit
|
# Check if the boot jdk is 32 or 64 bit
|
||||||
if $JAVA -version 2>&1 | $GREP -q "64-Bit"; then
|
if $JAVA -version 2>&1 | $GREP -q "64-Bit"; then
|
||||||
|
|||||||
4
make/autoconf/configure
vendored
4
make/autoconf/configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -366,7 +366,7 @@ EOT
|
|||||||
|
|
||||||
# Print additional help, e.g. a list of toolchains and JVM features.
|
# Print additional help, e.g. a list of toolchains and JVM features.
|
||||||
# This must be done by the autoconf script.
|
# This must be done by the autoconf script.
|
||||||
( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf )
|
( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf ECHO=echo )
|
||||||
|
|
||||||
cat <<EOT
|
cat <<EOT
|
||||||
|
|
||||||
|
|||||||
@@ -736,8 +736,15 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
|||||||
$1_CFLAGS_CPU_JVM="${$1_CFLAGS_CPU_JVM} -mminimal-toc"
|
$1_CFLAGS_CPU_JVM="${$1_CFLAGS_CPU_JVM} -mminimal-toc"
|
||||||
elif test "x$FLAGS_CPU" = xppc64le; then
|
elif test "x$FLAGS_CPU" = xppc64le; then
|
||||||
# Little endian machine uses ELFv2 ABI.
|
# Little endian machine uses ELFv2 ABI.
|
||||||
# Use Power8, this is the first CPU to support PPC64 LE with ELFv2 ABI.
|
# Use Power8 for target cpu, this is the first CPU to support PPC64 LE with ELFv2 ABI.
|
||||||
$1_CFLAGS_CPU="-mcpu=power8 -mtune=power10"
|
# Use Power10 for tuning target, this is supported by gcc >= 10
|
||||||
|
POWER_TUNE_VERSION="-mtune=power10"
|
||||||
|
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${POWER_TUNE_VERSION}],
|
||||||
|
IF_FALSE: [
|
||||||
|
POWER_TUNE_VERSION="-mtune=power8"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
$1_CFLAGS_CPU="-mcpu=power8 ${POWER_TUNE_VERSION}"
|
||||||
$1_CFLAGS_CPU_JVM="${$1_CFLAGS_CPU_JVM} -DABI_ELFv2"
|
$1_CFLAGS_CPU_JVM="${$1_CFLAGS_CPU_JVM} -DABI_ELFv2"
|
||||||
fi
|
fi
|
||||||
elif test "x$FLAGS_CPU" = xs390x; then
|
elif test "x$FLAGS_CPU" = xs390x; then
|
||||||
@@ -933,7 +940,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
|||||||
# ACLE and this flag are required to build the aarch64 SVE related functions in
|
# ACLE and this flag are required to build the aarch64 SVE related functions in
|
||||||
# libvectormath. Apple Silicon does not support SVE; use macOS as a proxy for
|
# libvectormath. Apple Silicon does not support SVE; use macOS as a proxy for
|
||||||
# that check.
|
# that check.
|
||||||
if test "x$OPENJDK_TARGET_CPU" = "xaarch64" && test "x$OPENJDK_TARGET_CPU" = "xlinux"; then
|
if test "x$OPENJDK_TARGET_CPU" = "xaarch64" && test "x$OPENJDK_TARGET_OS" = "xlinux"; then
|
||||||
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
|
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||||
AC_LANG_PUSH(C)
|
AC_LANG_PUSH(C)
|
||||||
OLD_CFLAGS="$CFLAGS"
|
OLD_CFLAGS="$CFLAGS"
|
||||||
@@ -947,6 +954,17 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
|||||||
[
|
[
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
$2SVE_CFLAGS="-march=armv8-a+sve"
|
$2SVE_CFLAGS="-march=armv8-a+sve"
|
||||||
|
# Switching the initialization mode with gcc from 'pattern' to 'zero'
|
||||||
|
# avoids the use of unsupported `__builtin_clear_padding` for variable
|
||||||
|
# length aggregates
|
||||||
|
if test "x$DEBUG_LEVEL" != xrelease && test "x$TOOLCHAIN_TYPE" = xgcc ; then
|
||||||
|
INIT_ZERO_FLAG="-ftrivial-auto-var-init=zero"
|
||||||
|
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$INIT_ZERO_FLAG],
|
||||||
|
IF_TRUE: [
|
||||||
|
$2SVE_CFLAGS="${$2SVE_CFLAGS} $INIT_ZERO_FLAG"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
fi
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
|
|||||||
@@ -513,6 +513,10 @@ AC_DEFUN([JVM_FEATURES_VERIFY],
|
|||||||
[
|
[
|
||||||
variant=$1
|
variant=$1
|
||||||
|
|
||||||
|
if JVM_FEATURES_IS_ACTIVE(jfr) && ! JVM_FEATURES_IS_ACTIVE(services); then
|
||||||
|
AC_MSG_ERROR([Specified JVM feature 'jfr' requires feature 'services' for variant '$variant'])
|
||||||
|
fi
|
||||||
|
|
||||||
if JVM_FEATURES_IS_ACTIVE(jvmci) && ! (JVM_FEATURES_IS_ACTIVE(compiler1) || \
|
if JVM_FEATURES_IS_ACTIVE(jvmci) && ! (JVM_FEATURES_IS_ACTIVE(compiler1) || \
|
||||||
JVM_FEATURES_IS_ACTIVE(compiler2)); then
|
JVM_FEATURES_IS_ACTIVE(compiler2)); then
|
||||||
AC_MSG_ERROR([Specified JVM feature 'jvmci' requires feature 'compiler2' or 'compiler1' for variant '$variant'])
|
AC_MSG_ERROR([Specified JVM feature 'jvmci' requires feature 'compiler2' or 'compiler1' for variant '$variant'])
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
# Minimum supported versions
|
# Minimum supported versions
|
||||||
JTREG_MINIMUM_VERSION=7.5.1
|
JTREG_MINIMUM_VERSION=7.5.2
|
||||||
GTEST_MINIMUM_VERSION=1.14.0
|
GTEST_MINIMUM_VERSION=1.14.0
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@@ -393,9 +393,8 @@ EXTERNAL_BUILDJDK := @EXTERNAL_BUILDJDK@
|
|||||||
# Whether the boot jdk jar supports --date=TIMESTAMP
|
# Whether the boot jdk jar supports --date=TIMESTAMP
|
||||||
BOOT_JDK_JAR_SUPPORTS_DATE := @BOOT_JDK_JAR_SUPPORTS_DATE@
|
BOOT_JDK_JAR_SUPPORTS_DATE := @BOOT_JDK_JAR_SUPPORTS_DATE@
|
||||||
|
|
||||||
# When compiling Java source to be run by the boot jdk
|
# The oldest supported boot jdk version
|
||||||
# use these extra flags, eg -source 6 -target 6
|
OLDEST_BOOT_JDK_VERSION := @OLDEST_BOOT_JDK_VERSION@
|
||||||
BOOT_JDK_SOURCETARGET := @BOOT_JDK_SOURCETARGET@
|
|
||||||
|
|
||||||
# Information about the build system
|
# Information about the build system
|
||||||
NUM_CORES := @NUM_CORES@
|
NUM_CORES := @NUM_CORES@
|
||||||
|
|||||||
@@ -38,10 +38,15 @@ include JarArchive.gmk
|
|||||||
###
|
###
|
||||||
|
|
||||||
# Create classes that can run on the bootjdk
|
# Create classes that can run on the bootjdk
|
||||||
TARGET_RELEASE_BOOTJDK := $(BOOT_JDK_SOURCETARGET)
|
# -Xlint:-options is added to avoid the warning
|
||||||
|
# "system modules path not set in conjunction with -source"
|
||||||
|
TARGET_RELEASE_BOOTJDK := -source $(OLDEST_BOOT_JDK_VERSION) \
|
||||||
|
-target $(OLDEST_BOOT_JDK_VERSION) -Xlint:-options
|
||||||
|
|
||||||
# Create classes that can be used in (or be a part of) the new jdk we're building
|
# Create classes that can be used in (or be a part of) the new jdk we're
|
||||||
TARGET_RELEASE_NEWJDK := -source $(JDK_SOURCE_TARGET_VERSION) -target $(JDK_SOURCE_TARGET_VERSION)
|
# building
|
||||||
|
TARGET_RELEASE_NEWJDK := -source $(JDK_SOURCE_TARGET_VERSION) \
|
||||||
|
-target $(JDK_SOURCE_TARGET_VERSION)
|
||||||
|
|
||||||
# Create classes that can be used in JDK 8, for legacy support
|
# Create classes that can be used in JDK 8, for legacy support
|
||||||
TARGET_RELEASE_JDK8 := --release 8
|
TARGET_RELEASE_JDK8 := --release 8
|
||||||
@@ -178,6 +183,10 @@ define SetupJavaCompilationBody
|
|||||||
|
|
||||||
$1_SAFE_NAME := $$(strip $$(subst /,_, $1))
|
$1_SAFE_NAME := $$(strip $$(subst /,_, $1))
|
||||||
|
|
||||||
|
ifeq ($$($1_LOG_ACTION), )
|
||||||
|
$1_LOG_ACTION := Compiling
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($$($1_SMALL_JAVA), )
|
ifeq ($$($1_SMALL_JAVA), )
|
||||||
# If unspecified, default to true
|
# If unspecified, default to true
|
||||||
$1_SMALL_JAVA := true
|
$1_SMALL_JAVA := true
|
||||||
@@ -472,7 +481,7 @@ define SetupJavaCompilationBody
|
|||||||
# list of files.
|
# list of files.
|
||||||
$$($1_FILELIST): $$($1_SRCS) $$($1_VARDEPS_FILE)
|
$$($1_FILELIST): $$($1_SRCS) $$($1_VARDEPS_FILE)
|
||||||
$$(call MakeDir, $$(@D))
|
$$(call MakeDir, $$(@D))
|
||||||
$$(call LogWarn, Compiling up to $$(words $$($1_SRCS)) files for $1)
|
$$(call LogWarn, $$($1_LOG_ACTION) up to $$(words $$($1_SRCS)) files for $1)
|
||||||
$$(eval $$(call ListPathsSafely, $1_SRCS, $$($1_FILELIST)))
|
$$(eval $$(call ListPathsSafely, $1_SRCS, $$($1_FILELIST)))
|
||||||
|
|
||||||
# Create a $$($1_MODFILELIST) file with significant modified dependencies
|
# Create a $$($1_MODFILELIST) file with significant modified dependencies
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ include $(TOPDIR)/make/conf/module-loader-map.conf
|
|||||||
|
|
||||||
# Append platform-specific and upgradeable modules
|
# Append platform-specific and upgradeable modules
|
||||||
PLATFORM_MODULES += $(PLATFORM_MODULES_$(OPENJDK_TARGET_OS)) \
|
PLATFORM_MODULES += $(PLATFORM_MODULES_$(OPENJDK_TARGET_OS)) \
|
||||||
$(UPGRADEABLE_PLATFORM_MODULES)
|
$(UPGRADEABLE_PLATFORM_MODULES) $(CUSTOM_UPGRADEABLE_PLATFORM_MODULES)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Setup module sets for docs
|
# Setup module sets for docs
|
||||||
@@ -216,7 +216,7 @@ endif
|
|||||||
# Find dependencies ("requires") for a given module.
|
# Find dependencies ("requires") for a given module.
|
||||||
# Param 1: Module to find dependencies for.
|
# Param 1: Module to find dependencies for.
|
||||||
FindDepsForModule = \
|
FindDepsForModule = \
|
||||||
$(DEPS_$(strip $1))
|
$(filter-out $(IMPORT_MODULES), $(DEPS_$(strip $1)))
|
||||||
|
|
||||||
# Find dependencies ("requires") transitively in 3 levels for a given module.
|
# Find dependencies ("requires") transitively in 3 levels for a given module.
|
||||||
# Param 1: Module to find dependencies for.
|
# Param 1: Module to find dependencies for.
|
||||||
@@ -254,7 +254,8 @@ FindTransitiveIndirectDepsForModules = \
|
|||||||
# Upgradeable modules are those that are either defined as upgradeable or that
|
# Upgradeable modules are those that are either defined as upgradeable or that
|
||||||
# require an upradeable module.
|
# require an upradeable module.
|
||||||
FindAllUpgradeableModules = \
|
FindAllUpgradeableModules = \
|
||||||
$(sort $(filter-out $(MODULES_FILTER), $(UPGRADEABLE_PLATFORM_MODULES)))
|
$(sort $(filter-out $(MODULES_FILTER), \
|
||||||
|
$(UPGRADEABLE_PLATFORM_MODULES) $(CUSTOM_UPGRADEABLE_PLATFORM_MODULES)))
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
@@ -316,6 +317,19 @@ define ReadImportMetaData
|
|||||||
$$(eval $$(call ReadSingleImportMetaData, $$m)))
|
$$(eval $$(call ReadSingleImportMetaData, $$m)))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Get a full snippet path for the current module and a given base name.
|
||||||
|
#
|
||||||
|
# Param 1 - The base name of the snippet file to include
|
||||||
|
GetModuleSnippetName = \
|
||||||
|
$(if $(CUSTOM_MODULE_MAKE_ROOT), \
|
||||||
|
$(if $(wildcard $(CUSTOM_MODULE_MAKE_ROOT)/$(MODULE)/$(strip $1).gmk), \
|
||||||
|
$(CUSTOM_MODULE_MAKE_ROOT)/$(MODULE)/$(strip $1).gmk, \
|
||||||
|
$(wildcard modules/$(MODULE)/$(strip $1).gmk) \
|
||||||
|
), \
|
||||||
|
$(wildcard modules/$(MODULE)/$(strip $1).gmk) \
|
||||||
|
)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
endif # include guard
|
endif # include guard
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -51,7 +51,6 @@ DOCS_MODULES= \
|
|||||||
jdk.jdwp.agent \
|
jdk.jdwp.agent \
|
||||||
jdk.jfr \
|
jdk.jfr \
|
||||||
jdk.jlink \
|
jdk.jlink \
|
||||||
jdk.jsobject \
|
|
||||||
jdk.jshell \
|
jdk.jshell \
|
||||||
jdk.jstatd \
|
jdk.jstatd \
|
||||||
jdk.localedata \
|
jdk.localedata \
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
# Versions and download locations for dependencies used by GitHub Actions (GHA)
|
# Versions and download locations for dependencies used by GitHub Actions (GHA)
|
||||||
|
|
||||||
GTEST_VERSION=1.14.0
|
GTEST_VERSION=1.14.0
|
||||||
JTREG_VERSION=7.5.1+1
|
JTREG_VERSION=7.5.2+1
|
||||||
|
|
||||||
LINUX_X64_BOOT_JDK_EXT=tar.gz
|
LINUX_X64_BOOT_JDK_EXT=tar.gz
|
||||||
LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_linux-x64_bin.tar.gz
|
LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_linux-x64_bin.tar.gz
|
||||||
|
|||||||
@@ -1174,9 +1174,9 @@ var getJibProfilesDependencies = function (input, common) {
|
|||||||
jtreg: {
|
jtreg: {
|
||||||
server: "jpg",
|
server: "jpg",
|
||||||
product: "jtreg",
|
product: "jtreg",
|
||||||
version: "7.5.1",
|
version: "7.5.2",
|
||||||
build_number: "1",
|
build_number: "1",
|
||||||
file: "bundles/jtreg-7.5.1+1.zip",
|
file: "bundles/jtreg-7.5.2+1.zip",
|
||||||
environment_name: "JT_HOME",
|
environment_name: "JT_HOME",
|
||||||
environment_path: input.get("jtreg", "home_path") + "/bin",
|
environment_path: input.get("jtreg", "home_path") + "/bin",
|
||||||
configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"),
|
configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"),
|
||||||
@@ -1192,8 +1192,8 @@ var getJibProfilesDependencies = function (input, common) {
|
|||||||
server: "jpg",
|
server: "jpg",
|
||||||
product: "jcov",
|
product: "jcov",
|
||||||
version: "3.0",
|
version: "3.0",
|
||||||
build_number: "1",
|
build_number: "3",
|
||||||
file: "bundles/jcov-3.0+1.zip",
|
file: "bundles/jcov-3.0+3.zip",
|
||||||
environment_name: "JCOV_HOME",
|
environment_name: "JCOV_HOME",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ UPGRADEABLE_PLATFORM_MODULES= \
|
|||||||
java.compiler \
|
java.compiler \
|
||||||
jdk.graal.compiler \
|
jdk.graal.compiler \
|
||||||
jdk.graal.compiler.management \
|
jdk.graal.compiler.management \
|
||||||
jdk.jsobject \
|
|
||||||
#
|
#
|
||||||
|
|
||||||
PLATFORM_MODULES= \
|
PLATFORM_MODULES= \
|
||||||
|
|||||||
@@ -26,17 +26,17 @@
|
|||||||
# Default version, product, and vendor information to use,
|
# Default version, product, and vendor information to use,
|
||||||
# unless overridden by configure
|
# unless overridden by configure
|
||||||
|
|
||||||
DEFAULT_VERSION_FEATURE=25
|
DEFAULT_VERSION_FEATURE=26
|
||||||
DEFAULT_VERSION_INTERIM=0
|
DEFAULT_VERSION_INTERIM=0
|
||||||
DEFAULT_VERSION_UPDATE=0
|
DEFAULT_VERSION_UPDATE=0
|
||||||
DEFAULT_VERSION_PATCH=0
|
DEFAULT_VERSION_PATCH=0
|
||||||
DEFAULT_VERSION_EXTRA1=0
|
DEFAULT_VERSION_EXTRA1=0
|
||||||
DEFAULT_VERSION_EXTRA2=0
|
DEFAULT_VERSION_EXTRA2=0
|
||||||
DEFAULT_VERSION_EXTRA3=0
|
DEFAULT_VERSION_EXTRA3=0
|
||||||
DEFAULT_VERSION_DATE=2025-09-16
|
DEFAULT_VERSION_DATE=2026-03-17
|
||||||
DEFAULT_VERSION_CLASSFILE_MAJOR=69 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
DEFAULT_VERSION_CLASSFILE_MAJOR=70 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||||
DEFAULT_VERSION_DOCS_API_SINCE=11
|
DEFAULT_VERSION_DOCS_API_SINCE=11
|
||||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="24 25"
|
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="24 25 26"
|
||||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=25
|
DEFAULT_JDK_SOURCE_TARGET_VERSION=26
|
||||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ ATTRIBUTE_DEFAULT_VISIBILITY ATTRIBUTE_USED const char* CDECL __asan_default_opt
|
|||||||
#endif
|
#endif
|
||||||
"print_suppressions=0,"
|
"print_suppressions=0,"
|
||||||
"handle_segv=0,"
|
"handle_segv=0,"
|
||||||
|
// A lot of libjsig related tests fail because of the link order check; so better avoid it
|
||||||
|
"verify_asan_link_order=0,"
|
||||||
// See https://github.com/google/sanitizers/issues/1322. Hopefully this is resolved
|
// See https://github.com/google/sanitizers/issues/1322. Hopefully this is resolved
|
||||||
// at some point and we can remove this option.
|
// at some point and we can remove this option.
|
||||||
"intercept_tls_get_addr=0";
|
"intercept_tls_get_addr=0";
|
||||||
|
|||||||
@@ -62,5 +62,8 @@
|
|||||||
// thread so it is easier to track down. You can override these options by setting the environment
|
// thread so it is easier to track down. You can override these options by setting the environment
|
||||||
// variable UBSAN_OPTIONS.
|
// variable UBSAN_OPTIONS.
|
||||||
ATTRIBUTE_DEFAULT_VISIBILITY ATTRIBUTE_USED const char* __ubsan_default_options() {
|
ATTRIBUTE_DEFAULT_VISIBILITY ATTRIBUTE_USED const char* __ubsan_default_options() {
|
||||||
return "halt_on_error=1,print_stacktrace=1" _LLVM_SYMBOLIZER(LLVM_SYMBOLIZER);
|
return "halt_on_error=1,"
|
||||||
|
"handle_segv=0,"
|
||||||
|
"handle_sigbus=0,"
|
||||||
|
"print_stacktrace=1" _LLVM_SYMBOLIZER(LLVM_SYMBOLIZER);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
#
|
#
|
||||||
# make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora
|
# make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora
|
||||||
# or
|
# or
|
||||||
# make TARGETS="arm-linux-gnueabihf ppc64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=17
|
# make TARGETS="arm-linux-gnueabihf ppc64le-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=17
|
||||||
#
|
#
|
||||||
# to build several devkits for a specific OS version at once.
|
# to build several devkits for a specific OS version at once.
|
||||||
# You can find the final results under ../../build/devkit/result/<host>-to-<target>
|
# You can find the final results under ../../build/devkit/result/<host>-to-<target>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
# makefile again for cross compilation. Ex:
|
# makefile again for cross compilation. Ex:
|
||||||
#
|
#
|
||||||
# PATH=$PWD/../../build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu/bin:$PATH \
|
# PATH=$PWD/../../build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu/bin:$PATH \
|
||||||
# make TARGETS="arm-linux-gnueabihf,ppc64-linux-gnu" BASE_OS=Fedora
|
# make TARGETS="arm-linux-gnueabihf ppc64le-linux-gnu" BASE_OS=Fedora
|
||||||
#
|
#
|
||||||
# This is the makefile which iterates over all host and target platforms.
|
# This is the makefile which iterates over all host and target platforms.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -69,15 +69,26 @@ else ifeq ($(BASE_OS), Fedora)
|
|||||||
ifeq ($(BASE_OS_VERSION), )
|
ifeq ($(BASE_OS_VERSION), )
|
||||||
BASE_OS_VERSION := $(DEFAULT_OS_VERSION)
|
BASE_OS_VERSION := $(DEFAULT_OS_VERSION)
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(filter aarch64 armhfp ppc64le riscv64 s390x x86_64, $(ARCH)), )
|
||||||
|
$(error Only "aarch64 armhfp ppc64le riscv64 s390x x86_64" architectures are supported for Fedora, but "$(ARCH)" was requested)
|
||||||
|
endif
|
||||||
ifeq ($(ARCH), riscv64)
|
ifeq ($(ARCH), riscv64)
|
||||||
|
ifeq ($(filter 38 39 40 41, $(BASE_OS_VERSION)), )
|
||||||
|
$(error Only Fedora 38-41 are supported for "$(ARCH)", but Fedora $(BASE_OS_VERSION) was requested)
|
||||||
|
endif
|
||||||
BASE_URL := http://fedora.riscv.rocks/repos-dist/f$(BASE_OS_VERSION)/latest/$(ARCH)/Packages/
|
BASE_URL := http://fedora.riscv.rocks/repos-dist/f$(BASE_OS_VERSION)/latest/$(ARCH)/Packages/
|
||||||
else
|
else
|
||||||
LATEST_ARCHIVED_OS_VERSION := 35
|
LATEST_ARCHIVED_OS_VERSION := 36
|
||||||
ifeq ($(filter x86_64 armhfp, $(ARCH)), )
|
ifeq ($(filter aarch64 armhfp x86_64, $(ARCH)), )
|
||||||
FEDORA_TYPE := fedora-secondary
|
FEDORA_TYPE := fedora-secondary
|
||||||
else
|
else
|
||||||
FEDORA_TYPE := fedora/linux
|
FEDORA_TYPE := fedora/linux
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(ARCH), armhfp)
|
||||||
|
ifneq ($(BASE_OS_VERSION), 36)
|
||||||
|
$(error Fedora 36 is the last release supporting "armhfp", but $(BASE_OS) was requested)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
NOT_ARCHIVED := $(shell [ $(BASE_OS_VERSION) -gt $(LATEST_ARCHIVED_OS_VERSION) ] && echo true)
|
NOT_ARCHIVED := $(shell [ $(BASE_OS_VERSION) -gt $(LATEST_ARCHIVED_OS_VERSION) ] && echo true)
|
||||||
ifeq ($(NOT_ARCHIVED),true)
|
ifeq ($(NOT_ARCHIVED),true)
|
||||||
BASE_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
|
BASE_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
|
||||||
@@ -464,7 +475,7 @@ ifeq ($(ARCH), armhfp)
|
|||||||
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
|
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(filter riscv64 ppc64 ppc64le s390x, $(ARCH)), )
|
ifneq ($(filter riscv64 ppc64le s390x, $(ARCH)), )
|
||||||
# We only support 64-bit on these platforms anyway
|
# We only support 64-bit on these platforms anyway
|
||||||
CONFIG += --disable-multilib
|
CONFIG += --disable-multilib
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -64,6 +64,30 @@ IS_WSL=`echo $UNAME_RELEASE | grep Microsoft`
|
|||||||
IS_MSYS=`echo $UNAME_OS | grep -i Msys`
|
IS_MSYS=`echo $UNAME_OS | grep -i Msys`
|
||||||
MSYS2_ARG_CONV_EXCL="*" # make "cmd.exe /c" work for msys2
|
MSYS2_ARG_CONV_EXCL="*" # make "cmd.exe /c" work for msys2
|
||||||
CMD_EXE="cmd.exe /c"
|
CMD_EXE="cmd.exe /c"
|
||||||
|
|
||||||
|
# Detect host architecture to determine devkit platform support
|
||||||
|
# Note: The devkit always includes x86, x64, and aarch64 libraries and tools
|
||||||
|
# The difference is in toolchain capabilities:
|
||||||
|
# - On x64|AMD64 hosts: aarch64 tools are cross-compilation tools (Hostx64/arm64)
|
||||||
|
# - On aarch64|ARMv8 hosts: aarch64 tools are native tools (Hostarm64/arm64)
|
||||||
|
HOST_ARCH=`echo $PROCESSOR_IDENTIFIER`
|
||||||
|
case $HOST_ARCH in
|
||||||
|
AMD64)
|
||||||
|
echo "Running on x64 host - generating devkit with native x86/x64 tools and cross-compiled aarch64 tools."
|
||||||
|
echo "For native aarch64 compilation tools, run this script on a Windows/aarch64 machine."
|
||||||
|
SUPPORTED_PLATFORMS="x86, x64 (native) and aarch64 (cross-compiled)"
|
||||||
|
;;
|
||||||
|
ARMv8)
|
||||||
|
echo "Running on aarch64 host - generating devkit with native tools for all platforms (x86, x64, aarch64)."
|
||||||
|
SUPPORTED_PLATFORMS="x86, x64, and aarch64 (all native)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown host architecture: $HOST_ARCH"
|
||||||
|
echo "Proceeding with devkit generation - toolchain capabilities may vary."
|
||||||
|
SUPPORTED_PLATFORMS="x86, x64, and aarch64"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test "x$IS_CYGWIN" != "x"; then
|
if test "x$IS_CYGWIN" != "x"; then
|
||||||
BUILD_ENV="cygwin"
|
BUILD_ENV="cygwin"
|
||||||
elif test "x$IS_MSYS" != "x"; then
|
elif test "x$IS_MSYS" != "x"; then
|
||||||
@@ -139,6 +163,7 @@ DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}-${VS_VERSION_SP}-devkit"
|
|||||||
DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz"
|
DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz"
|
||||||
|
|
||||||
echo "Creating devkit in $DEVKIT_ROOT"
|
echo "Creating devkit in $DEVKIT_ROOT"
|
||||||
|
echo "Platform support: $SUPPORTED_PLATFORMS"
|
||||||
|
|
||||||
MSVCR_DLL=${MSVC_CRT_DIR}/vcruntime${VS_DLL_VERSION}.dll
|
MSVCR_DLL=${MSVC_CRT_DIR}/vcruntime${VS_DLL_VERSION}.dll
|
||||||
VCRUNTIME_1_DLL=${MSVC_CRT_DIR}/vcruntime${VS_DLL_VERSION}_1.dll
|
VCRUNTIME_1_DLL=${MSVC_CRT_DIR}/vcruntime${VS_DLL_VERSION}_1.dll
|
||||||
@@ -156,7 +181,11 @@ REDIST_SUBDIR="VC/Redist/MSVC/$REDIST_VERSION"
|
|||||||
echo "Copying VC..."
|
echo "Copying VC..."
|
||||||
rm -rf $DEVKIT_ROOT/VC
|
rm -rf $DEVKIT_ROOT/VC
|
||||||
mkdir -p $DEVKIT_ROOT/VC/bin
|
mkdir -p $DEVKIT_ROOT/VC/bin
|
||||||
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx64/arm64" $DEVKIT_ROOT/VC/bin/
|
if [ -d "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostarm64/arm64" ]; then
|
||||||
|
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostarm64/arm64" $DEVKIT_ROOT/VC/bin/
|
||||||
|
else
|
||||||
|
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx64/arm64" $DEVKIT_ROOT/VC/bin/
|
||||||
|
fi
|
||||||
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx64/x64" $DEVKIT_ROOT/VC/bin/
|
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx64/x64" $DEVKIT_ROOT/VC/bin/
|
||||||
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx86/x86" $DEVKIT_ROOT/VC/bin/
|
cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx86/x86" $DEVKIT_ROOT/VC/bin/
|
||||||
mkdir -p $DEVKIT_ROOT/VC/lib
|
mkdir -p $DEVKIT_ROOT/VC/lib
|
||||||
|
|||||||
@@ -12,12 +12,17 @@
|
|||||||
],
|
],
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
|
"oracle.oracle-java",
|
||||||
// {{INDEXER_EXTENSIONS}}
|
// {{INDEXER_EXTENSIONS}}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
// {{INDEXER_SETTINGS}}
|
// {{INDEXER_SETTINGS}}
|
||||||
|
|
||||||
|
// Java extension
|
||||||
|
"jdk.project.jdkhome": "{{OUTPUTDIR}}/jdk",
|
||||||
|
"jdk.java.onSave.organizeImports": false, // prevents unnecessary changes
|
||||||
|
|
||||||
// Additional conventions
|
// Additional conventions
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.gmk": "makefile"
|
"*.gmk": "makefile"
|
||||||
|
|||||||
@@ -542,10 +542,10 @@ class Bundle {
|
|||||||
if (pattern != null) {
|
if (pattern != null) {
|
||||||
// Perform date-time format pattern conversion which is
|
// Perform date-time format pattern conversion which is
|
||||||
// applicable to both SimpleDateFormat and j.t.f.DateTimeFormatter.
|
// applicable to both SimpleDateFormat and j.t.f.DateTimeFormatter.
|
||||||
String transPattern = translateDateFormatLetters(calendarType, pattern, this::convertDateTimePatternLetter);
|
String transPattern = translateDateFormatLetters(calendarType, key, pattern, this::convertDateTimePatternLetter);
|
||||||
dateTimePatterns.add(i, transPattern);
|
dateTimePatterns.add(i, transPattern);
|
||||||
// Additionally, perform SDF specific date-time format pattern conversion
|
// Additionally, perform SDF specific date-time format pattern conversion
|
||||||
sdfPatterns.add(i, translateDateFormatLetters(calendarType, transPattern, this::convertSDFLetter));
|
sdfPatterns.add(i, translateDateFormatLetters(calendarType, key, transPattern, this::convertSDFLetter));
|
||||||
} else {
|
} else {
|
||||||
dateTimePatterns.add(i, null);
|
dateTimePatterns.add(i, null);
|
||||||
sdfPatterns.add(i, null);
|
sdfPatterns.add(i, null);
|
||||||
@@ -568,7 +568,7 @@ class Bundle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String translateDateFormatLetters(CalendarType calendarType, String cldrFormat, ConvertDateTimeLetters converter) {
|
private String translateDateFormatLetters(CalendarType calendarType, String patternKey, String cldrFormat, ConvertDateTimeLetters converter) {
|
||||||
String pattern = cldrFormat;
|
String pattern = cldrFormat;
|
||||||
int length = pattern.length();
|
int length = pattern.length();
|
||||||
boolean inQuote = false;
|
boolean inQuote = false;
|
||||||
@@ -587,7 +587,7 @@ class Bundle {
|
|||||||
if (nextc == '\'') {
|
if (nextc == '\'') {
|
||||||
i++;
|
i++;
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
converter.convert(calendarType, lastLetter, count, jrePattern);
|
converter.convert(calendarType, patternKey, lastLetter, count, jrePattern);
|
||||||
lastLetter = 0;
|
lastLetter = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
@@ -597,7 +597,7 @@ class Bundle {
|
|||||||
}
|
}
|
||||||
if (!inQuote) {
|
if (!inQuote) {
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
converter.convert(calendarType, lastLetter, count, jrePattern);
|
converter.convert(calendarType, patternKey, lastLetter, count, jrePattern);
|
||||||
lastLetter = 0;
|
lastLetter = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
@@ -614,7 +614,7 @@ class Bundle {
|
|||||||
}
|
}
|
||||||
if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) {
|
if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) {
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
converter.convert(calendarType, lastLetter, count, jrePattern);
|
converter.convert(calendarType, patternKey, lastLetter, count, jrePattern);
|
||||||
lastLetter = 0;
|
lastLetter = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
@@ -627,7 +627,7 @@ class Bundle {
|
|||||||
count++;
|
count++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
converter.convert(calendarType, lastLetter, count, jrePattern);
|
converter.convert(calendarType, patternKey, lastLetter, count, jrePattern);
|
||||||
lastLetter = c;
|
lastLetter = c;
|
||||||
count = 1;
|
count = 1;
|
||||||
}
|
}
|
||||||
@@ -637,7 +637,7 @@ class Bundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
converter.convert(calendarType, lastLetter, count, jrePattern);
|
converter.convert(calendarType, patternKey, lastLetter, count, jrePattern);
|
||||||
}
|
}
|
||||||
if (cldrFormat.contentEquals(jrePattern)) {
|
if (cldrFormat.contentEquals(jrePattern)) {
|
||||||
return cldrFormat;
|
return cldrFormat;
|
||||||
@@ -661,7 +661,7 @@ class Bundle {
|
|||||||
* on the support given by the SimpleDateFormat and the j.t.f.DateTimeFormatter
|
* on the support given by the SimpleDateFormat and the j.t.f.DateTimeFormatter
|
||||||
* for date-time formatting.
|
* for date-time formatting.
|
||||||
*/
|
*/
|
||||||
private void convertDateTimePatternLetter(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) {
|
private void convertDateTimePatternLetter(CalendarType calendarType, String patternKey, char cldrLetter, int count, StringBuilder sb) {
|
||||||
switch (cldrLetter) {
|
switch (cldrLetter) {
|
||||||
case 'u':
|
case 'u':
|
||||||
case 'U':
|
case 'U':
|
||||||
@@ -683,7 +683,7 @@ class Bundle {
|
|||||||
* Perform a conversion of CLDR date-time format pattern letter which is
|
* Perform a conversion of CLDR date-time format pattern letter which is
|
||||||
* specific to the SimpleDateFormat.
|
* specific to the SimpleDateFormat.
|
||||||
*/
|
*/
|
||||||
private void convertSDFLetter(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) {
|
private void convertSDFLetter(CalendarType calendarType, String patternKey, char cldrLetter, int count, StringBuilder sb) {
|
||||||
switch (cldrLetter) {
|
switch (cldrLetter) {
|
||||||
case 'G':
|
case 'G':
|
||||||
if (calendarType != CalendarType.GREGORIAN) {
|
if (calendarType != CalendarType.GREGORIAN) {
|
||||||
@@ -722,6 +722,17 @@ class Bundle {
|
|||||||
appendN('z', count, sb);
|
appendN('z', count, sb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'y':
|
||||||
|
// If the style is FULL/LONG for a Japanese Calendar, make the
|
||||||
|
// count == 4 for Gan-nen
|
||||||
|
if (calendarType == CalendarType.JAPANESE &&
|
||||||
|
(patternKey.contains("full-") ||
|
||||||
|
patternKey.contains("long-"))) {
|
||||||
|
count = 4;
|
||||||
|
}
|
||||||
|
appendN(cldrLetter, count, sb);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'Z':
|
case 'Z':
|
||||||
if (count == 4 || count == 5) {
|
if (count == 4 || count == 5) {
|
||||||
sb.append("XXX");
|
sb.append("XXX");
|
||||||
@@ -767,6 +778,7 @@ class Bundle {
|
|||||||
.collect(Collectors.toMap(
|
.collect(Collectors.toMap(
|
||||||
e -> calendarPrefix + e.getKey(),
|
e -> calendarPrefix + e.getKey(),
|
||||||
e -> translateDateFormatLetters(calendarType,
|
e -> translateDateFormatLetters(calendarType,
|
||||||
|
e.getKey(),
|
||||||
(String)e.getValue(),
|
(String)e.getValue(),
|
||||||
this::convertDateTimePatternLetter)
|
this::convertDateTimePatternLetter)
|
||||||
))
|
))
|
||||||
@@ -775,7 +787,7 @@ class Bundle {
|
|||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
private interface ConvertDateTimeLetters {
|
private interface ConvertDateTimeLetters {
|
||||||
void convert(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb);
|
void convert(CalendarType calendarType, String patternKey, char cldrLetter, int count, StringBuilder sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package build.tools.generatecharacter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class CaseFolding {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
if (args.length != 3) {
|
||||||
|
System.err.println("Usage: java CaseFolding TemplateFile CaseFolding.txt CaseFolding.java");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
var templateFile = Paths.get(args[0]);
|
||||||
|
var caseFoldingTxt = Paths.get(args[1]);
|
||||||
|
var genSrcFile = Paths.get(args[2]);
|
||||||
|
var supportedTypes = "^.*; [CTS]; .*$";
|
||||||
|
var caseFoldingEntries = Files.lines(caseFoldingTxt)
|
||||||
|
.filter(line -> !line.startsWith("#") && line.matches(supportedTypes))
|
||||||
|
.map(line -> {
|
||||||
|
String[] cols = line.split("; ");
|
||||||
|
return new String[] {cols[0], cols[1], cols[2]};
|
||||||
|
})
|
||||||
|
.filter(cols -> {
|
||||||
|
// the folding case doesn't map back to the original char.
|
||||||
|
var cp1 = Integer.parseInt(cols[0], 16);
|
||||||
|
var cp2 = Integer.parseInt(cols[2], 16);
|
||||||
|
return Character.toUpperCase(cp2) != cp1 && Character.toLowerCase(cp2) != cp1;
|
||||||
|
})
|
||||||
|
.map(cols -> String.format(" entry(0x%s, 0x%s)", cols[0], cols[2]))
|
||||||
|
.collect(Collectors.joining(",\n", "", ""));
|
||||||
|
|
||||||
|
// hack, hack, hack! the logic does not pick 0131. just add manually to support 'I's.
|
||||||
|
// 0049; T; 0131; # LATIN CAPITAL LETTER I
|
||||||
|
final String T_0x0131_0x49 = String.format(" entry(0x%04x, 0x%04x),\n", 0x0131, 0x49);
|
||||||
|
|
||||||
|
// Generate .java file
|
||||||
|
Files.write(
|
||||||
|
genSrcFile,
|
||||||
|
Files.lines(templateFile)
|
||||||
|
.map(line -> line.contains("%%%Entries") ? T_0x0131_0x49 + caseFoldingEntries : line)
|
||||||
|
.collect(Collectors.toList()),
|
||||||
|
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||||
|
}
|
||||||
|
}
|
||||||
161
make/langtools/tools/flagsgenerator/FlagsGenerator.java
Normal file
161
make/langtools/tools/flagsgenerator/FlagsGenerator.java
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package flagsgenerator;
|
||||||
|
|
||||||
|
import com.sun.source.tree.CompilationUnitTree;
|
||||||
|
import com.sun.source.util.JavacTask;
|
||||||
|
import com.sun.source.util.TreePath;
|
||||||
|
import com.sun.source.util.Trees;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import javax.lang.model.element.AnnotationMirror;
|
||||||
|
import javax.lang.model.element.TypeElement;
|
||||||
|
import javax.lang.model.element.VariableElement;
|
||||||
|
import javax.lang.model.util.ElementFilter;
|
||||||
|
import javax.tools.ToolProvider;
|
||||||
|
|
||||||
|
public class FlagsGenerator {
|
||||||
|
public static void main(String... args) throws IOException {
|
||||||
|
var compiler = ToolProvider.getSystemJavaCompiler();
|
||||||
|
|
||||||
|
try (var fm = compiler.getStandardFileManager(null, null, null)) {
|
||||||
|
JavacTask task = (JavacTask) compiler.getTask(null, null, d -> {}, null, null, fm.getJavaFileObjects(args[0]));
|
||||||
|
Trees trees = Trees.instance(task);
|
||||||
|
CompilationUnitTree cut = task.parse().iterator().next();
|
||||||
|
|
||||||
|
task.analyze();
|
||||||
|
|
||||||
|
TypeElement clazz = (TypeElement) trees.getElement(new TreePath(new TreePath(cut), cut.getTypeDecls().get(0)));
|
||||||
|
Map<Integer, List<String>> flag2Names = new TreeMap<>();
|
||||||
|
Map<FlagTarget, Map<Integer, List<String>>> target2FlagBit2Fields = new EnumMap<>(FlagTarget.class);
|
||||||
|
Map<String, String> customToString = new HashMap<>();
|
||||||
|
Set<String> noToString = new HashSet<>();
|
||||||
|
|
||||||
|
for (VariableElement field : ElementFilter.fieldsIn(clazz.getEnclosedElements())) {
|
||||||
|
String flagName = field.getSimpleName().toString();
|
||||||
|
for (AnnotationMirror am : field.getAnnotationMirrors()) {
|
||||||
|
switch (am.getAnnotationType().toString()) {
|
||||||
|
case "com.sun.tools.javac.code.Flags.Use" -> {
|
||||||
|
long flagValue = ((Number) field.getConstantValue()).longValue();
|
||||||
|
int flagBit = 63 - Long.numberOfLeadingZeros(flagValue);
|
||||||
|
|
||||||
|
flag2Names.computeIfAbsent(flagBit, _ -> new ArrayList<>())
|
||||||
|
.add(flagName);
|
||||||
|
|
||||||
|
List<?> originalTargets = (List<?>) valueOfValueAttribute(am);
|
||||||
|
originalTargets.stream()
|
||||||
|
.map(value -> FlagTarget.valueOf(value.toString()))
|
||||||
|
.forEach(target -> target2FlagBit2Fields.computeIfAbsent(target, _ -> new HashMap<>())
|
||||||
|
.computeIfAbsent(flagBit, _ -> new ArrayList<>())
|
||||||
|
.add(flagName));
|
||||||
|
}
|
||||||
|
case "com.sun.tools.javac.code.Flags.CustomToStringValue" -> {
|
||||||
|
customToString.put(flagName, (String) valueOfValueAttribute(am));
|
||||||
|
}
|
||||||
|
case "com.sun.tools.javac.code.Flags.NoToStringValue" -> {
|
||||||
|
noToString.add(flagName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//verify there are no flag overlaps:
|
||||||
|
for (Entry<FlagTarget, Map<Integer, List<String>>> targetAndFlag : target2FlagBit2Fields.entrySet()) {
|
||||||
|
for (Entry<Integer, List<String>> flagAndFields : targetAndFlag.getValue().entrySet()) {
|
||||||
|
if (flagAndFields.getValue().size() > 1) {
|
||||||
|
throw new AssertionError("duplicate flag for target: " + targetAndFlag.getKey() +
|
||||||
|
", flag: " + flagAndFields.getKey() +
|
||||||
|
", flags fields: " + flagAndFields.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try (PrintWriter out = new PrintWriter(Files.newBufferedWriter(Paths.get(args[1])))) {
|
||||||
|
out.println("""
|
||||||
|
package com.sun.tools.javac.code;
|
||||||
|
|
||||||
|
public enum FlagsEnum {
|
||||||
|
""");
|
||||||
|
for (Entry<Integer, List<String>> e : flag2Names.entrySet()) {
|
||||||
|
String constantName = e.getValue().stream().collect(Collectors.joining("_OR_"));
|
||||||
|
String toString = e.getValue()
|
||||||
|
.stream()
|
||||||
|
.filter(n -> !noToString.contains(n))
|
||||||
|
.map(n -> customToString.getOrDefault(n, n.toLowerCase(Locale.US)))
|
||||||
|
.collect(Collectors.joining(" or "));
|
||||||
|
out.println(" " + constantName + "(1L<<" + e.getKey() + ", \"" + toString + "\"),");
|
||||||
|
}
|
||||||
|
out.println("""
|
||||||
|
;
|
||||||
|
|
||||||
|
private final long value;
|
||||||
|
private final String toString;
|
||||||
|
private FlagsEnum(long value, String toString) {
|
||||||
|
this.value = value;
|
||||||
|
this.toString = toString;
|
||||||
|
}
|
||||||
|
public long value() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
public String toString() {
|
||||||
|
return toString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object valueOfValueAttribute(AnnotationMirror am) {
|
||||||
|
return am.getElementValues()
|
||||||
|
.values()
|
||||||
|
.iterator()
|
||||||
|
.next()
|
||||||
|
.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum FlagTarget {
|
||||||
|
BLOCK,
|
||||||
|
CLASS,
|
||||||
|
METHOD,
|
||||||
|
MODULE,
|
||||||
|
PACKAGE,
|
||||||
|
TYPE_VAR,
|
||||||
|
VARIABLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -47,6 +47,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@@ -93,7 +94,9 @@ public class ClassGenerator {
|
|||||||
FACTORY_FIELD_LINT("factory.decl.field.lint"),
|
FACTORY_FIELD_LINT("factory.decl.field.lint"),
|
||||||
WILDCARDS_EXTENDS("wildcards.extends"),
|
WILDCARDS_EXTENDS("wildcards.extends"),
|
||||||
SUPPRESS_WARNINGS("suppress.warnings"),
|
SUPPRESS_WARNINGS("suppress.warnings"),
|
||||||
LINT_CATEGORY("lint.category");
|
LINT_CATEGORY("lint.category"),
|
||||||
|
DIAGNOSTIC_FLAGS_EMPTY("diagnostic.flags.empty"),
|
||||||
|
DIAGNOSTIC_FLAGS_NON_EMPTY("diagnostic.flags.non-empty");
|
||||||
|
|
||||||
/** stub key (as it appears in the property file) */
|
/** stub key (as it appears in the property file) */
|
||||||
String key;
|
String key;
|
||||||
@@ -259,17 +262,30 @@ public class ClassGenerator {
|
|||||||
.map(MessageLine::lintCategory)
|
.map(MessageLine::lintCategory)
|
||||||
.findFirst().orElse(null);
|
.findFirst().orElse(null);
|
||||||
//System.out.println("category for " + key + " = " + lintCategory);
|
//System.out.println("category for " + key + " = " + lintCategory);
|
||||||
|
String diagnosticFlags = lines.stream()
|
||||||
|
.filter(MessageLine::isDiagnosticFlags)
|
||||||
|
.map(MessageLine::diagnosticFlags)
|
||||||
|
.flatMap(Stream::of)
|
||||||
|
.map(s -> s.replace('-', '_'))
|
||||||
|
.map(s -> s.toUpperCase(Locale.ROOT))
|
||||||
|
.collect(Collectors.joining(", "));
|
||||||
String factoryName = factoryName(key);
|
String factoryName = factoryName(key);
|
||||||
if (msgInfo.getTypes().isEmpty()) {
|
if (msgInfo.getTypes().isEmpty()) {
|
||||||
//generate field
|
//generate field
|
||||||
String factoryField;
|
String factoryField;
|
||||||
if (lintCategory == null) {
|
if (lintCategory == null) {
|
||||||
factoryField = StubKind.FACTORY_FIELD.format(k.keyClazz, factoryName,
|
factoryField = StubKind.FACTORY_FIELD.format(k.keyClazz, factoryName,
|
||||||
|
diagnosticFlags.isEmpty() ?
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
javadoc);
|
javadoc);
|
||||||
} else {
|
} else {
|
||||||
factoryField = StubKind.FACTORY_FIELD_LINT.format(k.keyClazz, factoryName,
|
factoryField = StubKind.FACTORY_FIELD_LINT.format(k.keyClazz, factoryName,
|
||||||
|
diagnosticFlags.isEmpty() ?
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
@@ -287,11 +303,17 @@ public class ClassGenerator {
|
|||||||
String methodBody;
|
String methodBody;
|
||||||
if (lintCategory == null) {
|
if (lintCategory == null) {
|
||||||
methodBody = StubKind.FACTORY_METHOD_BODY.format(k.keyClazz,
|
methodBody = StubKind.FACTORY_METHOD_BODY.format(k.keyClazz,
|
||||||
|
diagnosticFlags.isEmpty() ?
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
argNames.stream().collect(Collectors.joining(", ")));
|
argNames.stream().collect(Collectors.joining(", ")));
|
||||||
} else {
|
} else {
|
||||||
methodBody = StubKind.FACTORY_METHOD_BODY_LINT.format(k.keyClazz,
|
methodBody = StubKind.FACTORY_METHOD_BODY_LINT.format(k.keyClazz,
|
||||||
|
diagnosticFlags.isEmpty() ?
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ import java.util.List;
|
|||||||
* A message within the message file.
|
* A message within the message file.
|
||||||
* A message is a series of lines containing a "name=value" property,
|
* A message is a series of lines containing a "name=value" property,
|
||||||
* optionally preceded by a comment describing the use of placeholders
|
* optionally preceded by a comment describing the use of placeholders
|
||||||
* such as {0}, {1}, etc within the property value.
|
* such as {0}, {1}, etc within the property value, a lint category,
|
||||||
|
* and/or a list of diagnostic flags.
|
||||||
*/
|
*/
|
||||||
public final class Message {
|
public final class Message {
|
||||||
final MessageLine firstLine;
|
final MessageLine firstLine;
|
||||||
@@ -49,7 +50,7 @@ public final class Message {
|
|||||||
public MessageInfo getMessageInfo() {
|
public MessageInfo getMessageInfo() {
|
||||||
if (messageInfo == null) {
|
if (messageInfo == null) {
|
||||||
MessageLine l = firstLine.prev;
|
MessageLine l = firstLine.prev;
|
||||||
if (l != null && l.isLint()) {
|
while (l != null && (l.isLint() || l.isDiagnosticFlags())) {
|
||||||
l = l.prev;
|
l = l.prev;
|
||||||
}
|
}
|
||||||
if (l != null && l.isInfo())
|
if (l != null && l.isInfo())
|
||||||
@@ -74,7 +75,7 @@ public final class Message {
|
|||||||
while (l.text.isEmpty())
|
while (l.text.isEmpty())
|
||||||
l = l.next;
|
l = l.next;
|
||||||
} else {
|
} else {
|
||||||
if (l.prev != null && (l.prev.isInfo() || l.prev.isLint()))
|
while (l.prev != null && (l.prev.isInfo() || l.prev.isLint() || l.prev.isDiagnosticFlags()))
|
||||||
l = l.prev;
|
l = l.prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
package propertiesparser.parser;
|
package propertiesparser.parser;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -39,6 +40,7 @@ public class MessageLine {
|
|||||||
static final Pattern infoPattern = Pattern.compile(String.format("# ([0-9]+: %s, )*[0-9]+: %s",
|
static final Pattern infoPattern = Pattern.compile(String.format("# ([0-9]+: %s, )*[0-9]+: %s",
|
||||||
typePattern.pattern(), typePattern.pattern()));
|
typePattern.pattern(), typePattern.pattern()));
|
||||||
static final Pattern lintPattern = Pattern.compile("# lint: ([a-z\\-]+)");
|
static final Pattern lintPattern = Pattern.compile("# lint: ([a-z\\-]+)");
|
||||||
|
static final Pattern diagnosticFlagsPattern = Pattern.compile("# flags: ([a-z\\-]+(, ([a-z\\-]+))*)");
|
||||||
|
|
||||||
public String text;
|
public String text;
|
||||||
MessageLine prev;
|
MessageLine prev;
|
||||||
@@ -69,6 +71,19 @@ public class MessageLine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDiagnosticFlags() {
|
||||||
|
return diagnosticFlagsPattern.matcher(text).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] diagnosticFlags() {
|
||||||
|
Matcher matcher = diagnosticFlagsPattern.matcher(text);
|
||||||
|
if (matcher.matches()) {
|
||||||
|
return matcher.group(1).split(", ", -1);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean hasContinuation() {
|
boolean hasContinuation() {
|
||||||
return (next != null) && text.endsWith("\\");
|
return (next != null) && text.endsWith("\\");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -76,7 +76,7 @@ public interface MessageType {
|
|||||||
ANNOTATION("annotation", "Compound", "com.sun.tools.javac.code.Attribute"),
|
ANNOTATION("annotation", "Compound", "com.sun.tools.javac.code.Attribute"),
|
||||||
BOOLEAN("boolean", "boolean", null),
|
BOOLEAN("boolean", "boolean", null),
|
||||||
COLLECTION("collection", "Collection", "java.util"),
|
COLLECTION("collection", "Collection", "java.util"),
|
||||||
FLAG("flag", "Flag", "com.sun.tools.javac.code.Flags"),
|
FLAG("flag", "FlagsEnum", "com.sun.tools.javac.code"),
|
||||||
FRAGMENT("fragment", "Fragment", null),
|
FRAGMENT("fragment", "Fragment", null),
|
||||||
DIAGNOSTIC("diagnostic", "JCDiagnostic", "com.sun.tools.javac.util"),
|
DIAGNOSTIC("diagnostic", "JCDiagnostic", "com.sun.tools.javac.util"),
|
||||||
MODIFIER("modifier", "Modifier", "javax.lang.model.element"),
|
MODIFIER("modifier", "Modifier", "javax.lang.model.element"),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -27,6 +27,7 @@ toplevel.decl=\
|
|||||||
package {0};\n\
|
package {0};\n\
|
||||||
\n\
|
\n\
|
||||||
{1}\n\
|
{1}\n\
|
||||||
|
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;\n\
|
||||||
import com.sun.tools.javac.util.JCDiagnostic.Error;\n\
|
import com.sun.tools.javac.util.JCDiagnostic.Error;\n\
|
||||||
import com.sun.tools.javac.util.JCDiagnostic.Warning;\n\
|
import com.sun.tools.javac.util.JCDiagnostic.Warning;\n\
|
||||||
import com.sun.tools.javac.util.JCDiagnostic.LintWarning;\n\
|
import com.sun.tools.javac.util.JCDiagnostic.LintWarning;\n\
|
||||||
@@ -34,6 +35,10 @@ toplevel.decl=\
|
|||||||
import com.sun.tools.javac.util.JCDiagnostic.Fragment;\n\
|
import com.sun.tools.javac.util.JCDiagnostic.Fragment;\n\
|
||||||
import com.sun.tools.javac.code.Lint.LintCategory;\n\
|
import com.sun.tools.javac.code.Lint.LintCategory;\n\
|
||||||
\n\
|
\n\
|
||||||
|
import java.util.EnumSet;\n\
|
||||||
|
\n\
|
||||||
|
import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*;\n\
|
||||||
|
\n\
|
||||||
public class {2} '{'\n\
|
public class {2} '{'\n\
|
||||||
{3}\n\
|
{3}\n\
|
||||||
'}'\n
|
'}'\n
|
||||||
@@ -58,22 +63,22 @@ factory.decl.method.arg=\
|
|||||||
arg{0}
|
arg{0}
|
||||||
|
|
||||||
factory.decl.method.body=\
|
factory.decl.method.body=\
|
||||||
return new {0}({1}, {2}, {3});
|
return new {0}({1}, {2}, {3}, {4});
|
||||||
|
|
||||||
factory.decl.method.body.lint=\
|
factory.decl.method.body.lint=\
|
||||||
return new {0}({1}, {2}, {3}, {4});
|
return new {0}({1}, {2}, {3}, {4}, {5});
|
||||||
|
|
||||||
factory.decl.field=\
|
factory.decl.field=\
|
||||||
/**\n\
|
/**\n\
|
||||||
' '* {4}\n\
|
' '* {4}\n\
|
||||||
' '*/\n\
|
' '*/\n\
|
||||||
public static final {0} {1} = new {0}({2}, {3});
|
public static final {0} {1} = new {0}({2}, {3}, {4});
|
||||||
|
|
||||||
factory.decl.field.lint=\
|
factory.decl.field.lint=\
|
||||||
/**\n\
|
/**\n\
|
||||||
' '* {5}\n\
|
' '* {5}\n\
|
||||||
' '*/\n\
|
' '*/\n\
|
||||||
public static final {0} {1} = new {0}({2}, {3}, {4});
|
public static final {0} {1} = new {0}({2}, {3}, {4}, {5});
|
||||||
|
|
||||||
wildcards.extends=\
|
wildcards.extends=\
|
||||||
{0}<? extends {1}>
|
{0}<? extends {1}>
|
||||||
@@ -84,3 +89,9 @@ suppress.warnings=\
|
|||||||
lint.category=\
|
lint.category=\
|
||||||
LintCategory.get({0}).get()
|
LintCategory.get({0}).get()
|
||||||
|
|
||||||
|
diagnostic.flags.empty=\
|
||||||
|
EnumSet.noneOf(DiagnosticFlag.class)
|
||||||
|
|
||||||
|
diagnostic.flags.non-empty=\
|
||||||
|
EnumSet.of({0})
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ CLDR_GEN_DONE := $(GENSRC_DIR)/_cldr-gensrc.marker
|
|||||||
TZ_DATA_DIR := $(MODULE_SRC)/share/data/tzdata
|
TZ_DATA_DIR := $(MODULE_SRC)/share/data/tzdata
|
||||||
ZONENAME_TEMPLATE := $(MODULE_SRC)/share/classes/java/time/format/ZoneName.java.template
|
ZONENAME_TEMPLATE := $(MODULE_SRC)/share/classes/java/time/format/ZoneName.java.template
|
||||||
|
|
||||||
|
# The `-utf8` option is used even for US English, as some names
|
||||||
|
# may contain non-ASCII characters, such as “Türkiye”.
|
||||||
$(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
$(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
||||||
$(wildcard $(CLDR_DATA_DIR)/main/en*.xml) \
|
$(wildcard $(CLDR_DATA_DIR)/main/en*.xml) \
|
||||||
$(wildcard $(CLDR_DATA_DIR)/supplemental/*.xml) \
|
$(wildcard $(CLDR_DATA_DIR)/supplemental/*.xml) \
|
||||||
@@ -61,7 +63,8 @@ $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
|||||||
-basemodule \
|
-basemodule \
|
||||||
-year $(COPYRIGHT_YEAR) \
|
-year $(COPYRIGHT_YEAR) \
|
||||||
-zntempfile $(ZONENAME_TEMPLATE) \
|
-zntempfile $(ZONENAME_TEMPLATE) \
|
||||||
-tzdatadir $(TZ_DATA_DIR))
|
-tzdatadir $(TZ_DATA_DIR) \
|
||||||
|
-utf8)
|
||||||
$(TOUCH) $@
|
$(TOUCH) $@
|
||||||
|
|
||||||
TARGETS += $(CLDR_GEN_DONE)
|
TARGETS += $(CLDR_GEN_DONE)
|
||||||
|
|||||||
@@ -50,5 +50,22 @@ TARGETS += $(GENSRC_INDICCONJUNCTBREAK)
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
GENSRC_CASEFOLDING := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/util/regex/CaseFolding.java
|
||||||
|
|
||||||
|
CASEFOLDINGTEMP := $(MODULE_SRC)/share/classes/jdk/internal/util/regex/CaseFolding.java.template
|
||||||
|
CASEFOLDINGTXT := $(MODULE_SRC)/share/data/unicodedata/CaseFolding.txt
|
||||||
|
|
||||||
|
$(GENSRC_CASEFOLDING): $(BUILD_TOOLS_JDK) $(CASEFOLDINGTEMP) $(CASEFOLDINGTXT)
|
||||||
|
$(call LogInfo, Generating $@)
|
||||||
|
$(call MakeTargetDir)
|
||||||
|
$(TOOL_GENERATECASEFOLDING) \
|
||||||
|
$(CASEFOLDINGTEMP) \
|
||||||
|
$(CASEFOLDINGTXT) \
|
||||||
|
$(GENSRC_CASEFOLDING)
|
||||||
|
|
||||||
|
TARGETS += $(GENSRC_CASEFOLDING)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
endif # include guard
|
endif # include guard
|
||||||
include MakeIncludeEnd.gmk
|
include MakeIncludeEnd.gmk
|
||||||
|
|||||||
@@ -177,7 +177,8 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE \
|
LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE \
|
||||||
-DPNG_ARM_NEON_OPT=0 -DPNG_ARM_NEON_IMPLEMENTATION=0
|
-DPNG_ARM_NEON_OPT=0 -DPNG_ARM_NEON_IMPLEMENTATION=0 \
|
||||||
|
-DPNG_LOONGARCH_LSX_OPT=0
|
||||||
|
|
||||||
ifeq ($(call isTargetOs, linux)+$(call isTargetCpuArch, ppc), true+true)
|
ifeq ($(call isTargetOs, linux)+$(call isTargetCpuArch, ppc), true+true)
|
||||||
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
||||||
|
|||||||
@@ -41,17 +41,17 @@ $(eval $(call SetupCompileProperties, COMPILE_PROPERTIES, \
|
|||||||
|
|
||||||
TARGETS += $(COMPILE_PROPERTIES)
|
TARGETS += $(COMPILE_PROPERTIES)
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#
|
|
||||||
# Compile properties files into enum-like classes using the propertiesparser tool
|
|
||||||
#
|
|
||||||
|
|
||||||
# To avoid reevaluating the compilation setup for the tools each time this file
|
# To avoid reevaluating the compilation setup for the tools each time this file
|
||||||
# is included, the following trick is used to be able to declare a dependency on
|
# is included, the following trick is used to be able to declare a dependency on
|
||||||
# the built tools.
|
# the built tools.
|
||||||
BUILD_TOOLS_LANGTOOLS := $(call SetupJavaCompilationCompileTarget, \
|
BUILD_TOOLS_LANGTOOLS := $(call SetupJavaCompilationCompileTarget, \
|
||||||
BUILD_TOOLS_LANGTOOLS, $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes)
|
BUILD_TOOLS_LANGTOOLS, $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Compile properties files into enum-like classes using the propertiesparser tool
|
||||||
|
#
|
||||||
|
|
||||||
TOOL_PARSEPROPERTIES_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes \
|
TOOL_PARSEPROPERTIES_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes \
|
||||||
propertiesparser.PropertiesParser
|
propertiesparser.PropertiesParser
|
||||||
|
|
||||||
@@ -76,3 +76,26 @@ $(eval $(call SetupExecute, PARSEPROPERTIES, \
|
|||||||
TARGETS += $(PARSEPROPERTIES)
|
TARGETS += $(PARSEPROPERTIES)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
#
|
||||||
|
# Generate FlagsEnum from Flags constants
|
||||||
|
#
|
||||||
|
|
||||||
|
TOOL_FLAGSGENERATOR_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes \
|
||||||
|
flagsgenerator.FlagsGenerator
|
||||||
|
|
||||||
|
FLAGS_SRC := \
|
||||||
|
$(MODULE_SRC)/share/classes/com/sun/tools/javac/code/Flags.java
|
||||||
|
|
||||||
|
FLAGS_OUT := \
|
||||||
|
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/com/sun/tools/javac/code/FlagsEnum.java
|
||||||
|
|
||||||
|
$(eval $(call SetupExecute, FLAGSGENERATOR, \
|
||||||
|
WARN := Generating FlagsEnum, \
|
||||||
|
DEPS := $(FLAGS_SRC) $(BUILD_TOOLS_LANGTOOLS), \
|
||||||
|
OUTPUT_FILE := $(FLAGS_OUT), \
|
||||||
|
COMMAND := $(TOOL_FLAGSGENERATOR_CMD) $(FLAGS_SRC) $(FLAGS_OUT), \
|
||||||
|
))
|
||||||
|
|
||||||
|
TARGETS += $(FLAGSGENERATOR)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|||||||
@@ -33,4 +33,6 @@ DISABLED_WARNINGS_java += dangling-doc-comments this-escape
|
|||||||
|
|
||||||
JAVAC_FLAGS += -parameters -XDstringConcat=inline
|
JAVAC_FLAGS += -parameters -XDstringConcat=inline
|
||||||
|
|
||||||
|
TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@@ -121,15 +121,15 @@ ifeq ($(call isTargetOs, windows), true)
|
|||||||
TARGETS += $(BUILD_LIBJPACKAGE)
|
TARGETS += $(BUILD_LIBJPACKAGE)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
## Build libwixhelper
|
## Build libmsica
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Build Wix custom action helper
|
# Build MSI custom action library
|
||||||
# Output library in resources dir, and symbols in the object dir
|
# Output library in resources dir, and symbols in the object dir
|
||||||
$(eval $(call SetupJdkLibrary, BUILD_LIBWIXHELPER, \
|
$(eval $(call SetupJdkLibrary, BUILD_LIBMSICA, \
|
||||||
NAME := wixhelper, \
|
NAME := msica, \
|
||||||
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
|
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
|
||||||
SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libwixhelper, \
|
SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libmsica, \
|
||||||
ONLY_EXPORTED := true, \
|
ONLY_EXPORTED := true, \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
EXTRA_SRC := common, \
|
EXTRA_SRC := common, \
|
||||||
@@ -139,7 +139,7 @@ ifeq ($(call isTargetOs, windows), true)
|
|||||||
LIBS_windows := msi.lib ole32.lib shell32.lib shlwapi.lib user32.lib, \
|
LIBS_windows := msi.lib ole32.lib shell32.lib shlwapi.lib user32.lib, \
|
||||||
))
|
))
|
||||||
|
|
||||||
TARGETS += $(BUILD_LIBWIXHELPER)
|
TARGETS += $(BUILD_LIBMSICA)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
## Build msiwrapper
|
## Build msiwrapper
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
|||||||
-baselocales "en-US" \
|
-baselocales "en-US" \
|
||||||
-year $(COPYRIGHT_YEAR) \
|
-year $(COPYRIGHT_YEAR) \
|
||||||
-o $(GENSRC_DIR) \
|
-o $(GENSRC_DIR) \
|
||||||
-tzdatadir $(TZ_DATA_DIR))
|
-tzdatadir $(TZ_DATA_DIR) \
|
||||||
|
-utf8)
|
||||||
$(TOUCH) $@
|
$(TOUCH) $@
|
||||||
|
|
||||||
TARGETS += $(CLDR_GEN_DONE)
|
TARGETS += $(CLDR_GEN_DONE)
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ $(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
|
|||||||
--add-exports java.base/jdk.internal.classfile.impl=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.classfile.impl=ALL-UNNAMED \
|
||||||
--add-exports java.base/jdk.internal.event=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.event=ALL-UNNAMED \
|
||||||
--add-exports java.base/jdk.internal.foreign=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.foreign=ALL-UNNAMED \
|
||||||
|
--add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \
|
||||||
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
|
||||||
--add-exports java.base/jdk.internal.util=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.util=ALL-UNNAMED \
|
||||||
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
|
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ BUILD_JDK_JTREG_LIBRARIES_JDK_LIBS_libGetXSpace := java.base:libjava
|
|||||||
ifeq ($(call isTargetOs, windows), true)
|
ifeq ($(call isTargetOs, windows), true)
|
||||||
BUILD_JDK_JTREG_EXCLUDE += libDirectIO.c libInheritedChannel.c \
|
BUILD_JDK_JTREG_EXCLUDE += libDirectIO.c libInheritedChannel.c \
|
||||||
libExplicitAttach.c libImplicitAttach.c \
|
libExplicitAttach.c libImplicitAttach.c \
|
||||||
exelauncher.c
|
exelauncher.c libFDLeaker.c exeFDLeakTester.c \
|
||||||
|
libChangeSignalDisposition.c exePrintSignalDisposition.c
|
||||||
|
|
||||||
BUILD_JDK_JTREG_EXECUTABLES_LIBS_exeNullCallerTest := $(LIBCXX)
|
BUILD_JDK_JTREG_EXECUTABLES_LIBS_exeNullCallerTest := $(LIBCXX)
|
||||||
BUILD_JDK_JTREG_EXECUTABLES_LIBS_exerevokeall := advapi32.lib
|
BUILD_JDK_JTREG_EXECUTABLES_LIBS_exerevokeall := advapi32.lib
|
||||||
|
|||||||
@@ -31,10 +31,10 @@
|
|||||||
|
|
||||||
|
|
||||||
ifndef SOURCE
|
ifndef SOURCE
|
||||||
export SOURCE := 7
|
export SOURCE := 8
|
||||||
endif
|
endif
|
||||||
ifndef TARGET
|
ifndef TARGET
|
||||||
export TARGET := 7
|
export TARGET := 8
|
||||||
endif
|
endif
|
||||||
ifndef JAVAC
|
ifndef JAVAC
|
||||||
export JAVAC := javac
|
export JAVAC := javac
|
||||||
|
|||||||
@@ -39,12 +39,12 @@
|
|||||||
<property name="dist" location="dist"/>
|
<property name="dist" location="dist"/>
|
||||||
<property name="resources" location="resources"/>
|
<property name="resources" location="resources"/>
|
||||||
|
|
||||||
<condition property="source" value="7">
|
<condition property="source" value="8">
|
||||||
<not>
|
<not>
|
||||||
<isset property="source"/>
|
<isset property="source"/>
|
||||||
</not>
|
</not>
|
||||||
</condition>
|
</condition>
|
||||||
<condition property="target" value="7">
|
<condition property="target" value="8">
|
||||||
<not>
|
<not>
|
||||||
<isset property="target"/>
|
<isset property="target"/>
|
||||||
</not>
|
</not>
|
||||||
@@ -54,11 +54,6 @@
|
|||||||
<isset property="java"/>
|
<isset property="java"/>
|
||||||
</not>
|
</not>
|
||||||
</condition>
|
</condition>
|
||||||
<condition property="javac" value="javac">
|
|
||||||
<not>
|
|
||||||
<isset property="javac"/>
|
|
||||||
</not>
|
|
||||||
</condition>
|
|
||||||
|
|
||||||
<target name="init">
|
<target name="init">
|
||||||
<!-- Create the time stamp -->
|
<!-- Create the time stamp -->
|
||||||
@@ -70,7 +65,7 @@
|
|||||||
<target name="compile" depends="init"
|
<target name="compile" depends="init"
|
||||||
description="compile the source " >
|
description="compile the source " >
|
||||||
<!-- Compile the java code from ${src} into ${build} -->
|
<!-- Compile the java code from ${src} into ${build} -->
|
||||||
<javac debug="off" source="${source}" target="${target}" srcdir="${src}" destdir="${build}" fork="true" executable="${javac}"/>
|
<javac debug="off" source="${source}" target="${target}" srcdir="${src}" destdir="${build}"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="run" depends="dist"
|
<target name="run" depends="dist"
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public class J2DAnalyzer {
|
|||||||
} else {
|
} else {
|
||||||
double overallscore = totalscore[i]/numtests[i];
|
double overallscore = totalscore[i]/numtests[i];
|
||||||
System.out.println(" Number of tests: "+numtests[i]);
|
System.out.println(" Number of tests: "+numtests[i]);
|
||||||
System.out.println(" Overall average: "+overallscore);
|
System.out.printf( " Overall average: %-10.4f%n", overallscore);
|
||||||
System.out.println(" Best spread: "+bestspread[i]+
|
System.out.println(" Best spread: "+bestspread[i]+
|
||||||
"% variance");
|
"% variance");
|
||||||
System.out.println(" Worst spread: "+worstspread[i]+
|
System.out.println(" Worst spread: "+worstspread[i]+
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ public class RunWindow extends JPanel implements Runnable, ActionListener {
|
|||||||
/**
|
/**
|
||||||
* This class contains initial values for instance variables of 'RunWindow' class,
|
* This class contains initial values for instance variables of 'RunWindow' class,
|
||||||
* and its instance is used in creation of 'RunWindow' object. Values parsed from
|
* and its instance is used in creation of 'RunWindow' object. Values parsed from
|
||||||
* certain command line options of the demo or from the demo applet parameters are
|
* certain command line options of the demo
|
||||||
* set to the fields of this class instance. It is a part of the fix which changed
|
* set to the fields of this class instance. It is a part of the fix which changed
|
||||||
* static variables for instance variables in certain demo classes.
|
* static variables for instance variables in certain demo classes.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -406,13 +406,6 @@ public final class Tools extends JPanel implements ActionListener,
|
|||||||
if (pDialogState) {
|
if (pDialogState) {
|
||||||
printJob.print(aset);
|
printJob.print(aset);
|
||||||
}
|
}
|
||||||
} catch (@SuppressWarnings("removal") java.security.AccessControlException ace) {
|
|
||||||
String errmsg = "Applet access control exception; to allow "
|
|
||||||
+ "access to printer, set\n"
|
|
||||||
+ "permission for \"queuePrintJob\" in "
|
|
||||||
+ "RuntimePermission.";
|
|
||||||
JOptionPane.showMessageDialog(this, errmsg, "Printer Access Error",
|
|
||||||
JOptionPane.ERROR_MESSAGE);
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.getLogger(Tools.class.getName()).log(Level.SEVERE,
|
Logger.getLogger(Tools.class.getName()).log(Level.SEVERE,
|
||||||
null, ex);
|
null, ex);
|
||||||
|
|||||||
@@ -187,22 +187,18 @@ public class HelloWorld {
|
|||||||
new Run("none", "Hello from Cupertino")
|
new Run("none", "Hello from Cupertino")
|
||||||
}),
|
}),
|
||||||
new Paragraph("title", new Run[] {
|
new Paragraph("title", new Run[] {
|
||||||
new Run("none", "\u53F0\u5317\u554F\u5019\u60A8\u0021")
|
new Run("none", "台北問候您!")
|
||||||
}),
|
}),
|
||||||
new Paragraph("title", new Run[] {
|
new Paragraph("title", new Run[] {
|
||||||
new Run("none", "\u0391\u03B8\u03B7\u03BD\u03B1\u03B9\u0020" // Greek
|
new Run("none", "Αθηναι ασπαζονται υμας!") // Greek
|
||||||
+ "\u03B1\u03C3\u03C0\u03B1\u03B6\u03BF\u03BD"
|
|
||||||
+ "\u03C4\u03B1\u03B9\u0020\u03C5\u03BC\u03B1"
|
|
||||||
+ "\u03C2\u0021")
|
|
||||||
}),
|
}),
|
||||||
new Paragraph("title", new Run[] {
|
new Paragraph("title", new Run[] {
|
||||||
new Run("none", "\u6771\u4eac\u304b\u3089\u4eca\u65e5\u306f")
|
new Run("none", "東京から今日は")
|
||||||
}),
|
}),
|
||||||
new Paragraph("title", new Run[] {
|
new Paragraph("title", new Run[] {
|
||||||
new Run("none", "\u05e9\u05dc\u05d5\u05dd \u05de\u05d9\u05e8\u05d5"
|
new Run("none", "שלום מירושלים")
|
||||||
+ "\u05e9\u05dc\u05d9\u05dd")
|
|
||||||
}),
|
}),
|
||||||
new Paragraph("title", new Run[] {
|
new Paragraph("title", new Run[] {
|
||||||
new Run("none", "\u0633\u0644\u0627\u0645")
|
new Run("none", "سلام")
|
||||||
}), };
|
}), };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ public class SwingSet2 extends JPanel {
|
|||||||
private JEditorPane demoSrcPane = null;
|
private JEditorPane demoSrcPane = null;
|
||||||
|
|
||||||
|
|
||||||
// contentPane cache, saved from the applet or application frame
|
// contentPane cache, saved from the application frame
|
||||||
Container contentPane = null;
|
Container contentPane = null;
|
||||||
|
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ public class SwingSet2 extends JPanel {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SwingSet2 Main. Called only if we're an application, not an applet.
|
* SwingSet2 Main.
|
||||||
*/
|
*/
|
||||||
public static void main(final String[] args) {
|
public static void main(final String[] args) {
|
||||||
// must run in EDT when constructing the GUI components
|
// must run in EDT when constructing the GUI components
|
||||||
@@ -716,8 +716,7 @@ public class SwingSet2 extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the content pane whether we're in an applet
|
* Returns the content pane
|
||||||
* or application
|
|
||||||
*/
|
*/
|
||||||
public Container getContentPane() {
|
public Container getContentPane() {
|
||||||
if(contentPane == null) {
|
if(contentPane == null) {
|
||||||
|
|||||||
@@ -456,13 +456,13 @@ SliderDemo.horizontal=Horizontal
|
|||||||
SliderDemo.vertical=Vertikal
|
SliderDemo.vertical=Vertikal
|
||||||
SliderDemo.plain=Einfach
|
SliderDemo.plain=Einfach
|
||||||
SliderDemo.a_plain_slider=Ein einfacher Schieberegler
|
SliderDemo.a_plain_slider=Ein einfacher Schieberegler
|
||||||
SliderDemo.majorticks=Grobteilungen
|
SliderDemo.majorticks=Hauptteilstriche
|
||||||
SliderDemo.majorticksdescription=Ein Schieberegler mit Grobteilungsmarkierungen
|
SliderDemo.majorticksdescription=Ein Schieberegler mit Hauptteilstrichen
|
||||||
SliderDemo.ticks=Feinteilungen, Teilungen zum Einrasten und Labels
|
SliderDemo.ticks=Hilfsteilstriche, zum Einrasten und Beschriften
|
||||||
SliderDemo.minorticks=Feinteilungen
|
SliderDemo.minorticks=Hilfsteilstriche
|
||||||
SliderDemo.minorticksdescription=Ein Schieberegler mit Grob- und Feinteilungen, mit Teilungen, in die der Schieberegler einrastet, wobei einige Teilungen mit einem sichtbaren Label versehen sind
|
SliderDemo.minorticksdescription=Ein Schieberegler mit Haupt- und Hilfsteilstrichen, in die der Schieberegler einrastet, wobei einige Teilstriche mit einer sichtbaren Beschriftung versehen sind
|
||||||
SliderDemo.disabled=Deaktiviert
|
SliderDemo.disabled=Deaktiviert
|
||||||
SliderDemo.disableddescription=Ein Schieberegler mit Grob- und Feinteilungen, der nicht aktiviert ist (kann nicht bearbeitet werden)
|
SliderDemo.disableddescription=Ein Schieberegler mit Haupt- und Hilfsteilstrichen, der nicht aktiviert ist (kann nicht bearbeitet werden)
|
||||||
|
|
||||||
### SplitPane Demo ###
|
### SplitPane Demo ###
|
||||||
|
|
||||||
|
|||||||
@@ -881,6 +881,46 @@ reg_class vectorx_reg(
|
|||||||
V31, V31_H, V31_J, V31_K
|
V31, V31_H, V31_J, V31_K
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Class for vector register V10
|
||||||
|
reg_class v10_veca_reg(
|
||||||
|
V10, V10_H, V10_J, V10_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V11
|
||||||
|
reg_class v11_veca_reg(
|
||||||
|
V11, V11_H, V11_J, V11_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V12
|
||||||
|
reg_class v12_veca_reg(
|
||||||
|
V12, V12_H, V12_J, V12_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V13
|
||||||
|
reg_class v13_veca_reg(
|
||||||
|
V13, V13_H, V13_J, V13_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V17
|
||||||
|
reg_class v17_veca_reg(
|
||||||
|
V17, V17_H, V17_J, V17_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V18
|
||||||
|
reg_class v18_veca_reg(
|
||||||
|
V18, V18_H, V18_J, V18_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V23
|
||||||
|
reg_class v23_veca_reg(
|
||||||
|
V23, V23_H, V23_J, V23_K
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for vector register V24
|
||||||
|
reg_class v24_veca_reg(
|
||||||
|
V24, V24_H, V24_J, V24_K
|
||||||
|
);
|
||||||
|
|
||||||
// Class for 128 bit register v0
|
// Class for 128 bit register v0
|
||||||
reg_class v0_reg(
|
reg_class v0_reg(
|
||||||
V0, V0_H
|
V0, V0_H
|
||||||
@@ -1765,10 +1805,6 @@ void MachPrologNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const {
|
|||||||
// n.b. frame size includes space for return pc and rfp
|
// n.b. frame size includes space for return pc and rfp
|
||||||
const int framesize = C->output()->frame_size_in_bytes();
|
const int framesize = C->output()->frame_size_in_bytes();
|
||||||
|
|
||||||
// insert a nop at the start of the prolog so we can patch in a
|
|
||||||
// branch if we need to invalidate the method later
|
|
||||||
__ nop();
|
|
||||||
|
|
||||||
if (C->clinit_barrier_on_entry()) {
|
if (C->clinit_barrier_on_entry()) {
|
||||||
assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started");
|
assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started");
|
||||||
|
|
||||||
@@ -1888,7 +1924,7 @@ void MachEpilogNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const {
|
|||||||
code_stub = &stub->entry();
|
code_stub = &stub->entry();
|
||||||
}
|
}
|
||||||
__ relocate(relocInfo::poll_return_type);
|
__ relocate(relocInfo::poll_return_type);
|
||||||
__ safepoint_poll(*code_stub, true /* at_return */, false /* acquire */, true /* in_nmethod */);
|
__ safepoint_poll(*code_stub, true /* at_return */, true /* in_nmethod */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2366,17 +2402,34 @@ int Matcher::max_vector_size(const BasicType bt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Matcher::min_vector_size(const BasicType bt) {
|
int Matcher::min_vector_size(const BasicType bt) {
|
||||||
int max_size = max_vector_size(bt);
|
// Usually, the shortest vector length supported by AArch64 ISA and
|
||||||
// Limit the min vector size to 8 bytes.
|
// Vector API species is 64 bits. However, we allow 32-bit or 16-bit
|
||||||
int size = 8 / type2aelembytes(bt);
|
// vectors in a few special cases.
|
||||||
if (bt == T_BYTE) {
|
int size;
|
||||||
// To support vector api shuffle/rearrange.
|
switch(bt) {
|
||||||
size = 4;
|
case T_BOOLEAN:
|
||||||
} else if (bt == T_BOOLEAN) {
|
// Load/store a vector mask with only 2 elements for vector types
|
||||||
// To support vector api load/store mask.
|
// such as "2I/2F/2L/2D".
|
||||||
size = 2;
|
size = 2;
|
||||||
|
break;
|
||||||
|
case T_BYTE:
|
||||||
|
// Generate a "4B" vector, to support vector cast between "8B/16B"
|
||||||
|
// and "4S/4I/4L/4F/4D".
|
||||||
|
size = 4;
|
||||||
|
break;
|
||||||
|
case T_SHORT:
|
||||||
|
// Generate a "2S" vector, to support vector cast between "4S/8S"
|
||||||
|
// and "2I/2L/2F/2D".
|
||||||
|
size = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Limit the min vector length to 64-bit.
|
||||||
|
size = 8 / type2aelembytes(bt);
|
||||||
|
// The number of elements in a vector should be at least 2.
|
||||||
|
size = MAX2(size, 2);
|
||||||
}
|
}
|
||||||
if (size < 2) size = 2;
|
|
||||||
|
int max_size = max_vector_size(bt);
|
||||||
return MIN2(size, max_size);
|
return MIN2(size, max_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3454,10 +3507,6 @@ encode %{
|
|||||||
__ mov(dst_reg, (uint64_t)1);
|
__ mov(dst_reg, (uint64_t)1);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
enc_class aarch64_enc_mov_byte_map_base(iRegP dst, immByteMapBase src) %{
|
|
||||||
__ load_byte_map_base($dst$$Register);
|
|
||||||
%}
|
|
||||||
|
|
||||||
enc_class aarch64_enc_mov_n(iRegN dst, immN src) %{
|
enc_class aarch64_enc_mov_n(iRegN dst, immN src) %{
|
||||||
Register dst_reg = as_Register($dst$$reg);
|
Register dst_reg = as_Register($dst$$reg);
|
||||||
address con = (address)$src$$constant;
|
address con = (address)$src$$constant;
|
||||||
@@ -3921,6 +3970,10 @@ ins_attrib ins_alignment(4); // Required alignment attribute (must
|
|||||||
// compute_padding() function must be
|
// compute_padding() function must be
|
||||||
// provided for the instruction
|
// provided for the instruction
|
||||||
|
|
||||||
|
// Whether this node is expanded during code emission into a sequence of
|
||||||
|
// instructions and the first instruction can perform an implicit null check.
|
||||||
|
ins_attrib ins_is_late_expanded_null_check_candidate(false);
|
||||||
|
|
||||||
//----------OPERANDS-----------------------------------------------------------
|
//----------OPERANDS-----------------------------------------------------------
|
||||||
// Operand definitions must precede instruction definitions for correct parsing
|
// Operand definitions must precede instruction definitions for correct parsing
|
||||||
// in the ADLC because operands constitute user defined types which are used in
|
// in the ADLC because operands constitute user defined types which are used in
|
||||||
@@ -4554,20 +4607,6 @@ operand immP_1()
|
|||||||
interface(CONST_INTER);
|
interface(CONST_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
// Card Table Byte Map Base
|
|
||||||
operand immByteMapBase()
|
|
||||||
%{
|
|
||||||
// Get base of card map
|
|
||||||
predicate(BarrierSet::barrier_set()->is_a(BarrierSet::CardTableBarrierSet) &&
|
|
||||||
SHENANDOAHGC_ONLY(!BarrierSet::barrier_set()->is_a(BarrierSet::ShenandoahBarrierSet) &&)
|
|
||||||
(CardTable::CardValue*)n->get_ptr() == ((CardTableBarrierSet*)(BarrierSet::barrier_set()))->card_table()->byte_map_base());
|
|
||||||
match(ConP);
|
|
||||||
|
|
||||||
op_cost(0);
|
|
||||||
format %{ %}
|
|
||||||
interface(CONST_INTER);
|
|
||||||
%}
|
|
||||||
|
|
||||||
// Float and Double operands
|
// Float and Double operands
|
||||||
// Double Immediate
|
// Double Immediate
|
||||||
operand immD()
|
operand immD()
|
||||||
@@ -4970,6 +5009,86 @@ operand vReg()
|
|||||||
interface(REG_INTER);
|
interface(REG_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
operand vReg_V10()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v10_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V11()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v11_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V12()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v12_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V13()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v13_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V17()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v17_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V18()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v18_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V23()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v23_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vReg_V24()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v24_veca_reg));
|
||||||
|
match(vReg);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
operand vecA()
|
operand vecA()
|
||||||
%{
|
%{
|
||||||
constraint(ALLOC_IN_RC(vectora_reg));
|
constraint(ALLOC_IN_RC(vectora_reg));
|
||||||
@@ -6854,20 +6973,6 @@ instruct loadConP1(iRegPNoSp dst, immP_1 con)
|
|||||||
ins_pipe(ialu_imm);
|
ins_pipe(ialu_imm);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
// Load Byte Map Base Constant
|
|
||||||
|
|
||||||
instruct loadByteMapBase(iRegPNoSp dst, immByteMapBase con)
|
|
||||||
%{
|
|
||||||
match(Set dst con);
|
|
||||||
|
|
||||||
ins_cost(INSN_COST);
|
|
||||||
format %{ "adr $dst, $con\t# Byte Map Base" %}
|
|
||||||
|
|
||||||
ins_encode(aarch64_enc_mov_byte_map_base(dst, con));
|
|
||||||
|
|
||||||
ins_pipe(ialu_imm);
|
|
||||||
%}
|
|
||||||
|
|
||||||
// Load Narrow Pointer Constant
|
// Load Narrow Pointer Constant
|
||||||
|
|
||||||
instruct loadConN(iRegNNoSp dst, immN con)
|
instruct loadConN(iRegNNoSp dst, immN con)
|
||||||
@@ -16176,41 +16281,8 @@ instruct branchLoopEnd(cmpOp cmp, rFlagsReg cr, label lbl)
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
// inlined locking and unlocking
|
// inlined locking and unlocking
|
||||||
|
|
||||||
instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
|
||||||
%{
|
|
||||||
predicate(LockingMode != LM_LIGHTWEIGHT);
|
|
||||||
match(Set cr (FastLock object box));
|
|
||||||
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
|
||||||
|
|
||||||
ins_cost(5 * INSN_COST);
|
|
||||||
format %{ "fastlock $object,$box\t! kills $tmp,$tmp2,$tmp3" %}
|
|
||||||
|
|
||||||
ins_encode %{
|
|
||||||
__ fast_lock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register);
|
|
||||||
%}
|
|
||||||
|
|
||||||
ins_pipe(pipe_serial);
|
|
||||||
%}
|
|
||||||
|
|
||||||
instruct cmpFastUnlock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2)
|
|
||||||
%{
|
|
||||||
predicate(LockingMode != LM_LIGHTWEIGHT);
|
|
||||||
match(Set cr (FastUnlock object box));
|
|
||||||
effect(TEMP tmp, TEMP tmp2);
|
|
||||||
|
|
||||||
ins_cost(5 * INSN_COST);
|
|
||||||
format %{ "fastunlock $object,$box\t! kills $tmp, $tmp2" %}
|
|
||||||
|
|
||||||
ins_encode %{
|
|
||||||
__ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register);
|
|
||||||
%}
|
|
||||||
|
|
||||||
ins_pipe(pipe_serial);
|
|
||||||
%}
|
|
||||||
|
|
||||||
instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
||||||
%{
|
%{
|
||||||
predicate(LockingMode == LM_LIGHTWEIGHT);
|
|
||||||
match(Set cr (FastLock object box));
|
match(Set cr (FastLock object box));
|
||||||
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
||||||
|
|
||||||
@@ -16226,7 +16298,6 @@ instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp
|
|||||||
|
|
||||||
instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
||||||
%{
|
%{
|
||||||
predicate(LockingMode == LM_LIGHTWEIGHT);
|
|
||||||
match(Set cr (FastUnlock object box));
|
match(Set cr (FastUnlock object box));
|
||||||
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ source %{
|
|||||||
// These operations are not profitable to be vectorized on NEON, because no direct
|
// 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
|
// NEON instructions support them. But the match rule support for them is profitable for
|
||||||
// Vector API intrinsics.
|
// Vector API intrinsics.
|
||||||
if ((opcode == Op_VectorCastD2X && bt == T_INT) ||
|
if ((opcode == Op_VectorCastD2X && (bt == T_INT || bt == T_SHORT)) ||
|
||||||
(opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
|
(opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
|
||||||
(opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
|
(opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
|
||||||
(opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
|
(opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
|
||||||
@@ -189,6 +189,18 @@ source %{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Op_AddReductionVI:
|
||||||
|
case Op_AndReductionV:
|
||||||
|
case Op_OrReductionV:
|
||||||
|
case Op_XorReductionV:
|
||||||
|
case Op_MinReductionV:
|
||||||
|
case Op_MaxReductionV:
|
||||||
|
// Reductions with less than 8 bytes vector length are
|
||||||
|
// not supported.
|
||||||
|
if (length_in_bytes < 8) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Op_MulReductionVD:
|
case Op_MulReductionVD:
|
||||||
case Op_MulReductionVF:
|
case Op_MulReductionVF:
|
||||||
case Op_MulReductionVI:
|
case Op_MulReductionVI:
|
||||||
@@ -245,6 +257,28 @@ source %{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Op_SelectFromTwoVector:
|
||||||
|
// The "tbl" instruction for two vector table is supported only in Neon and SVE2. Return
|
||||||
|
// false if vector length > 16B but supported SVE version < 2.
|
||||||
|
// For vector length of 16B, generate SVE2 "tbl" instruction if SVE2 is supported, else
|
||||||
|
// generate Neon "tbl" instruction to select from two vectors.
|
||||||
|
// This operation is disabled for doubles and longs on machines with SVE < 2 and instead
|
||||||
|
// the default VectorRearrange + VectorBlend is generated because the performance of the default
|
||||||
|
// implementation was better than or equal to the implementation for SelectFromTwoVector.
|
||||||
|
if (UseSVE < 2 && (type2aelembytes(bt) == 8 || length_in_bytes > 16)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Because the SVE2 "tbl" instruction is unpredicated and partial operations cannot be generated
|
||||||
|
// using masks, we disable this operation on machines where length_in_bytes < MaxVectorSize
|
||||||
|
// on that machine with the only exception of 8B vector length. This is because at the time of
|
||||||
|
// writing this, there is no SVE2 machine available with length_in_bytes > 8 and
|
||||||
|
// length_in_bytes < MaxVectorSize to test this operation on (for example - there isn't an
|
||||||
|
// SVE2 machine available with MaxVectorSize = 32 to test a case with length_in_bytes = 16).
|
||||||
|
if (UseSVE == 2 && length_in_bytes > 8 && length_in_bytes < MaxVectorSize) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -4244,8 +4278,8 @@ instruct vzeroExtStoX(vReg dst, vReg src) %{
|
|||||||
assert(bt == T_INT || bt == T_LONG, "must be");
|
assert(bt == T_INT || bt == T_LONG, "must be");
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 4S to 4I
|
// 2S to 2I/2L, 4S to 4I
|
||||||
__ neon_vector_extend($dst$$FloatRegister, T_INT, length_in_bytes,
|
__ neon_vector_extend($dst$$FloatRegister, bt, length_in_bytes,
|
||||||
$src$$FloatRegister, T_SHORT, /* is_unsigned */ true);
|
$src$$FloatRegister, T_SHORT, /* is_unsigned */ true);
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
@@ -4265,11 +4299,11 @@ instruct vzeroExtItoX(vReg dst, vReg src) %{
|
|||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 2I to 2L
|
// 2I to 2L
|
||||||
__ neon_vector_extend($dst$$FloatRegister, T_LONG, length_in_bytes,
|
__ neon_vector_extend($dst$$FloatRegister, bt, length_in_bytes,
|
||||||
$src$$FloatRegister, T_INT, /* is_unsigned */ true);
|
$src$$FloatRegister, T_INT, /* is_unsigned */ true);
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
__ sve_vector_extend($dst$$FloatRegister, __ D,
|
__ sve_vector_extend($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
||||||
$src$$FloatRegister, __ S, /* is_unsigned */ true);
|
$src$$FloatRegister, __ S, /* is_unsigned */ true);
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
@@ -4343,11 +4377,15 @@ instruct vcvtStoX_extend(vReg dst, vReg src) %{
|
|||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 4S to 4I/4F
|
if (is_floating_point_type(bt)) {
|
||||||
__ neon_vector_extend($dst$$FloatRegister, T_INT, length_in_bytes,
|
// 2S to 2F/2D, 4S to 4F
|
||||||
$src$$FloatRegister, T_SHORT);
|
__ neon_vector_extend($dst$$FloatRegister, bt == T_FLOAT ? T_INT : T_LONG,
|
||||||
if (bt == T_FLOAT) {
|
length_in_bytes, $src$$FloatRegister, T_SHORT);
|
||||||
__ scvtfv(__ T4S, $dst$$FloatRegister, $dst$$FloatRegister);
|
__ scvtfv(get_arrangement(this), $dst$$FloatRegister, $dst$$FloatRegister);
|
||||||
|
} else {
|
||||||
|
// 2S to 2I/2L, 4S to 4I
|
||||||
|
__ neon_vector_extend($dst$$FloatRegister, bt, length_in_bytes,
|
||||||
|
$src$$FloatRegister, T_SHORT);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
@@ -4371,7 +4409,7 @@ instruct vcvtItoX_narrow_neon(vReg dst, vReg src) %{
|
|||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtItoX_narrow_neon $dst, $src" %}
|
format %{ "vcvtItoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4I to 4B/4S
|
// 2I to 2S, 4I to 4B/4S
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
@@ -4434,28 +4472,29 @@ instruct vcvtItoX(vReg dst, vReg src) %{
|
|||||||
|
|
||||||
// VectorCastL2X
|
// VectorCastL2X
|
||||||
|
|
||||||
instruct vcvtLtoI_neon(vReg dst, vReg src) %{
|
instruct vcvtLtoX_narrow_neon(vReg dst, vReg src) %{
|
||||||
predicate(Matcher::vector_element_basic_type(n) == T_INT &&
|
predicate((Matcher::vector_element_basic_type(n) == T_INT ||
|
||||||
|
Matcher::vector_element_basic_type(n) == T_SHORT) &&
|
||||||
VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
||||||
match(Set dst (VectorCastL2X src));
|
match(Set dst (VectorCastL2X src));
|
||||||
format %{ "vcvtLtoI_neon $dst, $src" %}
|
format %{ "vcvtLtoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 2L to 2I
|
// 2L to 2S/2I
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, T_INT,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
$src$$FloatRegister, T_LONG, length_in_bytes);
|
$src$$FloatRegister, T_LONG, length_in_bytes);
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct vcvtLtoI_sve(vReg dst, vReg src, vReg tmp) %{
|
instruct vcvtLtoX_narrow_sve(vReg dst, vReg src, vReg tmp) %{
|
||||||
predicate((Matcher::vector_element_basic_type(n) == T_INT &&
|
predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))) &&
|
||||||
!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1)))) ||
|
!is_floating_point_type(Matcher::vector_element_basic_type(n)) &&
|
||||||
Matcher::vector_element_basic_type(n) == T_BYTE ||
|
type2aelembytes(Matcher::vector_element_basic_type(n)) <= 4);
|
||||||
Matcher::vector_element_basic_type(n) == T_SHORT);
|
|
||||||
match(Set dst (VectorCastL2X src));
|
match(Set dst (VectorCastL2X src));
|
||||||
effect(TEMP_DEF dst, TEMP tmp);
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
format %{ "vcvtLtoI_sve $dst, $src\t# KILL $tmp" %}
|
format %{ "vcvtLtoX_narrow_sve $dst, $src\t# KILL $tmp" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
@@ -4521,10 +4560,11 @@ instruct vcvtFtoX_narrow_neon(vReg dst, vReg src) %{
|
|||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtFtoX_narrow_neon $dst, $src" %}
|
format %{ "vcvtFtoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4F to 4B/4S
|
// 2F to 2S, 4F to 4B/4S
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ fcvtzs($dst$$FloatRegister, __ T4S, $src$$FloatRegister);
|
__ fcvtzs($dst$$FloatRegister, length_in_bytes == 16 ? __ T4S : __ T2S,
|
||||||
|
$src$$FloatRegister);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
$dst$$FloatRegister, T_INT, length_in_bytes);
|
$dst$$FloatRegister, T_INT, length_in_bytes);
|
||||||
%}
|
%}
|
||||||
@@ -4590,12 +4630,14 @@ instruct vcvtFtoX(vReg dst, vReg src) %{
|
|||||||
// VectorCastD2X
|
// VectorCastD2X
|
||||||
|
|
||||||
instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
||||||
predicate(UseSVE == 0 && Matcher::vector_element_basic_type(n) == T_INT);
|
predicate(UseSVE == 0 &&
|
||||||
|
(Matcher::vector_element_basic_type(n) == T_INT ||
|
||||||
|
Matcher::vector_element_basic_type(n) == T_SHORT));
|
||||||
match(Set dst (VectorCastD2X src));
|
match(Set dst (VectorCastD2X src));
|
||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtDtoI_neon $dst, $src\t# 2D to 2I" %}
|
format %{ "vcvtDtoI_neon $dst, $src\t# 2D to 2S/2I" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 2D to 2I
|
// 2D to 2S/2I
|
||||||
__ ins($dst$$FloatRegister, __ D, $src$$FloatRegister, 0, 1);
|
__ ins($dst$$FloatRegister, __ D, $src$$FloatRegister, 0, 1);
|
||||||
// We can't use fcvtzs(vector, integer) instruction here because we need
|
// We can't use fcvtzs(vector, integer) instruction here because we need
|
||||||
// saturation arithmetic. See JDK-8276151.
|
// saturation arithmetic. See JDK-8276151.
|
||||||
@@ -4603,6 +4645,10 @@ instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
|||||||
__ fcvtzdw(rscratch2, $dst$$FloatRegister);
|
__ fcvtzdw(rscratch2, $dst$$FloatRegister);
|
||||||
__ fmovs($dst$$FloatRegister, rscratch1);
|
__ fmovs($dst$$FloatRegister, rscratch1);
|
||||||
__ mov($dst$$FloatRegister, __ S, 1, rscratch2);
|
__ mov($dst$$FloatRegister, __ S, 1, rscratch2);
|
||||||
|
if (Matcher::vector_element_basic_type(this) == T_SHORT) {
|
||||||
|
__ neon_vector_narrow($dst$$FloatRegister, T_SHORT,
|
||||||
|
$dst$$FloatRegister, T_INT, 8);
|
||||||
|
}
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
@@ -4676,7 +4722,7 @@ instruct vcvtHFtoF(vReg dst, vReg src) %{
|
|||||||
ins_encode %{
|
ins_encode %{
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 4HF to 4F
|
// 2HF to 2F, 4HF to 4F
|
||||||
__ fcvtl($dst$$FloatRegister, __ T4S, $src$$FloatRegister, __ T4H);
|
__ fcvtl($dst$$FloatRegister, __ T4S, $src$$FloatRegister, __ T4H);
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
@@ -4692,9 +4738,9 @@ instruct vcvtHFtoF(vReg dst, vReg src) %{
|
|||||||
instruct vcvtFtoHF_neon(vReg dst, vReg src) %{
|
instruct vcvtFtoHF_neon(vReg dst, vReg src) %{
|
||||||
predicate(VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
predicate(VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
||||||
match(Set dst (VectorCastF2HF src));
|
match(Set dst (VectorCastF2HF src));
|
||||||
format %{ "vcvtFtoHF_neon $dst, $src\t# 4F to 4HF" %}
|
format %{ "vcvtFtoHF_neon $dst, $src\t# 2F/4F to 2HF/4HF" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4F to 4HF
|
// 2F to 2HF, 4F to 4HF
|
||||||
__ fcvtn($dst$$FloatRegister, __ T4H, $src$$FloatRegister, __ T4S);
|
__ fcvtn($dst$$FloatRegister, __ T4H, $src$$FloatRegister, __ T4S);
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
@@ -6396,14 +6442,12 @@ instruct vpopcountI(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT, "unsupported");
|
assert(bt == T_SHORT || bt == T_INT, "unsupported");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ cnt($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
bool isQ = length_in_bytes == 16;
|
||||||
$src$$FloatRegister);
|
__ cnt($dst$$FloatRegister, isQ ? __ T16B : __ T8B, $src$$FloatRegister);
|
||||||
__ uaddlp($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ uaddlp($dst$$FloatRegister, isQ ? __ T16B : __ T8B, $dst$$FloatRegister);
|
||||||
$dst$$FloatRegister);
|
|
||||||
if (bt == T_INT) {
|
if (bt == T_INT) {
|
||||||
__ uaddlp($dst$$FloatRegister, length_in_bytes == 16 ? __ T8H : __ T4H,
|
__ uaddlp($dst$$FloatRegister, isQ ? __ T8H : __ T4H, $dst$$FloatRegister);
|
||||||
$dst$$FloatRegister);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
__ sve_cnt($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
__ sve_cnt($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
||||||
@@ -6465,7 +6509,7 @@ instruct vblend_neon(vReg dst, vReg src1, vReg src2) %{
|
|||||||
format %{ "vblend_neon $dst, $src1, $src2" %}
|
format %{ "vblend_neon $dst, $src1, $src2" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "must be");
|
assert(length_in_bytes <= 16, "must be");
|
||||||
__ bsl($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ bsl($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
||||||
$src2$$FloatRegister, $src1$$FloatRegister);
|
$src2$$FloatRegister, $src1$$FloatRegister);
|
||||||
%}
|
%}
|
||||||
@@ -6852,7 +6896,7 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
||||||
bt, /* isQ */ length_in_bytes == 16);
|
bt, /* isQ */ length_in_bytes == 16);
|
||||||
if (bt != T_LONG) {
|
if (bt != T_LONG) {
|
||||||
@@ -6911,7 +6955,7 @@ instruct vreverse(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
||||||
bt, /* isQ */ length_in_bytes == 16);
|
bt, /* isQ */ length_in_bytes == 16);
|
||||||
} else {
|
} else {
|
||||||
@@ -6947,7 +6991,7 @@ instruct vreverseBytes(vReg dst, vReg src) %{
|
|||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
if (bt == T_BYTE) {
|
if (bt == T_BYTE) {
|
||||||
if ($dst$$FloatRegister != $src$$FloatRegister) {
|
if ($dst$$FloatRegister != $src$$FloatRegister) {
|
||||||
__ orr($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ orr($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
||||||
@@ -7150,3 +7194,71 @@ instruct vexpandBits(vReg dst, vReg src1, vReg src2) %{
|
|||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
// ------------------------------------- SelectFromTwoVector ------------------------------------
|
||||||
|
// The Neon and SVE2 tbl instruction for two vector lookup requires both the source vectors to be
|
||||||
|
// consecutive. The match rules for SelectFromTwoVector reserve two consecutive vector registers
|
||||||
|
// for src1 and src2.
|
||||||
|
// Four combinations of vector registers for vselect_from_two_vectors are chosen at random
|
||||||
|
// (two from volatile and two from non-volatile set) which gives more freedom to the register
|
||||||
|
// allocator to choose the best pair of source registers at that point.
|
||||||
|
|
||||||
|
instruct vselect_from_two_vectors_10_11(vReg dst, vReg_V10 src1, vReg_V11 src2,
|
||||||
|
vReg index, vReg tmp) %{
|
||||||
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
|
match(Set dst (SelectFromTwoVector (Binary index src1) src2));
|
||||||
|
format %{ "vselect_from_two_vectors_10_11 $dst, $src1, $src2, $index\t# KILL $tmp" %}
|
||||||
|
ins_encode %{
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
|
__ select_from_two_vectors($dst$$FloatRegister, $src1$$FloatRegister,
|
||||||
|
$src2$$FloatRegister, $index$$FloatRegister,
|
||||||
|
$tmp$$FloatRegister, bt, length_in_bytes);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct vselect_from_two_vectors_12_13(vReg dst, vReg_V12 src1, vReg_V13 src2,
|
||||||
|
vReg index, vReg tmp) %{
|
||||||
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
|
match(Set dst (SelectFromTwoVector (Binary index src1) src2));
|
||||||
|
format %{ "vselect_from_two_vectors_12_13 $dst, $src1, $src2, $index\t# KILL $tmp" %}
|
||||||
|
ins_encode %{
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
|
__ select_from_two_vectors($dst$$FloatRegister, $src1$$FloatRegister,
|
||||||
|
$src2$$FloatRegister, $index$$FloatRegister,
|
||||||
|
$tmp$$FloatRegister, bt, length_in_bytes);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct vselect_from_two_vectors_17_18(vReg dst, vReg_V17 src1, vReg_V18 src2,
|
||||||
|
vReg index, vReg tmp) %{
|
||||||
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
|
match(Set dst (SelectFromTwoVector (Binary index src1) src2));
|
||||||
|
format %{ "vselect_from_two_vectors_17_18 $dst, $src1, $src2, $index\t# KILL $tmp" %}
|
||||||
|
ins_encode %{
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
|
__ select_from_two_vectors($dst$$FloatRegister, $src1$$FloatRegister,
|
||||||
|
$src2$$FloatRegister, $index$$FloatRegister,
|
||||||
|
$tmp$$FloatRegister, bt, length_in_bytes);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct vselect_from_two_vectors_23_24(vReg dst, vReg_V23 src1, vReg_V24 src2,
|
||||||
|
vReg index, vReg tmp) %{
|
||||||
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
|
match(Set dst (SelectFromTwoVector (Binary index src1) src2));
|
||||||
|
format %{ "vselect_from_two_vectors_23_24 $dst, $src1, $src2, $index\t# KILL $tmp" %}
|
||||||
|
ins_encode %{
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
|
__ select_from_two_vectors($dst$$FloatRegister, $src1$$FloatRegister,
|
||||||
|
$src2$$FloatRegister, $index$$FloatRegister,
|
||||||
|
$tmp$$FloatRegister, bt, length_in_bytes);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ source %{
|
|||||||
// These operations are not profitable to be vectorized on NEON, because no direct
|
// 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
|
// NEON instructions support them. But the match rule support for them is profitable for
|
||||||
// Vector API intrinsics.
|
// Vector API intrinsics.
|
||||||
if ((opcode == Op_VectorCastD2X && bt == T_INT) ||
|
if ((opcode == Op_VectorCastD2X && (bt == T_INT || bt == T_SHORT)) ||
|
||||||
(opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
|
(opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
|
||||||
(opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
|
(opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
|
||||||
(opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
|
(opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
|
||||||
@@ -179,6 +179,18 @@ source %{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Op_AddReductionVI:
|
||||||
|
case Op_AndReductionV:
|
||||||
|
case Op_OrReductionV:
|
||||||
|
case Op_XorReductionV:
|
||||||
|
case Op_MinReductionV:
|
||||||
|
case Op_MaxReductionV:
|
||||||
|
// Reductions with less than 8 bytes vector length are
|
||||||
|
// not supported.
|
||||||
|
if (length_in_bytes < 8) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Op_MulReductionVD:
|
case Op_MulReductionVD:
|
||||||
case Op_MulReductionVF:
|
case Op_MulReductionVF:
|
||||||
case Op_MulReductionVI:
|
case Op_MulReductionVI:
|
||||||
@@ -235,6 +247,28 @@ source %{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Op_SelectFromTwoVector:
|
||||||
|
// The "tbl" instruction for two vector table is supported only in Neon and SVE2. Return
|
||||||
|
// false if vector length > 16B but supported SVE version < 2.
|
||||||
|
// For vector length of 16B, generate SVE2 "tbl" instruction if SVE2 is supported, else
|
||||||
|
// generate Neon "tbl" instruction to select from two vectors.
|
||||||
|
// This operation is disabled for doubles and longs on machines with SVE < 2 and instead
|
||||||
|
// the default VectorRearrange + VectorBlend is generated because the performance of the default
|
||||||
|
// implementation was better than or equal to the implementation for SelectFromTwoVector.
|
||||||
|
if (UseSVE < 2 && (type2aelembytes(bt) == 8 || length_in_bytes > 16)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Because the SVE2 "tbl" instruction is unpredicated and partial operations cannot be generated
|
||||||
|
// using masks, we disable this operation on machines where length_in_bytes < MaxVectorSize
|
||||||
|
// on that machine with the only exception of 8B vector length. This is because at the time of
|
||||||
|
// writing this, there is no SVE2 machine available with length_in_bytes > 8 and
|
||||||
|
// length_in_bytes < MaxVectorSize to test this operation on (for example - there isn't an
|
||||||
|
// SVE2 machine available with MaxVectorSize = 32 to test a case with length_in_bytes = 16).
|
||||||
|
if (UseSVE == 2 && length_in_bytes > 8 && length_in_bytes < MaxVectorSize) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2502,31 +2536,31 @@ instruct reinterpret_resize_gt128b(vReg dst, vReg src, pReg ptmp, rFlagsReg cr)
|
|||||||
%}
|
%}
|
||||||
|
|
||||||
// ---------------------------- Vector zero extend --------------------------------
|
// ---------------------------- Vector zero extend --------------------------------
|
||||||
dnl VECTOR_ZERO_EXTEND($1, $2, $3, $4, $5 $6, $7, )
|
dnl VECTOR_ZERO_EXTEND($1, $2, $3, $4, $5, )
|
||||||
dnl VECTOR_ZERO_EXTEND(op_name, dst_bt, src_bt, dst_size, src_size, assertion, neon_comment)
|
dnl VECTOR_ZERO_EXTEND(op_name, src_bt, src_size, assertion, neon_comment)
|
||||||
define(`VECTOR_ZERO_EXTEND', `
|
define(`VECTOR_ZERO_EXTEND', `
|
||||||
instruct vzeroExt$1toX(vReg dst, vReg src) %{
|
instruct vzeroExt$1toX(vReg dst, vReg src) %{
|
||||||
match(Set dst (VectorUCast`$1'2X src));
|
match(Set dst (VectorUCast`$1'2X src));
|
||||||
format %{ "vzeroExt$1toX $dst, $src" %}
|
format %{ "vzeroExt$1toX $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
assert($6, "must be");
|
assert($4, "must be");
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// $7
|
// $5
|
||||||
__ neon_vector_extend($dst$$FloatRegister, $2, length_in_bytes,
|
__ neon_vector_extend($dst$$FloatRegister, bt, length_in_bytes,
|
||||||
$src$$FloatRegister, $3, /* is_unsigned */ true);
|
$src$$FloatRegister, $2, /* is_unsigned */ true);
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
__ sve_vector_extend($dst$$FloatRegister, __ $4,
|
__ sve_vector_extend($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
||||||
$src$$FloatRegister, __ $5, /* is_unsigned */ true);
|
$src$$FloatRegister, __ $3, /* is_unsigned */ true);
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}')dnl
|
%}')dnl
|
||||||
VECTOR_ZERO_EXTEND(B, bt, T_BYTE, elemType_to_regVariant(bt), B, bt == T_SHORT || bt == T_INT || bt == T_LONG, `4B to 4S/4I, 8B to 8S')
|
VECTOR_ZERO_EXTEND(B, T_BYTE, B, bt == T_SHORT || bt == T_INT || bt == T_LONG, `4B to 4S/4I, 8B to 8S')
|
||||||
VECTOR_ZERO_EXTEND(S, T_INT, T_SHORT, elemType_to_regVariant(bt), H, bt == T_INT || bt == T_LONG, `4S to 4I')
|
VECTOR_ZERO_EXTEND(S, T_SHORT, H, bt == T_INT || bt == T_LONG, `2S to 2I/2L, 4S to 4I')
|
||||||
VECTOR_ZERO_EXTEND(I, T_LONG, T_INT, D, S, bt == T_LONG, `2I to 2L')
|
VECTOR_ZERO_EXTEND(I, T_INT, S, bt == T_LONG, `2I to 2L')
|
||||||
|
|
||||||
// ------------------------------ Vector cast ----------------------------------
|
// ------------------------------ Vector cast ----------------------------------
|
||||||
|
|
||||||
@@ -2595,11 +2629,15 @@ instruct vcvtStoX_extend(vReg dst, vReg src) %{
|
|||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 4S to 4I/4F
|
if (is_floating_point_type(bt)) {
|
||||||
__ neon_vector_extend($dst$$FloatRegister, T_INT, length_in_bytes,
|
// 2S to 2F/2D, 4S to 4F
|
||||||
$src$$FloatRegister, T_SHORT);
|
__ neon_vector_extend($dst$$FloatRegister, bt == T_FLOAT ? T_INT : T_LONG,
|
||||||
if (bt == T_FLOAT) {
|
length_in_bytes, $src$$FloatRegister, T_SHORT);
|
||||||
__ scvtfv(__ T4S, $dst$$FloatRegister, $dst$$FloatRegister);
|
__ scvtfv(get_arrangement(this), $dst$$FloatRegister, $dst$$FloatRegister);
|
||||||
|
} else {
|
||||||
|
// 2S to 2I/2L, 4S to 4I
|
||||||
|
__ neon_vector_extend($dst$$FloatRegister, bt, length_in_bytes,
|
||||||
|
$src$$FloatRegister, T_SHORT);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
@@ -2623,7 +2661,7 @@ instruct vcvtItoX_narrow_neon(vReg dst, vReg src) %{
|
|||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtItoX_narrow_neon $dst, $src" %}
|
format %{ "vcvtItoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4I to 4B/4S
|
// 2I to 2S, 4I to 4B/4S
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
@@ -2686,28 +2724,29 @@ instruct vcvtItoX(vReg dst, vReg src) %{
|
|||||||
|
|
||||||
// VectorCastL2X
|
// VectorCastL2X
|
||||||
|
|
||||||
instruct vcvtLtoI_neon(vReg dst, vReg src) %{
|
instruct vcvtLtoX_narrow_neon(vReg dst, vReg src) %{
|
||||||
predicate(Matcher::vector_element_basic_type(n) == T_INT &&
|
predicate((Matcher::vector_element_basic_type(n) == T_INT ||
|
||||||
|
Matcher::vector_element_basic_type(n) == T_SHORT) &&
|
||||||
VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
||||||
match(Set dst (VectorCastL2X src));
|
match(Set dst (VectorCastL2X src));
|
||||||
format %{ "vcvtLtoI_neon $dst, $src" %}
|
format %{ "vcvtLtoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 2L to 2I
|
// 2L to 2S/2I
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, T_INT,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
$src$$FloatRegister, T_LONG, length_in_bytes);
|
$src$$FloatRegister, T_LONG, length_in_bytes);
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct vcvtLtoI_sve(vReg dst, vReg src, vReg tmp) %{
|
instruct vcvtLtoX_narrow_sve(vReg dst, vReg src, vReg tmp) %{
|
||||||
predicate((Matcher::vector_element_basic_type(n) == T_INT &&
|
predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))) &&
|
||||||
!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1)))) ||
|
!is_floating_point_type(Matcher::vector_element_basic_type(n)) &&
|
||||||
Matcher::vector_element_basic_type(n) == T_BYTE ||
|
type2aelembytes(Matcher::vector_element_basic_type(n)) <= 4);
|
||||||
Matcher::vector_element_basic_type(n) == T_SHORT);
|
|
||||||
match(Set dst (VectorCastL2X src));
|
match(Set dst (VectorCastL2X src));
|
||||||
effect(TEMP_DEF dst, TEMP tmp);
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
format %{ "vcvtLtoI_sve $dst, $src\t# KILL $tmp" %}
|
format %{ "vcvtLtoX_narrow_sve $dst, $src\t# KILL $tmp" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
@@ -2773,10 +2812,11 @@ instruct vcvtFtoX_narrow_neon(vReg dst, vReg src) %{
|
|||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtFtoX_narrow_neon $dst, $src" %}
|
format %{ "vcvtFtoX_narrow_neon $dst, $src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4F to 4B/4S
|
// 2F to 2S, 4F to 4B/4S
|
||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src);
|
||||||
__ fcvtzs($dst$$FloatRegister, __ T4S, $src$$FloatRegister);
|
__ fcvtzs($dst$$FloatRegister, length_in_bytes == 16 ? __ T4S : __ T2S,
|
||||||
|
$src$$FloatRegister);
|
||||||
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
__ neon_vector_narrow($dst$$FloatRegister, bt,
|
||||||
$dst$$FloatRegister, T_INT, length_in_bytes);
|
$dst$$FloatRegister, T_INT, length_in_bytes);
|
||||||
%}
|
%}
|
||||||
@@ -2842,12 +2882,14 @@ instruct vcvtFtoX(vReg dst, vReg src) %{
|
|||||||
// VectorCastD2X
|
// VectorCastD2X
|
||||||
|
|
||||||
instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
||||||
predicate(UseSVE == 0 && Matcher::vector_element_basic_type(n) == T_INT);
|
predicate(UseSVE == 0 &&
|
||||||
|
(Matcher::vector_element_basic_type(n) == T_INT ||
|
||||||
|
Matcher::vector_element_basic_type(n) == T_SHORT));
|
||||||
match(Set dst (VectorCastD2X src));
|
match(Set dst (VectorCastD2X src));
|
||||||
effect(TEMP_DEF dst);
|
effect(TEMP_DEF dst);
|
||||||
format %{ "vcvtDtoI_neon $dst, $src\t# 2D to 2I" %}
|
format %{ "vcvtDtoI_neon $dst, $src\t# 2D to 2S/2I" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 2D to 2I
|
// 2D to 2S/2I
|
||||||
__ ins($dst$$FloatRegister, __ D, $src$$FloatRegister, 0, 1);
|
__ ins($dst$$FloatRegister, __ D, $src$$FloatRegister, 0, 1);
|
||||||
// We can't use fcvtzs(vector, integer) instruction here because we need
|
// We can't use fcvtzs(vector, integer) instruction here because we need
|
||||||
// saturation arithmetic. See JDK-8276151.
|
// saturation arithmetic. See JDK-8276151.
|
||||||
@@ -2855,6 +2897,10 @@ instruct vcvtDtoI_neon(vReg dst, vReg src) %{
|
|||||||
__ fcvtzdw(rscratch2, $dst$$FloatRegister);
|
__ fcvtzdw(rscratch2, $dst$$FloatRegister);
|
||||||
__ fmovs($dst$$FloatRegister, rscratch1);
|
__ fmovs($dst$$FloatRegister, rscratch1);
|
||||||
__ mov($dst$$FloatRegister, __ S, 1, rscratch2);
|
__ mov($dst$$FloatRegister, __ S, 1, rscratch2);
|
||||||
|
if (Matcher::vector_element_basic_type(this) == T_SHORT) {
|
||||||
|
__ neon_vector_narrow($dst$$FloatRegister, T_SHORT,
|
||||||
|
$dst$$FloatRegister, T_INT, 8);
|
||||||
|
}
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
@@ -2928,7 +2974,7 @@ instruct vcvtHFtoF(vReg dst, vReg src) %{
|
|||||||
ins_encode %{
|
ins_encode %{
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
// 4HF to 4F
|
// 2HF to 2F, 4HF to 4F
|
||||||
__ fcvtl($dst$$FloatRegister, __ T4S, $src$$FloatRegister, __ T4H);
|
__ fcvtl($dst$$FloatRegister, __ T4S, $src$$FloatRegister, __ T4H);
|
||||||
} else {
|
} else {
|
||||||
assert(UseSVE > 0, "must be sve");
|
assert(UseSVE > 0, "must be sve");
|
||||||
@@ -2944,9 +2990,9 @@ instruct vcvtHFtoF(vReg dst, vReg src) %{
|
|||||||
instruct vcvtFtoHF_neon(vReg dst, vReg src) %{
|
instruct vcvtFtoHF_neon(vReg dst, vReg src) %{
|
||||||
predicate(VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
predicate(VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(1))));
|
||||||
match(Set dst (VectorCastF2HF src));
|
match(Set dst (VectorCastF2HF src));
|
||||||
format %{ "vcvtFtoHF_neon $dst, $src\t# 4F to 4HF" %}
|
format %{ "vcvtFtoHF_neon $dst, $src\t# 2F/4F to 2HF/4HF" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// 4F to 4HF
|
// 2F to 2HF, 4F to 4HF
|
||||||
__ fcvtn($dst$$FloatRegister, __ T4H, $src$$FloatRegister, __ T4S);
|
__ fcvtn($dst$$FloatRegister, __ T4H, $src$$FloatRegister, __ T4S);
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
@@ -4417,14 +4463,12 @@ instruct vpopcountI(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT, "unsupported");
|
assert(bt == T_SHORT || bt == T_INT, "unsupported");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ cnt($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
bool isQ = length_in_bytes == 16;
|
||||||
$src$$FloatRegister);
|
__ cnt($dst$$FloatRegister, isQ ? __ T16B : __ T8B, $src$$FloatRegister);
|
||||||
__ uaddlp($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ uaddlp($dst$$FloatRegister, isQ ? __ T16B : __ T8B, $dst$$FloatRegister);
|
||||||
$dst$$FloatRegister);
|
|
||||||
if (bt == T_INT) {
|
if (bt == T_INT) {
|
||||||
__ uaddlp($dst$$FloatRegister, length_in_bytes == 16 ? __ T8H : __ T4H,
|
__ uaddlp($dst$$FloatRegister, isQ ? __ T8H : __ T4H, $dst$$FloatRegister);
|
||||||
$dst$$FloatRegister);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
__ sve_cnt($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
__ sve_cnt($dst$$FloatRegister, __ elemType_to_regVariant(bt),
|
||||||
@@ -4475,7 +4519,7 @@ instruct vblend_neon(vReg dst, vReg src1, vReg src2) %{
|
|||||||
format %{ "vblend_neon $dst, $src1, $src2" %}
|
format %{ "vblend_neon $dst, $src1, $src2" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "must be");
|
assert(length_in_bytes <= 16, "must be");
|
||||||
__ bsl($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ bsl($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
||||||
$src2$$FloatRegister, $src1$$FloatRegister);
|
$src2$$FloatRegister, $src1$$FloatRegister);
|
||||||
%}
|
%}
|
||||||
@@ -4851,7 +4895,7 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
||||||
bt, /* isQ */ length_in_bytes == 16);
|
bt, /* isQ */ length_in_bytes == 16);
|
||||||
if (bt != T_LONG) {
|
if (bt != T_LONG) {
|
||||||
@@ -4910,7 +4954,7 @@ instruct vreverse(vReg dst, vReg src) %{
|
|||||||
} else {
|
} else {
|
||||||
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
assert(bt == T_SHORT || bt == T_INT || bt == T_LONG, "unsupported type");
|
||||||
if (UseSVE == 0) {
|
if (UseSVE == 0) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
__ neon_reverse_bits($dst$$FloatRegister, $src$$FloatRegister,
|
||||||
bt, /* isQ */ length_in_bytes == 16);
|
bt, /* isQ */ length_in_bytes == 16);
|
||||||
} else {
|
} else {
|
||||||
@@ -4935,7 +4979,7 @@ instruct vreverseBytes(vReg dst, vReg src) %{
|
|||||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
if (VM_Version::use_neon_for_vector(length_in_bytes)) {
|
||||||
assert(length_in_bytes == 8 || length_in_bytes == 16, "unsupported");
|
assert(length_in_bytes <= 16, "unsupported");
|
||||||
if (bt == T_BYTE) {
|
if (bt == T_BYTE) {
|
||||||
if ($dst$$FloatRegister != $src$$FloatRegister) {
|
if ($dst$$FloatRegister != $src$$FloatRegister) {
|
||||||
__ orr($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
__ orr($dst$$FloatRegister, length_in_bytes == 16 ? __ T16B : __ T8B,
|
||||||
@@ -5132,3 +5176,34 @@ BITPERM(vcompressBits, CompressBitsV, sve_bext)
|
|||||||
|
|
||||||
// ----------------------------------- ExpandBitsV ---------------------------------
|
// ----------------------------------- ExpandBitsV ---------------------------------
|
||||||
BITPERM(vexpandBits, ExpandBitsV, sve_bdep)
|
BITPERM(vexpandBits, ExpandBitsV, sve_bdep)
|
||||||
|
|
||||||
|
// ------------------------------------- SelectFromTwoVector ------------------------------------
|
||||||
|
// The Neon and SVE2 tbl instruction for two vector lookup requires both the source vectors to be
|
||||||
|
// consecutive. The match rules for SelectFromTwoVector reserve two consecutive vector registers
|
||||||
|
// for src1 and src2.
|
||||||
|
// Four combinations of vector registers for vselect_from_two_vectors are chosen at random
|
||||||
|
// (two from volatile and two from non-volatile set) which gives more freedom to the register
|
||||||
|
// allocator to choose the best pair of source registers at that point.
|
||||||
|
dnl
|
||||||
|
dnl SELECT_FROM_TWO_VECTORS($1, $2 )
|
||||||
|
dnl SELECT_FROM_TWO_VECTORS(first_reg, second_reg)
|
||||||
|
define(`SELECT_FROM_TWO_VECTORS', `
|
||||||
|
instruct vselect_from_two_vectors_$1_$2(vReg dst, vReg_V$1 src1, vReg_V$2 src2,
|
||||||
|
vReg index, vReg tmp) %{
|
||||||
|
effect(TEMP_DEF dst, TEMP tmp);
|
||||||
|
match(Set dst (SelectFromTwoVector (Binary index src1) src2));
|
||||||
|
format %{ "vselect_from_two_vectors_$1_$2 $dst, $src1, $src2, $index\t# KILL $tmp" %}
|
||||||
|
ins_encode %{
|
||||||
|
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||||
|
uint length_in_bytes = Matcher::vector_length_in_bytes(this);
|
||||||
|
__ select_from_two_vectors($dst$$FloatRegister, $src1$$FloatRegister,
|
||||||
|
$src2$$FloatRegister, $index$$FloatRegister,
|
||||||
|
$tmp$$FloatRegister, bt, length_in_bytes);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
SELECT_FROM_TWO_VECTORS(10, 11)
|
||||||
|
SELECT_FROM_TWO_VECTORS(12, 13)
|
||||||
|
SELECT_FROM_TWO_VECTORS(17, 18)
|
||||||
|
SELECT_FROM_TWO_VECTORS(23, 24)
|
||||||
|
|||||||
@@ -1136,6 +1136,10 @@ public:
|
|||||||
system(0b00, 0b011, 0b00011, SY, 0b110);
|
system(0b00, 0b011, 0b00011, SY, 0b110);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sb() {
|
||||||
|
system(0b00, 0b011, 0b00011, 0b0000, 0b111);
|
||||||
|
}
|
||||||
|
|
||||||
void sys(int op1, int CRn, int CRm, int op2,
|
void sys(int op1, int CRn, int CRm, int op2,
|
||||||
Register rt = as_Register(0b11111)) {
|
Register rt = as_Register(0b11111)) {
|
||||||
system(0b01, op1, CRn, CRm, op2, rt);
|
system(0b01, op1, CRn, CRm, op2, rt);
|
||||||
@@ -4227,12 +4231,29 @@ public:
|
|||||||
sf(imm1, 9, 5), rf(Zd, 0);
|
sf(imm1, 9, 5), rf(Zd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SVE programmable table lookup/permute using vector of element indices
|
private:
|
||||||
void sve_tbl(FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn, FloatRegister Zm) {
|
void _sve_tbl(FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn, unsigned reg_count, FloatRegister Zm) {
|
||||||
starti;
|
starti;
|
||||||
assert(T != Q, "invalid size");
|
assert(T != Q, "invalid size");
|
||||||
|
// Only supports one or two vector lookup. One vector lookup was introduced in SVE1
|
||||||
|
// and two vector lookup in SVE2
|
||||||
|
assert(0 < reg_count && reg_count <= 2, "invalid number of registers");
|
||||||
|
|
||||||
|
int op11 = (reg_count == 1) ? 0b10 : 0b01;
|
||||||
|
|
||||||
f(0b00000101, 31, 24), f(T, 23, 22), f(0b1, 21), rf(Zm, 16);
|
f(0b00000101, 31, 24), f(T, 23, 22), f(0b1, 21), rf(Zm, 16);
|
||||||
f(0b001100, 15, 10), rf(Zn, 5), rf(Zd, 0);
|
f(0b001, 15, 13), f(op11, 12, 11), f(0b0, 10), rf(Zn, 5), rf(Zd, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
// SVE/SVE2 Programmable table lookup in one or two vector table (zeroing)
|
||||||
|
void sve_tbl(FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn, FloatRegister Zm) {
|
||||||
|
_sve_tbl(Zd, T, Zn, 1, Zm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sve_tbl(FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn1, FloatRegister Zn2, FloatRegister Zm) {
|
||||||
|
assert(Zn1->successor() == Zn2, "invalid order of registers");
|
||||||
|
_sve_tbl(Zd, T, Zn1, 2, Zm);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shuffle active elements of vector to the right and fill with zero
|
// Shuffle active elements of vector to the right and fill with zero
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ void CounterOverflowStub::emit_code(LIR_Assembler* ce) {
|
|||||||
__ mov_metadata(rscratch1, m);
|
__ mov_metadata(rscratch1, m);
|
||||||
ce->store_parameter(rscratch1, 1);
|
ce->store_parameter(rscratch1, 1);
|
||||||
ce->store_parameter(_bci, 0);
|
ce->store_parameter(_bci, 0);
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::counter_overflow_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_counter_overflow_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
__ b(_continuation);
|
__ b(_continuation);
|
||||||
@@ -65,7 +65,7 @@ void CounterOverflowStub::emit_code(LIR_Assembler* ce) {
|
|||||||
void RangeCheckStub::emit_code(LIR_Assembler* ce) {
|
void RangeCheckStub::emit_code(LIR_Assembler* ce) {
|
||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
if (_info->deoptimize_on_exception()) {
|
if (_info->deoptimize_on_exception()) {
|
||||||
address a = Runtime1::entry_for(C1StubId::predicate_failed_trap_id);
|
address a = Runtime1::entry_for(StubId::c1_predicate_failed_trap_id);
|
||||||
__ far_call(RuntimeAddress(a));
|
__ far_call(RuntimeAddress(a));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
@@ -78,13 +78,13 @@ void RangeCheckStub::emit_code(LIR_Assembler* ce) {
|
|||||||
} else {
|
} else {
|
||||||
__ mov(rscratch1, _index->as_jint());
|
__ mov(rscratch1, _index->as_jint());
|
||||||
}
|
}
|
||||||
C1StubId stub_id;
|
StubId stub_id;
|
||||||
if (_throw_index_out_of_bounds_exception) {
|
if (_throw_index_out_of_bounds_exception) {
|
||||||
stub_id = C1StubId::throw_index_exception_id;
|
stub_id = StubId::c1_throw_index_exception_id;
|
||||||
} else {
|
} else {
|
||||||
assert(_array != LIR_Opr::nullOpr(), "sanity");
|
assert(_array != LIR_Opr::nullOpr(), "sanity");
|
||||||
__ mov(rscratch2, _array->as_pointer_register());
|
__ mov(rscratch2, _array->as_pointer_register());
|
||||||
stub_id = C1StubId::throw_range_check_failed_id;
|
stub_id = StubId::c1_throw_range_check_failed_id;
|
||||||
}
|
}
|
||||||
__ lea(lr, RuntimeAddress(Runtime1::entry_for(stub_id)));
|
__ lea(lr, RuntimeAddress(Runtime1::entry_for(stub_id)));
|
||||||
__ blr(lr);
|
__ blr(lr);
|
||||||
@@ -99,7 +99,7 @@ PredicateFailedStub::PredicateFailedStub(CodeEmitInfo* info) {
|
|||||||
|
|
||||||
void PredicateFailedStub::emit_code(LIR_Assembler* ce) {
|
void PredicateFailedStub::emit_code(LIR_Assembler* ce) {
|
||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
address a = Runtime1::entry_for(C1StubId::predicate_failed_trap_id);
|
address a = Runtime1::entry_for(StubId::c1_predicate_failed_trap_id);
|
||||||
__ far_call(RuntimeAddress(a));
|
__ far_call(RuntimeAddress(a));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
@@ -111,7 +111,7 @@ void DivByZeroStub::emit_code(LIR_Assembler* ce) {
|
|||||||
ce->compilation()->implicit_exception_table()->append(_offset, __ offset());
|
ce->compilation()->implicit_exception_table()->append(_offset, __ offset());
|
||||||
}
|
}
|
||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::throw_div0_exception_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_throw_div0_exception_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
@@ -123,14 +123,14 @@ void DivByZeroStub::emit_code(LIR_Assembler* ce) {
|
|||||||
|
|
||||||
// Implementation of NewInstanceStub
|
// Implementation of NewInstanceStub
|
||||||
|
|
||||||
NewInstanceStub::NewInstanceStub(LIR_Opr klass_reg, LIR_Opr result, ciInstanceKlass* klass, CodeEmitInfo* info, C1StubId stub_id) {
|
NewInstanceStub::NewInstanceStub(LIR_Opr klass_reg, LIR_Opr result, ciInstanceKlass* klass, CodeEmitInfo* info, StubId stub_id) {
|
||||||
_result = result;
|
_result = result;
|
||||||
_klass = klass;
|
_klass = klass;
|
||||||
_klass_reg = klass_reg;
|
_klass_reg = klass_reg;
|
||||||
_info = new CodeEmitInfo(info);
|
_info = new CodeEmitInfo(info);
|
||||||
assert(stub_id == C1StubId::new_instance_id ||
|
assert(stub_id == StubId::c1_new_instance_id ||
|
||||||
stub_id == C1StubId::fast_new_instance_id ||
|
stub_id == StubId::c1_fast_new_instance_id ||
|
||||||
stub_id == C1StubId::fast_new_instance_init_check_id,
|
stub_id == StubId::c1_fast_new_instance_init_check_id,
|
||||||
"need new_instance id");
|
"need new_instance id");
|
||||||
_stub_id = stub_id;
|
_stub_id = stub_id;
|
||||||
}
|
}
|
||||||
@@ -166,7 +166,7 @@ void NewTypeArrayStub::emit_code(LIR_Assembler* ce) {
|
|||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
assert(_length->as_register() == r19, "length must in r19,");
|
assert(_length->as_register() == r19, "length must in r19,");
|
||||||
assert(_klass_reg->as_register() == r3, "klass_reg must in r3");
|
assert(_klass_reg->as_register() == r3, "klass_reg must in r3");
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::new_type_array_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_new_type_array_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
assert(_result->as_register() == r0, "result must in r0");
|
assert(_result->as_register() == r0, "result must in r0");
|
||||||
@@ -189,7 +189,7 @@ void NewObjectArrayStub::emit_code(LIR_Assembler* ce) {
|
|||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
assert(_length->as_register() == r19, "length must in r19,");
|
assert(_length->as_register() == r19, "length must in r19,");
|
||||||
assert(_klass_reg->as_register() == r3, "klass_reg must in r3");
|
assert(_klass_reg->as_register() == r3, "klass_reg must in r3");
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::new_object_array_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_new_object_array_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
ce->verify_oop_map(_info);
|
ce->verify_oop_map(_info);
|
||||||
assert(_result->as_register() == r0, "result must in r0");
|
assert(_result->as_register() == r0, "result must in r0");
|
||||||
@@ -201,11 +201,11 @@ void MonitorEnterStub::emit_code(LIR_Assembler* ce) {
|
|||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
ce->store_parameter(_obj_reg->as_register(), 1);
|
ce->store_parameter(_obj_reg->as_register(), 1);
|
||||||
ce->store_parameter(_lock_reg->as_register(), 0);
|
ce->store_parameter(_lock_reg->as_register(), 0);
|
||||||
C1StubId enter_id;
|
StubId enter_id;
|
||||||
if (ce->compilation()->has_fpu_code()) {
|
if (ce->compilation()->has_fpu_code()) {
|
||||||
enter_id = C1StubId::monitorenter_id;
|
enter_id = StubId::c1_monitorenter_id;
|
||||||
} else {
|
} else {
|
||||||
enter_id = C1StubId::monitorenter_nofpu_id;
|
enter_id = StubId::c1_monitorenter_nofpu_id;
|
||||||
}
|
}
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(enter_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(enter_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
@@ -222,11 +222,11 @@ void MonitorExitStub::emit_code(LIR_Assembler* ce) {
|
|||||||
}
|
}
|
||||||
ce->store_parameter(_lock_reg->as_register(), 0);
|
ce->store_parameter(_lock_reg->as_register(), 0);
|
||||||
// note: non-blocking leaf routine => no call info needed
|
// note: non-blocking leaf routine => no call info needed
|
||||||
C1StubId exit_id;
|
StubId exit_id;
|
||||||
if (ce->compilation()->has_fpu_code()) {
|
if (ce->compilation()->has_fpu_code()) {
|
||||||
exit_id = C1StubId::monitorexit_id;
|
exit_id = StubId::c1_monitorexit_id;
|
||||||
} else {
|
} else {
|
||||||
exit_id = C1StubId::monitorexit_nofpu_id;
|
exit_id = StubId::c1_monitorexit_nofpu_id;
|
||||||
}
|
}
|
||||||
__ adr(lr, _continuation);
|
__ adr(lr, _continuation);
|
||||||
__ far_jump(RuntimeAddress(Runtime1::entry_for(exit_id)));
|
__ far_jump(RuntimeAddress(Runtime1::entry_for(exit_id)));
|
||||||
@@ -254,7 +254,7 @@ void PatchingStub::emit_code(LIR_Assembler* ce) {
|
|||||||
void DeoptimizeStub::emit_code(LIR_Assembler* ce) {
|
void DeoptimizeStub::emit_code(LIR_Assembler* ce) {
|
||||||
__ bind(_entry);
|
__ bind(_entry);
|
||||||
ce->store_parameter(_trap_request, 0);
|
ce->store_parameter(_trap_request, 0);
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::deoptimize_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_deoptimize_id)));
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
DEBUG_ONLY(__ should_not_reach_here());
|
DEBUG_ONLY(__ should_not_reach_here());
|
||||||
}
|
}
|
||||||
@@ -264,9 +264,9 @@ void ImplicitNullCheckStub::emit_code(LIR_Assembler* ce) {
|
|||||||
address a;
|
address a;
|
||||||
if (_info->deoptimize_on_exception()) {
|
if (_info->deoptimize_on_exception()) {
|
||||||
// Deoptimize, do not throw the exception, because it is probably wrong to do it here.
|
// Deoptimize, do not throw the exception, because it is probably wrong to do it here.
|
||||||
a = Runtime1::entry_for(C1StubId::predicate_failed_trap_id);
|
a = Runtime1::entry_for(StubId::c1_predicate_failed_trap_id);
|
||||||
} else {
|
} else {
|
||||||
a = Runtime1::entry_for(C1StubId::throw_null_pointer_exception_id);
|
a = Runtime1::entry_for(StubId::c1_throw_null_pointer_exception_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
ce->compilation()->implicit_exception_table()->append(_offset, __ offset());
|
ce->compilation()->implicit_exception_table()->append(_offset, __ offset());
|
||||||
|
|||||||
@@ -320,19 +320,19 @@ void LIR_Assembler::deoptimize_trap(CodeEmitInfo *info) {
|
|||||||
|
|
||||||
switch (patching_id(info)) {
|
switch (patching_id(info)) {
|
||||||
case PatchingStub::access_field_id:
|
case PatchingStub::access_field_id:
|
||||||
target = Runtime1::entry_for(C1StubId::access_field_patching_id);
|
target = Runtime1::entry_for(StubId::c1_access_field_patching_id);
|
||||||
reloc_type = relocInfo::section_word_type;
|
reloc_type = relocInfo::section_word_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_klass_id:
|
case PatchingStub::load_klass_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_klass_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_klass_patching_id);
|
||||||
reloc_type = relocInfo::metadata_type;
|
reloc_type = relocInfo::metadata_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_mirror_id:
|
case PatchingStub::load_mirror_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_mirror_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_mirror_patching_id);
|
||||||
reloc_type = relocInfo::oop_type;
|
reloc_type = relocInfo::oop_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_appendix_id:
|
case PatchingStub::load_appendix_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_appendix_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_appendix_patching_id);
|
||||||
reloc_type = relocInfo::oop_type;
|
reloc_type = relocInfo::oop_type;
|
||||||
break;
|
break;
|
||||||
default: ShouldNotReachHere();
|
default: ShouldNotReachHere();
|
||||||
@@ -374,7 +374,7 @@ int LIR_Assembler::emit_exception_handler() {
|
|||||||
__ verify_not_null_oop(r0);
|
__ verify_not_null_oop(r0);
|
||||||
|
|
||||||
// search an exception handler (r0: exception oop, r3: throwing pc)
|
// search an exception handler (r0: exception oop, r3: throwing pc)
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::handle_exception_from_callee_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_handle_exception_from_callee_id)));
|
||||||
__ should_not_reach_here();
|
__ should_not_reach_here();
|
||||||
guarantee(code_offset() - offset <= exception_handler_size(), "overflow");
|
guarantee(code_offset() - offset <= exception_handler_size(), "overflow");
|
||||||
__ end_a_stub();
|
__ end_a_stub();
|
||||||
@@ -410,11 +410,7 @@ int LIR_Assembler::emit_unwind_handler() {
|
|||||||
if (method()->is_synchronized()) {
|
if (method()->is_synchronized()) {
|
||||||
monitor_address(0, FrameMap::r0_opr);
|
monitor_address(0, FrameMap::r0_opr);
|
||||||
stub = new MonitorExitStub(FrameMap::r0_opr, true, 0);
|
stub = new MonitorExitStub(FrameMap::r0_opr, true, 0);
|
||||||
if (LockingMode == LM_MONITOR) {
|
__ unlock_object(r5, r4, r0, r6, *stub->entry());
|
||||||
__ b(*stub->entry());
|
|
||||||
} else {
|
|
||||||
__ unlock_object(r5, r4, r0, r6, *stub->entry());
|
|
||||||
}
|
|
||||||
__ bind(*stub->continuation());
|
__ bind(*stub->continuation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,7 +427,7 @@ int LIR_Assembler::emit_unwind_handler() {
|
|||||||
// remove the activation and dispatch to the unwind handler
|
// remove the activation and dispatch to the unwind handler
|
||||||
__ block_comment("remove_frame and dispatch to the unwind handler");
|
__ block_comment("remove_frame and dispatch to the unwind handler");
|
||||||
__ remove_frame(initial_frame_size_in_bytes());
|
__ remove_frame(initial_frame_size_in_bytes());
|
||||||
__ far_jump(RuntimeAddress(Runtime1::entry_for(C1StubId::unwind_exception_id)));
|
__ far_jump(RuntimeAddress(Runtime1::entry_for(StubId::c1_unwind_exception_id)));
|
||||||
|
|
||||||
// Emit the slow path assembly
|
// Emit the slow path assembly
|
||||||
if (stub != nullptr) {
|
if (stub != nullptr) {
|
||||||
@@ -483,7 +479,7 @@ void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) {
|
|||||||
|
|
||||||
code_stub->set_safepoint_offset(__ offset());
|
code_stub->set_safepoint_offset(__ offset());
|
||||||
__ relocate(relocInfo::poll_return_type);
|
__ relocate(relocInfo::poll_return_type);
|
||||||
__ safepoint_poll(*code_stub->entry(), true /* at_return */, false /* acquire */, true /* in_nmethod */);
|
__ safepoint_poll(*code_stub->entry(), true /* at_return */, true /* in_nmethod */);
|
||||||
__ ret(lr);
|
__ ret(lr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -874,19 +870,19 @@ void LIR_Assembler::klass2reg_with_patching(Register reg, CodeEmitInfo* info) {
|
|||||||
|
|
||||||
switch (patching_id(info)) {
|
switch (patching_id(info)) {
|
||||||
case PatchingStub::access_field_id:
|
case PatchingStub::access_field_id:
|
||||||
target = Runtime1::entry_for(C1StubId::access_field_patching_id);
|
target = Runtime1::entry_for(StubId::c1_access_field_patching_id);
|
||||||
reloc_type = relocInfo::section_word_type;
|
reloc_type = relocInfo::section_word_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_klass_id:
|
case PatchingStub::load_klass_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_klass_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_klass_patching_id);
|
||||||
reloc_type = relocInfo::metadata_type;
|
reloc_type = relocInfo::metadata_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_mirror_id:
|
case PatchingStub::load_mirror_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_mirror_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_mirror_patching_id);
|
||||||
reloc_type = relocInfo::oop_type;
|
reloc_type = relocInfo::oop_type;
|
||||||
break;
|
break;
|
||||||
case PatchingStub::load_appendix_id:
|
case PatchingStub::load_appendix_id:
|
||||||
target = Runtime1::entry_for(C1StubId::load_appendix_patching_id);
|
target = Runtime1::entry_for(StubId::c1_load_appendix_patching_id);
|
||||||
reloc_type = relocInfo::oop_type;
|
reloc_type = relocInfo::oop_type;
|
||||||
break;
|
break;
|
||||||
default: ShouldNotReachHere();
|
default: ShouldNotReachHere();
|
||||||
@@ -1358,7 +1354,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
|||||||
__ br(Assembler::EQ, *success_target);
|
__ br(Assembler::EQ, *success_target);
|
||||||
|
|
||||||
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::slow_subtype_check_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_slow_subtype_check_id)));
|
||||||
__ ldr(klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
__ ldr(klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
||||||
// result is a boolean
|
// result is a boolean
|
||||||
__ cbzw(klass_RInfo, *failure_target);
|
__ cbzw(klass_RInfo, *failure_target);
|
||||||
@@ -1369,7 +1365,7 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
|||||||
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr);
|
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr);
|
||||||
// call out-of-line instance of __ check_klass_subtype_slow_path(...):
|
// call out-of-line instance of __ check_klass_subtype_slow_path(...):
|
||||||
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::slow_subtype_check_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_slow_subtype_check_id)));
|
||||||
__ ldp(k_RInfo, klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
__ ldp(k_RInfo, klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
||||||
// result is a boolean
|
// result is a boolean
|
||||||
__ cbz(k_RInfo, *failure_target);
|
__ cbz(k_RInfo, *failure_target);
|
||||||
@@ -1447,7 +1443,7 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
|||||||
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr);
|
__ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr);
|
||||||
// call out-of-line instance of __ check_klass_subtype_slow_path(...):
|
// call out-of-line instance of __ check_klass_subtype_slow_path(...):
|
||||||
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
__ stp(klass_RInfo, k_RInfo, Address(__ pre(sp, -2 * wordSize)));
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::slow_subtype_check_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_slow_subtype_check_id)));
|
||||||
__ ldp(k_RInfo, klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
__ ldp(k_RInfo, klass_RInfo, Address(__ post(sp, 2 * wordSize)));
|
||||||
// result is a boolean
|
// result is a boolean
|
||||||
__ cbzw(k_RInfo, *failure_target);
|
__ cbzw(k_RInfo, *failure_target);
|
||||||
@@ -2033,7 +2029,7 @@ void LIR_Assembler::throw_op(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmit
|
|||||||
// exception object is not added to oop map by LinearScan
|
// exception object is not added to oop map by LinearScan
|
||||||
// (LinearScan assumes that no oops are in fixed registers)
|
// (LinearScan assumes that no oops are in fixed registers)
|
||||||
info->add_register_oop(exceptionOop);
|
info->add_register_oop(exceptionOop);
|
||||||
C1StubId unwind_id;
|
StubId unwind_id;
|
||||||
|
|
||||||
// get current pc information
|
// get current pc information
|
||||||
// pc is only needed if the method has an exception handler, the unwind code does not need it.
|
// pc is only needed if the method has an exception handler, the unwind code does not need it.
|
||||||
@@ -2052,9 +2048,9 @@ void LIR_Assembler::throw_op(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmit
|
|||||||
__ verify_not_null_oop(r0);
|
__ verify_not_null_oop(r0);
|
||||||
// search an exception handler (r0: exception oop, r3: throwing pc)
|
// search an exception handler (r0: exception oop, r3: throwing pc)
|
||||||
if (compilation()->has_fpu_code()) {
|
if (compilation()->has_fpu_code()) {
|
||||||
unwind_id = C1StubId::handle_exception_id;
|
unwind_id = StubId::c1_handle_exception_id;
|
||||||
} else {
|
} else {
|
||||||
unwind_id = C1StubId::handle_exception_nofpu_id;
|
unwind_id = StubId::c1_handle_exception_nofpu_id;
|
||||||
}
|
}
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(unwind_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(unwind_id)));
|
||||||
|
|
||||||
@@ -2325,7 +2321,7 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
|||||||
__ check_klass_subtype_fast_path(src, dst, tmp, &cont, &slow, nullptr);
|
__ check_klass_subtype_fast_path(src, dst, tmp, &cont, &slow, nullptr);
|
||||||
|
|
||||||
__ PUSH(src, dst);
|
__ PUSH(src, dst);
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::slow_subtype_check_id)));
|
__ far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_slow_subtype_check_id)));
|
||||||
__ POP(src, dst);
|
__ POP(src, dst);
|
||||||
|
|
||||||
__ cbnz(src, cont);
|
__ cbnz(src, cont);
|
||||||
@@ -2484,13 +2480,7 @@ void LIR_Assembler::emit_lock(LIR_OpLock* op) {
|
|||||||
Register hdr = op->hdr_opr()->as_register();
|
Register hdr = op->hdr_opr()->as_register();
|
||||||
Register lock = op->lock_opr()->as_register();
|
Register lock = op->lock_opr()->as_register();
|
||||||
Register temp = op->scratch_opr()->as_register();
|
Register temp = op->scratch_opr()->as_register();
|
||||||
if (LockingMode == LM_MONITOR) {
|
if (op->code() == lir_lock) {
|
||||||
if (op->info() != nullptr) {
|
|
||||||
add_debug_info_for_null_check_here(op->info());
|
|
||||||
__ null_check(obj, -1);
|
|
||||||
}
|
|
||||||
__ b(*op->stub()->entry());
|
|
||||||
} else if (op->code() == lir_lock) {
|
|
||||||
assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
|
assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
|
||||||
// add debug info for NullPointerException only if one is possible
|
// add debug info for NullPointerException only if one is possible
|
||||||
int null_check_offset = __ lock_object(hdr, obj, lock, temp, *op->stub()->entry());
|
int null_check_offset = __ lock_object(hdr, obj, lock, temp, *op->stub()->entry());
|
||||||
@@ -2823,7 +2813,7 @@ void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest, LIR_PatchCode patch_code, C
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
__ lea(dest->as_register_lo(), as_Address(addr->as_address_ptr()));
|
__ lea(dest->as_pointer_register(), as_Address(addr->as_address_ptr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3133,7 +3123,9 @@ void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr
|
|||||||
default:
|
default:
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
__ membar(__ AnyAny);
|
if(!UseLSE) {
|
||||||
|
__ membar(__ AnyAny);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef __
|
#undef __
|
||||||
|
|||||||
@@ -981,7 +981,7 @@ void LIRGenerator::do_update_CRC32(Intrinsic* x) {
|
|||||||
CallingConvention* cc = frame_map()->c_calling_convention(&signature);
|
CallingConvention* cc = frame_map()->c_calling_convention(&signature);
|
||||||
const LIR_Opr result_reg = result_register_for(x->type());
|
const LIR_Opr result_reg = result_register_for(x->type());
|
||||||
|
|
||||||
LIR_Opr addr = new_pointer_register();
|
LIR_Opr addr = new_register(T_ADDRESS);
|
||||||
__ leal(LIR_OprFact::address(a), addr);
|
__ leal(LIR_OprFact::address(a), addr);
|
||||||
|
|
||||||
crc.load_item_force(cc->at(0));
|
crc.load_item_force(cc->at(0));
|
||||||
@@ -1058,7 +1058,7 @@ void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
|
|||||||
CallingConvention* cc = frame_map()->c_calling_convention(&signature);
|
CallingConvention* cc = frame_map()->c_calling_convention(&signature);
|
||||||
const LIR_Opr result_reg = result_register_for(x->type());
|
const LIR_Opr result_reg = result_register_for(x->type());
|
||||||
|
|
||||||
LIR_Opr addr = new_pointer_register();
|
LIR_Opr addr = new_register(T_ADDRESS);
|
||||||
__ leal(LIR_OprFact::address(a), addr);
|
__ leal(LIR_OprFact::address(a), addr);
|
||||||
|
|
||||||
crc.load_item_force(cc->at(0));
|
crc.load_item_force(cc->at(0));
|
||||||
@@ -1245,7 +1245,7 @@ void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
|
|||||||
args->append(rank);
|
args->append(rank);
|
||||||
args->append(varargs);
|
args->append(varargs);
|
||||||
LIR_Opr reg = result_register_for(x->type());
|
LIR_Opr reg = result_register_for(x->type());
|
||||||
__ call_runtime(Runtime1::entry_for(C1StubId::new_multi_array_id),
|
__ call_runtime(Runtime1::entry_for(StubId::c1_new_multi_array_id),
|
||||||
LIR_OprFact::illegalOpr,
|
LIR_OprFact::illegalOpr,
|
||||||
reg, args, info);
|
reg, args, info);
|
||||||
|
|
||||||
@@ -1276,14 +1276,14 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
|||||||
CodeStub* stub;
|
CodeStub* stub;
|
||||||
if (x->is_incompatible_class_change_check()) {
|
if (x->is_incompatible_class_change_check()) {
|
||||||
assert(patching_info == nullptr, "can't patch this");
|
assert(patching_info == nullptr, "can't patch this");
|
||||||
stub = new SimpleExceptionStub(C1StubId::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
stub = new SimpleExceptionStub(StubId::c1_throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
||||||
} else if (x->is_invokespecial_receiver_check()) {
|
} else if (x->is_invokespecial_receiver_check()) {
|
||||||
assert(patching_info == nullptr, "can't patch this");
|
assert(patching_info == nullptr, "can't patch this");
|
||||||
stub = new DeoptimizeStub(info_for_exception,
|
stub = new DeoptimizeStub(info_for_exception,
|
||||||
Deoptimization::Reason_class_check,
|
Deoptimization::Reason_class_check,
|
||||||
Deoptimization::Action_none);
|
Deoptimization::Action_none);
|
||||||
} else {
|
} else {
|
||||||
stub = new SimpleExceptionStub(C1StubId::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
stub = new SimpleExceptionStub(StubId::c1_throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||||
}
|
}
|
||||||
LIR_Opr reg = rlock_result(x);
|
LIR_Opr reg = rlock_result(x);
|
||||||
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
|
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
|
||||||
@@ -1318,7 +1318,7 @@ void LIRGenerator::do_InstanceOf(InstanceOf* x) {
|
|||||||
|
|
||||||
// Intrinsic for Class::isInstance
|
// Intrinsic for Class::isInstance
|
||||||
address LIRGenerator::isInstance_entry() {
|
address LIRGenerator::isInstance_entry() {
|
||||||
return Runtime1::entry_for(C1StubId::is_instance_of_id);
|
return Runtime1::entry_for(StubId::c1_is_instance_of_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LIRGenerator::do_If(If* x) {
|
void LIRGenerator::do_If(If* x) {
|
||||||
|
|||||||
@@ -60,8 +60,6 @@ void C1_MacroAssembler::float_cmp(bool is_float, int unordered_result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
||||||
const int aligned_mask = BytesPerWord -1;
|
|
||||||
const int hdr_offset = oopDesc::mark_offset_in_bytes();
|
|
||||||
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
||||||
int null_check_offset = -1;
|
int null_check_offset = -1;
|
||||||
|
|
||||||
@@ -72,95 +70,20 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr
|
|||||||
|
|
||||||
null_check_offset = offset();
|
null_check_offset = offset();
|
||||||
|
|
||||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
lightweight_lock(disp_hdr, obj, hdr, temp, rscratch2, slow_case);
|
||||||
lightweight_lock(disp_hdr, obj, hdr, temp, rscratch2, slow_case);
|
|
||||||
} else if (LockingMode == LM_LEGACY) {
|
|
||||||
|
|
||||||
if (DiagnoseSyncOnValueBasedClasses != 0) {
|
|
||||||
load_klass(hdr, obj);
|
|
||||||
ldrb(hdr, Address(hdr, Klass::misc_flags_offset()));
|
|
||||||
tst(hdr, KlassFlags::_misc_is_value_based_class);
|
|
||||||
br(Assembler::NE, slow_case);
|
|
||||||
}
|
|
||||||
|
|
||||||
Label done;
|
|
||||||
// Load object header
|
|
||||||
ldr(hdr, Address(obj, hdr_offset));
|
|
||||||
// and mark it as unlocked
|
|
||||||
orr(hdr, hdr, markWord::unlocked_value);
|
|
||||||
// save unlocked object header into the displaced header location on the stack
|
|
||||||
str(hdr, Address(disp_hdr, 0));
|
|
||||||
// test if object header is still the same (i.e. unlocked), and if so, store the
|
|
||||||
// displaced header address in the object header - if it is not the same, get the
|
|
||||||
// object header instead
|
|
||||||
lea(rscratch2, Address(obj, hdr_offset));
|
|
||||||
cmpxchgptr(hdr, disp_hdr, rscratch2, rscratch1, done, /*fallthough*/nullptr);
|
|
||||||
// if the object header was the same, we're done
|
|
||||||
// if the object header was not the same, it is now in the hdr register
|
|
||||||
// => test if it is a stack pointer into the same stack (recursive locking), i.e.:
|
|
||||||
//
|
|
||||||
// 1) (hdr & aligned_mask) == 0
|
|
||||||
// 2) sp <= hdr
|
|
||||||
// 3) hdr <= sp + page_size
|
|
||||||
//
|
|
||||||
// these 3 tests can be done by evaluating the following expression:
|
|
||||||
//
|
|
||||||
// (hdr - sp) & (aligned_mask - page_size)
|
|
||||||
//
|
|
||||||
// assuming both the stack pointer and page_size have their least
|
|
||||||
// significant 2 bits cleared and page_size is a power of 2
|
|
||||||
mov(rscratch1, sp);
|
|
||||||
sub(hdr, hdr, rscratch1);
|
|
||||||
ands(hdr, hdr, aligned_mask - (int)os::vm_page_size());
|
|
||||||
// for recursive locking, the result is zero => save it in the displaced header
|
|
||||||
// location (null in the displaced hdr location indicates recursive locking)
|
|
||||||
str(hdr, Address(disp_hdr, 0));
|
|
||||||
// otherwise we don't care about the result and handle locking via runtime call
|
|
||||||
cbnz(hdr, slow_case);
|
|
||||||
// done
|
|
||||||
bind(done);
|
|
||||||
inc_held_monitor_count(rscratch1);
|
|
||||||
}
|
|
||||||
return null_check_offset;
|
return null_check_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
||||||
const int aligned_mask = BytesPerWord -1;
|
|
||||||
const int hdr_offset = oopDesc::mark_offset_in_bytes();
|
|
||||||
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
||||||
Label done;
|
|
||||||
|
|
||||||
if (LockingMode != LM_LIGHTWEIGHT) {
|
|
||||||
// load displaced header
|
|
||||||
ldr(hdr, Address(disp_hdr, 0));
|
|
||||||
// if the loaded hdr is null we had recursive locking
|
|
||||||
// if we had recursive locking, we are done
|
|
||||||
cbz(hdr, done);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load object
|
// load object
|
||||||
ldr(obj, Address(disp_hdr, BasicObjectLock::obj_offset()));
|
ldr(obj, Address(disp_hdr, BasicObjectLock::obj_offset()));
|
||||||
verify_oop(obj);
|
verify_oop(obj);
|
||||||
|
|
||||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
lightweight_unlock(obj, hdr, temp, rscratch2, slow_case);
|
||||||
lightweight_unlock(obj, hdr, temp, rscratch2, slow_case);
|
|
||||||
} else if (LockingMode == LM_LEGACY) {
|
|
||||||
// test if object header is pointing to the displaced header, and if so, restore
|
|
||||||
// the displaced header in the object - if the object header is not pointing to
|
|
||||||
// the displaced header, get the object header instead
|
|
||||||
// if the object header was not pointing to the displaced header,
|
|
||||||
// we do unlocking via runtime call
|
|
||||||
if (hdr_offset) {
|
|
||||||
lea(rscratch1, Address(obj, hdr_offset));
|
|
||||||
cmpxchgptr(disp_hdr, hdr, rscratch1, rscratch2, done, &slow_case);
|
|
||||||
} else {
|
|
||||||
cmpxchgptr(disp_hdr, hdr, obj, rscratch2, done, &slow_case);
|
|
||||||
}
|
|
||||||
// done
|
|
||||||
bind(done);
|
|
||||||
dec_held_monitor_count(rscratch1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -271,7 +194,7 @@ void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register
|
|||||||
|
|
||||||
if (CURRENT_ENV->dtrace_alloc_probes()) {
|
if (CURRENT_ENV->dtrace_alloc_probes()) {
|
||||||
assert(obj == r0, "must be");
|
assert(obj == r0, "must be");
|
||||||
far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::dtrace_object_alloc_id)));
|
far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_dtrace_object_alloc_id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_oop(obj);
|
verify_oop(obj);
|
||||||
@@ -312,7 +235,7 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register t1,
|
|||||||
|
|
||||||
if (CURRENT_ENV->dtrace_alloc_probes()) {
|
if (CURRENT_ENV->dtrace_alloc_probes()) {
|
||||||
assert(obj == r0, "must be");
|
assert(obj == r0, "must be");
|
||||||
far_call(RuntimeAddress(Runtime1::entry_for(C1StubId::dtrace_object_alloc_id)));
|
far_call(RuntimeAddress(Runtime1::entry_for(StubId::c1_dtrace_object_alloc_id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_oop(obj);
|
verify_oop(obj);
|
||||||
|
|||||||
@@ -99,10 +99,10 @@ int StubAssembler::call_RT(Register oop_result1, Register metadata_result, addre
|
|||||||
if (frame_size() == no_frame_size) {
|
if (frame_size() == no_frame_size) {
|
||||||
leave();
|
leave();
|
||||||
far_jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
|
far_jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
|
||||||
} else if (_stub_id == (int)C1StubId::forward_exception_id) {
|
} else if (_stub_id == (int)StubId::c1_forward_exception_id) {
|
||||||
should_not_reach_here();
|
should_not_reach_here();
|
||||||
} else {
|
} else {
|
||||||
far_jump(RuntimeAddress(Runtime1::entry_for(C1StubId::forward_exception_id)));
|
far_jump(RuntimeAddress(Runtime1::entry_for(StubId::c1_forward_exception_id)));
|
||||||
}
|
}
|
||||||
bind(L);
|
bind(L);
|
||||||
}
|
}
|
||||||
@@ -350,8 +350,8 @@ void Runtime1::initialize_pd() {
|
|||||||
// return: offset in 64-bit words.
|
// return: offset in 64-bit words.
|
||||||
uint Runtime1::runtime_blob_current_thread_offset(frame f) {
|
uint Runtime1::runtime_blob_current_thread_offset(frame f) {
|
||||||
CodeBlob* cb = f.cb();
|
CodeBlob* cb = f.cb();
|
||||||
assert(cb == Runtime1::blob_for(C1StubId::monitorenter_id) ||
|
assert(cb == Runtime1::blob_for(StubId::c1_monitorenter_id) ||
|
||||||
cb == Runtime1::blob_for(C1StubId::monitorenter_nofpu_id), "must be");
|
cb == Runtime1::blob_for(StubId::c1_monitorenter_nofpu_id), "must be");
|
||||||
assert(cb != nullptr && cb->is_runtime_stub(), "invalid frame");
|
assert(cb != nullptr && cb->is_runtime_stub(), "invalid frame");
|
||||||
int offset = cpu_reg_save_offsets[rthread->encoding()];
|
int offset = cpu_reg_save_offsets[rthread->encoding()];
|
||||||
return offset / 2; // SP offsets are in halfwords
|
return offset / 2; // SP offsets are in halfwords
|
||||||
@@ -377,7 +377,7 @@ OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address targe
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OopMapSet* Runtime1::generate_handle_exception(C1StubId id, StubAssembler *sasm) {
|
OopMapSet* Runtime1::generate_handle_exception(StubId id, StubAssembler *sasm) {
|
||||||
__ block_comment("generate_handle_exception");
|
__ block_comment("generate_handle_exception");
|
||||||
|
|
||||||
// incoming parameters
|
// incoming parameters
|
||||||
@@ -389,7 +389,7 @@ OopMapSet* Runtime1::generate_handle_exception(C1StubId id, StubAssembler *sasm)
|
|||||||
OopMapSet* oop_maps = new OopMapSet();
|
OopMapSet* oop_maps = new OopMapSet();
|
||||||
OopMap* oop_map = nullptr;
|
OopMap* oop_map = nullptr;
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case C1StubId::forward_exception_id:
|
case StubId::c1_forward_exception_id:
|
||||||
// We're handling an exception in the context of a compiled frame.
|
// We're handling an exception in the context of a compiled frame.
|
||||||
// The registers have been saved in the standard places. Perform
|
// The registers have been saved in the standard places. Perform
|
||||||
// an exception lookup in the caller and dispatch to the handler
|
// an exception lookup in the caller and dispatch to the handler
|
||||||
@@ -409,12 +409,12 @@ OopMapSet* Runtime1::generate_handle_exception(C1StubId id, StubAssembler *sasm)
|
|||||||
__ str(zr, Address(rthread, JavaThread::vm_result_oop_offset()));
|
__ str(zr, Address(rthread, JavaThread::vm_result_oop_offset()));
|
||||||
__ str(zr, Address(rthread, JavaThread::vm_result_metadata_offset()));
|
__ str(zr, Address(rthread, JavaThread::vm_result_metadata_offset()));
|
||||||
break;
|
break;
|
||||||
case C1StubId::handle_exception_nofpu_id:
|
case StubId::c1_handle_exception_nofpu_id:
|
||||||
case C1StubId::handle_exception_id:
|
case StubId::c1_handle_exception_id:
|
||||||
// At this point all registers MAY be live.
|
// At this point all registers MAY be live.
|
||||||
oop_map = save_live_registers(sasm, id != C1StubId::handle_exception_nofpu_id);
|
oop_map = save_live_registers(sasm, id != StubId::c1_handle_exception_nofpu_id);
|
||||||
break;
|
break;
|
||||||
case C1StubId::handle_exception_from_callee_id: {
|
case StubId::c1_handle_exception_from_callee_id: {
|
||||||
// At this point all registers except exception oop (r0) and
|
// At this point all registers except exception oop (r0) and
|
||||||
// exception pc (lr) are dead.
|
// exception pc (lr) are dead.
|
||||||
const int frame_size = 2 /*fp, return address*/;
|
const int frame_size = 2 /*fp, return address*/;
|
||||||
@@ -472,13 +472,13 @@ OopMapSet* Runtime1::generate_handle_exception(C1StubId id, StubAssembler *sasm)
|
|||||||
__ str(r0, Address(rfp, 1*BytesPerWord));
|
__ str(r0, Address(rfp, 1*BytesPerWord));
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case C1StubId::forward_exception_id:
|
case StubId::c1_forward_exception_id:
|
||||||
case C1StubId::handle_exception_nofpu_id:
|
case StubId::c1_handle_exception_nofpu_id:
|
||||||
case C1StubId::handle_exception_id:
|
case StubId::c1_handle_exception_id:
|
||||||
// Restore the registers that were saved at the beginning.
|
// Restore the registers that were saved at the beginning.
|
||||||
restore_live_registers(sasm, id != C1StubId::handle_exception_nofpu_id);
|
restore_live_registers(sasm, id != StubId::c1_handle_exception_nofpu_id);
|
||||||
break;
|
break;
|
||||||
case C1StubId::handle_exception_from_callee_id:
|
case StubId::c1_handle_exception_from_callee_id:
|
||||||
break;
|
break;
|
||||||
default: ShouldNotReachHere();
|
default: ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
@@ -630,7 +630,7 @@ OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
OopMapSet* Runtime1::generate_code_for(StubId id, StubAssembler* sasm) {
|
||||||
|
|
||||||
const Register exception_oop = r0;
|
const Register exception_oop = r0;
|
||||||
const Register exception_pc = r3;
|
const Register exception_pc = r3;
|
||||||
@@ -647,7 +647,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
OopMap* oop_map = nullptr;
|
OopMap* oop_map = nullptr;
|
||||||
switch (id) {
|
switch (id) {
|
||||||
{
|
{
|
||||||
case C1StubId::forward_exception_id:
|
case StubId::c1_forward_exception_id:
|
||||||
{
|
{
|
||||||
oop_maps = generate_handle_exception(id, sasm);
|
oop_maps = generate_handle_exception(id, sasm);
|
||||||
__ leave();
|
__ leave();
|
||||||
@@ -655,31 +655,31 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_div0_exception_id:
|
case StubId::c1_throw_div0_exception_id:
|
||||||
{ StubFrame f(sasm, "throw_div0_exception", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "throw_div0_exception", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_div0_exception), false);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_div0_exception), false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_null_pointer_exception_id:
|
case StubId::c1_throw_null_pointer_exception_id:
|
||||||
{ StubFrame f(sasm, "throw_null_pointer_exception", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "throw_null_pointer_exception", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_null_pointer_exception), false);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_null_pointer_exception), false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::new_instance_id:
|
case StubId::c1_new_instance_id:
|
||||||
case C1StubId::fast_new_instance_id:
|
case StubId::c1_fast_new_instance_id:
|
||||||
case C1StubId::fast_new_instance_init_check_id:
|
case StubId::c1_fast_new_instance_init_check_id:
|
||||||
{
|
{
|
||||||
Register klass = r3; // Incoming
|
Register klass = r3; // Incoming
|
||||||
Register obj = r0; // Result
|
Register obj = r0; // Result
|
||||||
|
|
||||||
if (id == C1StubId::new_instance_id) {
|
if (id == StubId::c1_new_instance_id) {
|
||||||
__ set_info("new_instance", dont_gc_arguments);
|
__ set_info("new_instance", dont_gc_arguments);
|
||||||
} else if (id == C1StubId::fast_new_instance_id) {
|
} else if (id == StubId::c1_fast_new_instance_id) {
|
||||||
__ set_info("fast new_instance", dont_gc_arguments);
|
__ set_info("fast new_instance", dont_gc_arguments);
|
||||||
} else {
|
} else {
|
||||||
assert(id == C1StubId::fast_new_instance_init_check_id, "bad C1StubId");
|
assert(id == StubId::c1_fast_new_instance_init_check_id, "bad StubId");
|
||||||
__ set_info("fast new_instance init check", dont_gc_arguments);
|
__ set_info("fast new_instance init check", dont_gc_arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -698,7 +698,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::counter_overflow_id:
|
case StubId::c1_counter_overflow_id:
|
||||||
{
|
{
|
||||||
Register bci = r0, method = r1;
|
Register bci = r0, method = r1;
|
||||||
__ enter();
|
__ enter();
|
||||||
@@ -716,14 +716,14 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::new_type_array_id:
|
case StubId::c1_new_type_array_id:
|
||||||
case C1StubId::new_object_array_id:
|
case StubId::c1_new_object_array_id:
|
||||||
{
|
{
|
||||||
Register length = r19; // Incoming
|
Register length = r19; // Incoming
|
||||||
Register klass = r3; // Incoming
|
Register klass = r3; // Incoming
|
||||||
Register obj = r0; // Result
|
Register obj = r0; // Result
|
||||||
|
|
||||||
if (id == C1StubId::new_type_array_id) {
|
if (id == StubId::c1_new_type_array_id) {
|
||||||
__ set_info("new_type_array", dont_gc_arguments);
|
__ set_info("new_type_array", dont_gc_arguments);
|
||||||
} else {
|
} else {
|
||||||
__ set_info("new_object_array", dont_gc_arguments);
|
__ set_info("new_object_array", dont_gc_arguments);
|
||||||
@@ -736,7 +736,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
Register t0 = obj;
|
Register t0 = obj;
|
||||||
__ ldrw(t0, Address(klass, Klass::layout_helper_offset()));
|
__ ldrw(t0, Address(klass, Klass::layout_helper_offset()));
|
||||||
__ asrw(t0, t0, Klass::_lh_array_tag_shift);
|
__ asrw(t0, t0, Klass::_lh_array_tag_shift);
|
||||||
int tag = ((id == C1StubId::new_type_array_id)
|
int tag = ((id == StubId::c1_new_type_array_id)
|
||||||
? Klass::_lh_array_tag_type_value
|
? Klass::_lh_array_tag_type_value
|
||||||
: Klass::_lh_array_tag_obj_value);
|
: Klass::_lh_array_tag_obj_value);
|
||||||
__ mov(rscratch1, tag);
|
__ mov(rscratch1, tag);
|
||||||
@@ -751,7 +751,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
__ enter();
|
__ enter();
|
||||||
OopMap* map = save_live_registers(sasm);
|
OopMap* map = save_live_registers(sasm);
|
||||||
int call_offset;
|
int call_offset;
|
||||||
if (id == C1StubId::new_type_array_id) {
|
if (id == StubId::c1_new_type_array_id) {
|
||||||
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
|
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
|
||||||
} else {
|
} else {
|
||||||
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
|
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
|
||||||
@@ -769,7 +769,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::new_multi_array_id:
|
case StubId::c1_new_multi_array_id:
|
||||||
{ StubFrame f(sasm, "new_multi_array", dont_gc_arguments);
|
{ StubFrame f(sasm, "new_multi_array", dont_gc_arguments);
|
||||||
// r0,: klass
|
// r0,: klass
|
||||||
// r19,: rank
|
// r19,: rank
|
||||||
@@ -789,7 +789,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::register_finalizer_id:
|
case StubId::c1_register_finalizer_id:
|
||||||
{
|
{
|
||||||
__ set_info("register_finalizer", dont_gc_arguments);
|
__ set_info("register_finalizer", dont_gc_arguments);
|
||||||
|
|
||||||
@@ -821,19 +821,19 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_class_cast_exception_id:
|
case StubId::c1_throw_class_cast_exception_id:
|
||||||
{ StubFrame f(sasm, "throw_class_cast_exception", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "throw_class_cast_exception", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_incompatible_class_change_error_id:
|
case StubId::c1_throw_incompatible_class_change_error_id:
|
||||||
{ StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::slow_subtype_check_id:
|
case StubId::c1_slow_subtype_check_id:
|
||||||
{
|
{
|
||||||
// Typical calling sequence:
|
// Typical calling sequence:
|
||||||
// __ push(klass_RInfo); // object klass or other subclass
|
// __ push(klass_RInfo); // object klass or other subclass
|
||||||
@@ -882,10 +882,10 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::monitorenter_nofpu_id:
|
case StubId::c1_monitorenter_nofpu_id:
|
||||||
save_fpu_registers = false;
|
save_fpu_registers = false;
|
||||||
// fall through
|
// fall through
|
||||||
case C1StubId::monitorenter_id:
|
case StubId::c1_monitorenter_id:
|
||||||
{
|
{
|
||||||
StubFrame f(sasm, "monitorenter", dont_gc_arguments, requires_pop_epilogue_return);
|
StubFrame f(sasm, "monitorenter", dont_gc_arguments, requires_pop_epilogue_return);
|
||||||
OopMap* map = save_live_registers(sasm, save_fpu_registers);
|
OopMap* map = save_live_registers(sasm, save_fpu_registers);
|
||||||
@@ -903,7 +903,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::is_instance_of_id:
|
case StubId::c1_is_instance_of_id:
|
||||||
{
|
{
|
||||||
// Mirror: c_rarg0
|
// Mirror: c_rarg0
|
||||||
// Object: c_rarg1
|
// Object: c_rarg1
|
||||||
@@ -952,10 +952,10 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::monitorexit_nofpu_id:
|
case StubId::c1_monitorexit_nofpu_id:
|
||||||
save_fpu_registers = false;
|
save_fpu_registers = false;
|
||||||
// fall through
|
// fall through
|
||||||
case C1StubId::monitorexit_id:
|
case StubId::c1_monitorexit_id:
|
||||||
{
|
{
|
||||||
StubFrame f(sasm, "monitorexit", dont_gc_arguments);
|
StubFrame f(sasm, "monitorexit", dont_gc_arguments);
|
||||||
OopMap* map = save_live_registers(sasm, save_fpu_registers);
|
OopMap* map = save_live_registers(sasm, save_fpu_registers);
|
||||||
@@ -975,7 +975,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::deoptimize_id:
|
case StubId::c1_deoptimize_id:
|
||||||
{
|
{
|
||||||
StubFrame f(sasm, "deoptimize", dont_gc_arguments, does_not_return);
|
StubFrame f(sasm, "deoptimize", dont_gc_arguments, does_not_return);
|
||||||
OopMap* oop_map = save_live_registers(sasm);
|
OopMap* oop_map = save_live_registers(sasm);
|
||||||
@@ -992,13 +992,13 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_range_check_failed_id:
|
case StubId::c1_throw_range_check_failed_id:
|
||||||
{ StubFrame f(sasm, "range_check_failed", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "range_check_failed", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_range_check_exception), true);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_range_check_exception), true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::unwind_exception_id:
|
case StubId::c1_unwind_exception_id:
|
||||||
{ __ set_info("unwind_exception", dont_gc_arguments);
|
{ __ set_info("unwind_exception", dont_gc_arguments);
|
||||||
// note: no stubframe since we are about to leave the current
|
// note: no stubframe since we are about to leave the current
|
||||||
// activation and we are calling a leaf VM function only.
|
// activation and we are calling a leaf VM function only.
|
||||||
@@ -1006,54 +1006,54 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::access_field_patching_id:
|
case StubId::c1_access_field_patching_id:
|
||||||
{ StubFrame f(sasm, "access_field_patching", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "access_field_patching", dont_gc_arguments, does_not_return);
|
||||||
// we should set up register map
|
// we should set up register map
|
||||||
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
|
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::load_klass_patching_id:
|
case StubId::c1_load_klass_patching_id:
|
||||||
{ StubFrame f(sasm, "load_klass_patching", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "load_klass_patching", dont_gc_arguments, does_not_return);
|
||||||
// we should set up register map
|
// we should set up register map
|
||||||
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
|
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::load_mirror_patching_id:
|
case StubId::c1_load_mirror_patching_id:
|
||||||
{ StubFrame f(sasm, "load_mirror_patching", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "load_mirror_patching", dont_gc_arguments, does_not_return);
|
||||||
// we should set up register map
|
// we should set up register map
|
||||||
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_mirror_patching));
|
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_mirror_patching));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::load_appendix_patching_id:
|
case StubId::c1_load_appendix_patching_id:
|
||||||
{ StubFrame f(sasm, "load_appendix_patching", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "load_appendix_patching", dont_gc_arguments, does_not_return);
|
||||||
// we should set up register map
|
// we should set up register map
|
||||||
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
|
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::handle_exception_nofpu_id:
|
case StubId::c1_handle_exception_nofpu_id:
|
||||||
case C1StubId::handle_exception_id:
|
case StubId::c1_handle_exception_id:
|
||||||
{ StubFrame f(sasm, "handle_exception", dont_gc_arguments);
|
{ StubFrame f(sasm, "handle_exception", dont_gc_arguments);
|
||||||
oop_maps = generate_handle_exception(id, sasm);
|
oop_maps = generate_handle_exception(id, sasm);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::handle_exception_from_callee_id:
|
case StubId::c1_handle_exception_from_callee_id:
|
||||||
{ StubFrame f(sasm, "handle_exception_from_callee", dont_gc_arguments);
|
{ StubFrame f(sasm, "handle_exception_from_callee", dont_gc_arguments);
|
||||||
oop_maps = generate_handle_exception(id, sasm);
|
oop_maps = generate_handle_exception(id, sasm);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_index_exception_id:
|
case StubId::c1_throw_index_exception_id:
|
||||||
{ StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments, does_not_return);
|
||||||
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
|
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::throw_array_store_exception_id:
|
case StubId::c1_throw_array_store_exception_id:
|
||||||
{ StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments, does_not_return);
|
{ StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments, does_not_return);
|
||||||
// tos + 0: link
|
// tos + 0: link
|
||||||
// + 1: return address
|
// + 1: return address
|
||||||
@@ -1061,7 +1061,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::predicate_failed_trap_id:
|
case StubId::c1_predicate_failed_trap_id:
|
||||||
{
|
{
|
||||||
StubFrame f(sasm, "predicate_failed_trap", dont_gc_arguments, does_not_return);
|
StubFrame f(sasm, "predicate_failed_trap", dont_gc_arguments, does_not_return);
|
||||||
|
|
||||||
@@ -1079,7 +1079,7 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case C1StubId::dtrace_object_alloc_id:
|
case StubId::c1_dtrace_object_alloc_id:
|
||||||
{ // c_rarg0: object
|
{ // c_rarg0: object
|
||||||
StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
|
StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
|
||||||
save_live_registers(sasm);
|
save_live_registers(sasm);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@@ -43,15 +43,15 @@ define_pd_global(intx, CompileThreshold, 1500 );
|
|||||||
|
|
||||||
define_pd_global(intx, OnStackReplacePercentage, 933 );
|
define_pd_global(intx, OnStackReplacePercentage, 933 );
|
||||||
define_pd_global(intx, NewSizeThreadIncrease, 4*K );
|
define_pd_global(intx, NewSizeThreadIncrease, 4*K );
|
||||||
define_pd_global(intx, InitialCodeCacheSize, 160*K);
|
define_pd_global(size_t, InitialCodeCacheSize, 160*K);
|
||||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
|
define_pd_global(size_t, ReservedCodeCacheSize, 32*M );
|
||||||
define_pd_global(intx, NonProfiledCodeHeapSize, 13*M );
|
define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M );
|
||||||
define_pd_global(intx, ProfiledCodeHeapSize, 14*M );
|
define_pd_global(size_t, ProfiledCodeHeapSize, 14*M );
|
||||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M );
|
||||||
define_pd_global(bool, ProfileInterpreter, false);
|
define_pd_global(bool, ProfileInterpreter, false);
|
||||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K );
|
define_pd_global(size_t, CodeCacheExpansionSize, 32*K );
|
||||||
define_pd_global(uintx, CodeCacheMinBlockLength, 1);
|
define_pd_global(size_t, CodeCacheMinBlockLength, 1);
|
||||||
define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
|
define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K);
|
||||||
define_pd_global(bool, NeverActAsServerClassMachine, true );
|
define_pd_global(bool, NeverActAsServerClassMachine, true );
|
||||||
define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||||
define_pd_global(bool, CICompileOSR, true );
|
define_pd_global(bool, CICompileOSR, true );
|
||||||
|
|||||||
@@ -147,215 +147,8 @@ address C2_MacroAssembler::arrays_hashcode(Register ary, Register cnt, Register
|
|||||||
return pc();
|
return pc();
|
||||||
}
|
}
|
||||||
|
|
||||||
void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register tmpReg,
|
|
||||||
Register tmp2Reg, Register tmp3Reg) {
|
|
||||||
Register oop = objectReg;
|
|
||||||
Register box = boxReg;
|
|
||||||
Register disp_hdr = tmpReg;
|
|
||||||
Register tmp = tmp2Reg;
|
|
||||||
Label cont;
|
|
||||||
Label object_has_monitor;
|
|
||||||
Label count, no_count;
|
|
||||||
|
|
||||||
assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_lock_lightweight");
|
|
||||||
assert_different_registers(oop, box, tmp, disp_hdr, rscratch2);
|
|
||||||
|
|
||||||
// Load markWord from object into displaced_header.
|
|
||||||
ldr(disp_hdr, Address(oop, oopDesc::mark_offset_in_bytes()));
|
|
||||||
|
|
||||||
if (DiagnoseSyncOnValueBasedClasses != 0) {
|
|
||||||
load_klass(tmp, oop);
|
|
||||||
ldrb(tmp, Address(tmp, Klass::misc_flags_offset()));
|
|
||||||
tst(tmp, KlassFlags::_misc_is_value_based_class);
|
|
||||||
br(Assembler::NE, cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for existing monitor
|
|
||||||
tbnz(disp_hdr, exact_log2(markWord::monitor_value), object_has_monitor);
|
|
||||||
|
|
||||||
if (LockingMode == LM_MONITOR) {
|
|
||||||
tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
|
||||||
b(cont);
|
|
||||||
} else {
|
|
||||||
assert(LockingMode == LM_LEGACY, "must be");
|
|
||||||
// Set tmp to be (markWord of object | UNLOCK_VALUE).
|
|
||||||
orr(tmp, disp_hdr, markWord::unlocked_value);
|
|
||||||
|
|
||||||
// Initialize the box. (Must happen before we update the object mark!)
|
|
||||||
str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
|
||||||
|
|
||||||
// Compare object markWord with an unlocked value (tmp) and if
|
|
||||||
// equal exchange the stack address of our box with object markWord.
|
|
||||||
// On failure disp_hdr contains the possibly locked markWord.
|
|
||||||
cmpxchg(oop, tmp, box, Assembler::xword, /*acquire*/ true,
|
|
||||||
/*release*/ true, /*weak*/ false, disp_hdr);
|
|
||||||
br(Assembler::EQ, cont);
|
|
||||||
|
|
||||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
|
||||||
|
|
||||||
// If the compare-and-exchange succeeded, then we found an unlocked
|
|
||||||
// object, will have now locked it will continue at label cont
|
|
||||||
|
|
||||||
// Check if the owner is self by comparing the value in the
|
|
||||||
// markWord of object (disp_hdr) with the stack pointer.
|
|
||||||
mov(rscratch1, sp);
|
|
||||||
sub(disp_hdr, disp_hdr, rscratch1);
|
|
||||||
mov(tmp, (address) (~(os::vm_page_size()-1) | markWord::lock_mask_in_place));
|
|
||||||
// If condition is true we are cont and hence we can store 0 as the
|
|
||||||
// displaced header in the box, which indicates that it is a recursive lock.
|
|
||||||
ands(tmp/*==0?*/, disp_hdr, tmp); // Sets flags for result
|
|
||||||
str(tmp/*==0, perhaps*/, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
|
||||||
b(cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle existing monitor.
|
|
||||||
bind(object_has_monitor);
|
|
||||||
|
|
||||||
// Try to CAS owner (no owner => current thread's _monitor_owner_id).
|
|
||||||
ldr(rscratch2, Address(rthread, JavaThread::monitor_owner_id_offset()));
|
|
||||||
add(tmp, disp_hdr, (in_bytes(ObjectMonitor::owner_offset())-markWord::monitor_value));
|
|
||||||
cmpxchg(tmp, zr, rscratch2, Assembler::xword, /*acquire*/ true,
|
|
||||||
/*release*/ true, /*weak*/ false, tmp3Reg); // Sets flags for result
|
|
||||||
|
|
||||||
// Store a non-null value into the box to avoid looking like a re-entrant
|
|
||||||
// lock. The fast-path monitor unlock code checks for
|
|
||||||
// markWord::monitor_value so use markWord::unused_mark which has the
|
|
||||||
// relevant bit set, and also matches ObjectSynchronizer::enter.
|
|
||||||
mov(tmp, (address)markWord::unused_mark().value());
|
|
||||||
str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
|
||||||
|
|
||||||
br(Assembler::EQ, cont); // CAS success means locking succeeded
|
|
||||||
|
|
||||||
cmp(tmp3Reg, rscratch2);
|
|
||||||
br(Assembler::NE, cont); // Check for recursive locking
|
|
||||||
|
|
||||||
// Recursive lock case
|
|
||||||
increment(Address(disp_hdr, in_bytes(ObjectMonitor::recursions_offset()) - markWord::monitor_value), 1);
|
|
||||||
// flag == EQ still from the cmp above, checking if this is a reentrant lock
|
|
||||||
|
|
||||||
bind(cont);
|
|
||||||
// flag == EQ indicates success
|
|
||||||
// flag == NE indicates failure
|
|
||||||
br(Assembler::NE, no_count);
|
|
||||||
|
|
||||||
bind(count);
|
|
||||||
if (LockingMode == LM_LEGACY) {
|
|
||||||
inc_held_monitor_count(rscratch1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bind(no_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
void C2_MacroAssembler::fast_unlock(Register objectReg, Register boxReg, Register tmpReg,
|
|
||||||
Register tmp2Reg) {
|
|
||||||
Register oop = objectReg;
|
|
||||||
Register box = boxReg;
|
|
||||||
Register disp_hdr = tmpReg;
|
|
||||||
Register owner_addr = tmpReg;
|
|
||||||
Register tmp = tmp2Reg;
|
|
||||||
Label cont;
|
|
||||||
Label object_has_monitor;
|
|
||||||
Label count, no_count;
|
|
||||||
Label unlocked;
|
|
||||||
|
|
||||||
assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_unlock_lightweight");
|
|
||||||
assert_different_registers(oop, box, tmp, disp_hdr);
|
|
||||||
|
|
||||||
if (LockingMode == LM_LEGACY) {
|
|
||||||
// Find the lock address and load the displaced header from the stack.
|
|
||||||
ldr(disp_hdr, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
|
||||||
|
|
||||||
// If the displaced header is 0, we have a recursive unlock.
|
|
||||||
cmp(disp_hdr, zr);
|
|
||||||
br(Assembler::EQ, cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle existing monitor.
|
|
||||||
ldr(tmp, Address(oop, oopDesc::mark_offset_in_bytes()));
|
|
||||||
tbnz(tmp, exact_log2(markWord::monitor_value), object_has_monitor);
|
|
||||||
|
|
||||||
if (LockingMode == LM_MONITOR) {
|
|
||||||
tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
|
||||||
b(cont);
|
|
||||||
} else {
|
|
||||||
assert(LockingMode == LM_LEGACY, "must be");
|
|
||||||
// Check if it is still a light weight lock, this is is true if we
|
|
||||||
// see the stack address of the basicLock in the markWord of the
|
|
||||||
// object.
|
|
||||||
|
|
||||||
cmpxchg(oop, box, disp_hdr, Assembler::xword, /*acquire*/ false,
|
|
||||||
/*release*/ true, /*weak*/ false, tmp);
|
|
||||||
b(cont);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
|
||||||
|
|
||||||
// Handle existing monitor.
|
|
||||||
bind(object_has_monitor);
|
|
||||||
STATIC_ASSERT(markWord::monitor_value <= INT_MAX);
|
|
||||||
add(tmp, tmp, -(int)markWord::monitor_value); // monitor
|
|
||||||
|
|
||||||
ldr(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
|
||||||
|
|
||||||
Label notRecursive;
|
|
||||||
cbz(disp_hdr, notRecursive);
|
|
||||||
|
|
||||||
// Recursive lock
|
|
||||||
sub(disp_hdr, disp_hdr, 1u);
|
|
||||||
str(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
|
||||||
cmp(disp_hdr, disp_hdr); // Sets flags for result
|
|
||||||
b(cont);
|
|
||||||
|
|
||||||
bind(notRecursive);
|
|
||||||
|
|
||||||
// Compute owner address.
|
|
||||||
lea(owner_addr, Address(tmp, ObjectMonitor::owner_offset()));
|
|
||||||
|
|
||||||
// Set owner to null.
|
|
||||||
// Release to satisfy the JMM
|
|
||||||
stlr(zr, owner_addr);
|
|
||||||
// We need a full fence after clearing owner to avoid stranding.
|
|
||||||
// StoreLoad achieves this.
|
|
||||||
membar(StoreLoad);
|
|
||||||
|
|
||||||
// Check if the entry_list is empty.
|
|
||||||
ldr(rscratch1, Address(tmp, ObjectMonitor::entry_list_offset()));
|
|
||||||
cmp(rscratch1, zr);
|
|
||||||
br(Assembler::EQ, cont); // If so we are done.
|
|
||||||
|
|
||||||
// Check if there is a successor.
|
|
||||||
ldr(rscratch1, Address(tmp, ObjectMonitor::succ_offset()));
|
|
||||||
cmp(rscratch1, zr);
|
|
||||||
br(Assembler::NE, unlocked); // If so we are done.
|
|
||||||
|
|
||||||
// Save the monitor pointer in the current thread, so we can try to
|
|
||||||
// reacquire the lock in SharedRuntime::monitor_exit_helper().
|
|
||||||
str(tmp, Address(rthread, JavaThread::unlocked_inflated_monitor_offset()));
|
|
||||||
|
|
||||||
cmp(zr, rthread); // Set Flag to NE => slow path
|
|
||||||
b(cont);
|
|
||||||
|
|
||||||
bind(unlocked);
|
|
||||||
cmp(zr, zr); // Set Flag to EQ => fast path
|
|
||||||
|
|
||||||
// Intentional fall-through
|
|
||||||
|
|
||||||
bind(cont);
|
|
||||||
// flag == EQ indicates success
|
|
||||||
// flag == NE indicates failure
|
|
||||||
br(Assembler::NE, no_count);
|
|
||||||
|
|
||||||
bind(count);
|
|
||||||
if (LockingMode == LM_LEGACY) {
|
|
||||||
dec_held_monitor_count(rscratch1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bind(no_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register t1,
|
void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register t1,
|
||||||
Register t2, Register t3) {
|
Register t2, Register t3) {
|
||||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
|
||||||
assert_different_registers(obj, box, t1, t2, t3, rscratch2);
|
assert_different_registers(obj, box, t1, t2, t3, rscratch2);
|
||||||
|
|
||||||
// Handle inflated monitor.
|
// Handle inflated monitor.
|
||||||
@@ -512,7 +305,6 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist
|
|||||||
|
|
||||||
void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register t1,
|
void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register t1,
|
||||||
Register t2, Register t3) {
|
Register t2, Register t3) {
|
||||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
|
||||||
assert_different_registers(obj, box, t1, t2, t3);
|
assert_different_registers(obj, box, t1, t2, t3);
|
||||||
|
|
||||||
// Handle inflated monitor.
|
// Handle inflated monitor.
|
||||||
@@ -1778,19 +1570,21 @@ void C2_MacroAssembler::sve_vmask_lasttrue(Register dst, BasicType bt, PRegister
|
|||||||
void C2_MacroAssembler::neon_vector_extend(FloatRegister dst, BasicType dst_bt, unsigned dst_vlen_in_bytes,
|
void C2_MacroAssembler::neon_vector_extend(FloatRegister dst, BasicType dst_bt, unsigned dst_vlen_in_bytes,
|
||||||
FloatRegister src, BasicType src_bt, bool is_unsigned) {
|
FloatRegister src, BasicType src_bt, bool is_unsigned) {
|
||||||
if (src_bt == T_BYTE) {
|
if (src_bt == T_BYTE) {
|
||||||
if (dst_bt == T_SHORT) {
|
// 4B to 4S/4I, 8B to 8S
|
||||||
// 4B/8B to 4S/8S
|
assert(dst_vlen_in_bytes == 8 || dst_vlen_in_bytes == 16, "unsupported");
|
||||||
_xshll(is_unsigned, dst, T8H, src, T8B, 0);
|
assert(dst_bt == T_SHORT || dst_bt == T_INT, "unsupported");
|
||||||
} else {
|
_xshll(is_unsigned, dst, T8H, src, T8B, 0);
|
||||||
// 4B to 4I
|
if (dst_bt == T_INT) {
|
||||||
assert(dst_vlen_in_bytes == 16 && dst_bt == T_INT, "unsupported");
|
|
||||||
_xshll(is_unsigned, dst, T8H, src, T8B, 0);
|
|
||||||
_xshll(is_unsigned, dst, T4S, dst, T4H, 0);
|
_xshll(is_unsigned, dst, T4S, dst, T4H, 0);
|
||||||
}
|
}
|
||||||
} else if (src_bt == T_SHORT) {
|
} else if (src_bt == T_SHORT) {
|
||||||
// 4S to 4I
|
// 2S to 2I/2L, 4S to 4I
|
||||||
assert(dst_vlen_in_bytes == 16 && dst_bt == T_INT, "unsupported");
|
assert(dst_vlen_in_bytes == 8 || dst_vlen_in_bytes == 16, "unsupported");
|
||||||
|
assert(dst_bt == T_INT || dst_bt == T_LONG, "unsupported");
|
||||||
_xshll(is_unsigned, dst, T4S, src, T4H, 0);
|
_xshll(is_unsigned, dst, T4S, src, T4H, 0);
|
||||||
|
if (dst_bt == T_LONG) {
|
||||||
|
_xshll(is_unsigned, dst, T2D, dst, T2S, 0);
|
||||||
|
}
|
||||||
} else if (src_bt == T_INT) {
|
} else if (src_bt == T_INT) {
|
||||||
// 2I to 2L
|
// 2I to 2L
|
||||||
assert(dst_vlen_in_bytes == 16 && dst_bt == T_LONG, "unsupported");
|
assert(dst_vlen_in_bytes == 16 && dst_bt == T_LONG, "unsupported");
|
||||||
@@ -1810,18 +1604,21 @@ void C2_MacroAssembler::neon_vector_narrow(FloatRegister dst, BasicType dst_bt,
|
|||||||
assert(dst_bt == T_BYTE, "unsupported");
|
assert(dst_bt == T_BYTE, "unsupported");
|
||||||
xtn(dst, T8B, src, T8H);
|
xtn(dst, T8B, src, T8H);
|
||||||
} else if (src_bt == T_INT) {
|
} else if (src_bt == T_INT) {
|
||||||
// 4I to 4B/4S
|
// 2I to 2S, 4I to 4B/4S
|
||||||
assert(src_vlen_in_bytes == 16, "unsupported");
|
assert(src_vlen_in_bytes == 8 || src_vlen_in_bytes == 16, "unsupported");
|
||||||
assert(dst_bt == T_BYTE || dst_bt == T_SHORT, "unsupported");
|
assert(dst_bt == T_BYTE || dst_bt == T_SHORT, "unsupported");
|
||||||
xtn(dst, T4H, src, T4S);
|
xtn(dst, T4H, src, T4S);
|
||||||
if (dst_bt == T_BYTE) {
|
if (dst_bt == T_BYTE) {
|
||||||
xtn(dst, T8B, dst, T8H);
|
xtn(dst, T8B, dst, T8H);
|
||||||
}
|
}
|
||||||
} else if (src_bt == T_LONG) {
|
} else if (src_bt == T_LONG) {
|
||||||
// 2L to 2I
|
// 2L to 2S/2I
|
||||||
assert(src_vlen_in_bytes == 16, "unsupported");
|
assert(src_vlen_in_bytes == 16, "unsupported");
|
||||||
assert(dst_bt == T_INT, "unsupported");
|
assert(dst_bt == T_INT || dst_bt == T_SHORT, "unsupported");
|
||||||
xtn(dst, T2S, src, T2D);
|
xtn(dst, T2S, src, T2D);
|
||||||
|
if (dst_bt == T_SHORT) {
|
||||||
|
xtn(dst, T4H, dst, T4S);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
@@ -2853,3 +2650,124 @@ void C2_MacroAssembler::reconstruct_frame_pointer(Register rtmp) {
|
|||||||
add(rfp, sp, framesize - 2 * wordSize);
|
add(rfp, sp, framesize - 2 * wordSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Selects elements from two source vectors (src1, src2) based on index values in the index register
|
||||||
|
// using Neon instructions and places it in the destination vector element corresponding to the
|
||||||
|
// index vector element. Each index in the index register must be in the range - [0, 2 * NUM_ELEM),
|
||||||
|
// where NUM_ELEM is the number of BasicType elements per vector.
|
||||||
|
// If idx < NUM_ELEM --> selects src1[idx] (idx is an element of the index register)
|
||||||
|
// Otherwise, selects src2[idx – NUM_ELEM]
|
||||||
|
void C2_MacroAssembler::select_from_two_vectors_neon(FloatRegister dst, FloatRegister src1,
|
||||||
|
FloatRegister src2, FloatRegister index,
|
||||||
|
FloatRegister tmp, unsigned vector_length_in_bytes) {
|
||||||
|
assert_different_registers(dst, src1, src2, tmp);
|
||||||
|
SIMD_Arrangement size = vector_length_in_bytes == 16 ? T16B : T8B;
|
||||||
|
|
||||||
|
if (vector_length_in_bytes == 16) {
|
||||||
|
assert(UseSVE <= 1, "sve must be <= 1");
|
||||||
|
assert(src1->successor() == src2, "Source registers must be ordered");
|
||||||
|
// If the vector length is 16B, then use the Neon "tbl" instruction with two vector table
|
||||||
|
tbl(dst, size, src1, 2, index);
|
||||||
|
} else { // vector length == 8
|
||||||
|
assert(UseSVE == 0, "must be Neon only");
|
||||||
|
// We need to fit both the source vectors (src1, src2) in a 128-bit register because the
|
||||||
|
// Neon "tbl" instruction supports only looking up 16B vectors. We then use the Neon "tbl"
|
||||||
|
// instruction with one vector lookup
|
||||||
|
ins(tmp, D, src1, 0, 0);
|
||||||
|
ins(tmp, D, src2, 1, 0);
|
||||||
|
tbl(dst, size, tmp, 1, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Selects elements from two source vectors (src1, src2) based on index values in the index register
|
||||||
|
// using SVE/SVE2 instructions and places it in the destination vector element corresponding to the
|
||||||
|
// index vector element. Each index in the index register must be in the range - [0, 2 * NUM_ELEM),
|
||||||
|
// where NUM_ELEM is the number of BasicType elements per vector.
|
||||||
|
// If idx < NUM_ELEM --> selects src1[idx] (idx is an element of the index register)
|
||||||
|
// Otherwise, selects src2[idx – NUM_ELEM]
|
||||||
|
void C2_MacroAssembler::select_from_two_vectors_sve(FloatRegister dst, FloatRegister src1,
|
||||||
|
FloatRegister src2, FloatRegister index,
|
||||||
|
FloatRegister tmp, SIMD_RegVariant T,
|
||||||
|
unsigned vector_length_in_bytes) {
|
||||||
|
assert_different_registers(dst, src1, src2, index, tmp);
|
||||||
|
|
||||||
|
if (vector_length_in_bytes == 8) {
|
||||||
|
// We need to fit both the source vectors (src1, src2) in a single vector register because the
|
||||||
|
// SVE "tbl" instruction is unpredicated and works on the entire vector which can lead to
|
||||||
|
// incorrect results if each source vector is only partially filled. We then use the SVE "tbl"
|
||||||
|
// instruction with one vector lookup
|
||||||
|
assert(UseSVE >= 1, "sve must be >= 1");
|
||||||
|
ins(tmp, D, src1, 0, 0);
|
||||||
|
ins(tmp, D, src2, 1, 0);
|
||||||
|
sve_tbl(dst, T, tmp, index);
|
||||||
|
} else { // UseSVE == 2 and vector_length_in_bytes > 8
|
||||||
|
// If the vector length is > 8, then use the SVE2 "tbl" instruction with the two vector table.
|
||||||
|
// The assertion - vector_length_in_bytes == MaxVectorSize ensures that this operation
|
||||||
|
// is not executed on machines where vector_length_in_bytes < MaxVectorSize
|
||||||
|
// with the only exception of 8B vector length.
|
||||||
|
assert(UseSVE == 2 && vector_length_in_bytes == MaxVectorSize, "must be");
|
||||||
|
assert(src1->successor() == src2, "Source registers must be ordered");
|
||||||
|
sve_tbl(dst, T, src1, src2, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void C2_MacroAssembler::select_from_two_vectors(FloatRegister dst, FloatRegister src1,
|
||||||
|
FloatRegister src2, FloatRegister index,
|
||||||
|
FloatRegister tmp, BasicType bt,
|
||||||
|
unsigned vector_length_in_bytes) {
|
||||||
|
|
||||||
|
assert_different_registers(dst, src1, src2, index, tmp);
|
||||||
|
|
||||||
|
// The cases that can reach this method are -
|
||||||
|
// - UseSVE = 0, vector_length_in_bytes = 8 or 16
|
||||||
|
// - UseSVE = 1, vector_length_in_bytes = 8 or 16
|
||||||
|
// - UseSVE = 2, vector_length_in_bytes >= 8
|
||||||
|
//
|
||||||
|
// SVE/SVE2 tbl instructions are generated when UseSVE = 1 with vector_length_in_bytes = 8
|
||||||
|
// and UseSVE = 2 with vector_length_in_bytes >= 8
|
||||||
|
//
|
||||||
|
// Neon instructions are generated when UseSVE = 0 with vector_length_in_bytes = 8 or 16 and
|
||||||
|
// UseSVE = 1 with vector_length_in_bytes = 16
|
||||||
|
|
||||||
|
if ((UseSVE == 1 && vector_length_in_bytes == 8) || UseSVE == 2) {
|
||||||
|
SIMD_RegVariant T = elemType_to_regVariant(bt);
|
||||||
|
select_from_two_vectors_sve(dst, src1, src2, index, tmp, T, vector_length_in_bytes);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The only BasicTypes that can reach here are T_SHORT, T_BYTE, T_INT and T_FLOAT
|
||||||
|
assert(bt != T_DOUBLE && bt != T_LONG, "unsupported basic type");
|
||||||
|
assert(vector_length_in_bytes <= 16, "length_in_bytes must be <= 16");
|
||||||
|
|
||||||
|
bool isQ = vector_length_in_bytes == 16;
|
||||||
|
|
||||||
|
SIMD_Arrangement size1 = isQ ? T16B : T8B;
|
||||||
|
SIMD_Arrangement size2 = esize2arrangement((uint)type2aelembytes(bt), isQ);
|
||||||
|
|
||||||
|
// Neon "tbl" instruction only supports byte tables, so we need to look at chunks of
|
||||||
|
// 2B for selecting shorts or chunks of 4B for selecting ints/floats from the table.
|
||||||
|
// The index values in "index" register are in the range of [0, 2 * NUM_ELEM) where NUM_ELEM
|
||||||
|
// is the number of elements that can fit in a vector. For ex. for T_SHORT with 64-bit vector length,
|
||||||
|
// the indices can range from [0, 8).
|
||||||
|
// As an example with 64-bit vector length and T_SHORT type - let index = [2, 5, 1, 0]
|
||||||
|
// Move a constant 0x02 in every byte of tmp - tmp = [0x0202, 0x0202, 0x0202, 0x0202]
|
||||||
|
// Multiply index vector with tmp to yield - dst = [0x0404, 0x0a0a, 0x0202, 0x0000]
|
||||||
|
// Move a constant 0x0100 in every 2B of tmp - tmp = [0x0100, 0x0100, 0x0100, 0x0100]
|
||||||
|
// Add the multiplied result to the vector in tmp to obtain the byte level
|
||||||
|
// offsets - dst = [0x0504, 0x0b0a, 0x0302, 0x0100]
|
||||||
|
// Use these offsets in the "tbl" instruction to select chunks of 2B.
|
||||||
|
|
||||||
|
if (bt == T_BYTE) {
|
||||||
|
select_from_two_vectors_neon(dst, src1, src2, index, tmp, vector_length_in_bytes);
|
||||||
|
} else {
|
||||||
|
int elem_size = (bt == T_SHORT) ? 2 : 4;
|
||||||
|
uint64_t tbl_offset = (bt == T_SHORT) ? 0x0100u : 0x03020100u;
|
||||||
|
|
||||||
|
mov(tmp, size1, elem_size);
|
||||||
|
mulv(dst, size2, index, tmp);
|
||||||
|
mov(tmp, size2, tbl_offset);
|
||||||
|
addv(dst, size1, dst, tmp); // "dst" now contains the processed index elements
|
||||||
|
// to select a set of 2B/4B
|
||||||
|
select_from_two_vectors_neon(dst, src1, src2, dst, tmp, vector_length_in_bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,15 @@
|
|||||||
void neon_reduce_logical_helper(int opc, bool sf, Register Rd, Register Rn, Register Rm,
|
void neon_reduce_logical_helper(int opc, bool sf, Register Rd, Register Rn, Register Rm,
|
||||||
enum shift_kind kind = Assembler::LSL, unsigned shift = 0);
|
enum shift_kind kind = Assembler::LSL, unsigned shift = 0);
|
||||||
|
|
||||||
|
void select_from_two_vectors_neon(FloatRegister dst, FloatRegister src1,
|
||||||
|
FloatRegister src2, FloatRegister index,
|
||||||
|
FloatRegister tmp, unsigned vector_length_in_bytes);
|
||||||
|
|
||||||
|
void select_from_two_vectors_sve(FloatRegister dst, FloatRegister src1,
|
||||||
|
FloatRegister src2, FloatRegister index,
|
||||||
|
FloatRegister tmp, SIMD_RegVariant T,
|
||||||
|
unsigned vector_length_in_bytes);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// jdk.internal.util.ArraysSupport.vectorizedHashCode
|
// jdk.internal.util.ArraysSupport.vectorizedHashCode
|
||||||
address arrays_hashcode(Register ary, Register cnt, Register result, FloatRegister vdata0,
|
address arrays_hashcode(Register ary, Register cnt, Register result, FloatRegister vdata0,
|
||||||
@@ -42,9 +51,6 @@
|
|||||||
FloatRegister vmul3, FloatRegister vpow, FloatRegister vpowm,
|
FloatRegister vmul3, FloatRegister vpow, FloatRegister vpowm,
|
||||||
BasicType eltype);
|
BasicType eltype);
|
||||||
|
|
||||||
// Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file.
|
|
||||||
void fast_lock(Register object, Register box, Register tmp, Register tmp2, Register tmp3);
|
|
||||||
void fast_unlock(Register object, Register box, Register tmp, Register tmp2);
|
|
||||||
// Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file.
|
// Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file.
|
||||||
void fast_lock_lightweight(Register object, Register box, Register t1, Register t2, Register t3);
|
void fast_lock_lightweight(Register object, Register box, Register t1, Register t2, Register t3);
|
||||||
void fast_unlock_lightweight(Register object, Register box, Register t1, Register t2, Register t3);
|
void fast_unlock_lightweight(Register object, Register box, Register t1, Register t2, Register t3);
|
||||||
@@ -193,4 +199,9 @@
|
|||||||
|
|
||||||
void reconstruct_frame_pointer(Register rtmp);
|
void reconstruct_frame_pointer(Register rtmp);
|
||||||
|
|
||||||
|
// Select from a table of two vectors
|
||||||
|
void select_from_two_vectors(FloatRegister dst, FloatRegister src1, FloatRegister src2,
|
||||||
|
FloatRegister index, FloatRegister tmp, BasicType bt,
|
||||||
|
unsigned vector_length_in_bytes);
|
||||||
|
|
||||||
#endif // CPU_AARCH64_C2_MACROASSEMBLER_AARCH64_HPP
|
#endif // CPU_AARCH64_C2_MACROASSEMBLER_AARCH64_HPP
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@@ -51,8 +51,8 @@ define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K));
|
|||||||
define_pd_global(intx, LoopUnrollLimit, 60);
|
define_pd_global(intx, LoopUnrollLimit, 60);
|
||||||
define_pd_global(intx, LoopPercentProfileLimit, 10);
|
define_pd_global(intx, LoopPercentProfileLimit, 10);
|
||||||
// InitialCodeCacheSize derived from specjbb2000 run.
|
// InitialCodeCacheSize derived from specjbb2000 run.
|
||||||
define_pd_global(intx, InitialCodeCacheSize, 2496*K); // Integral multiple of CodeCacheExpansionSize
|
define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multiple of CodeCacheExpansionSize
|
||||||
define_pd_global(intx, CodeCacheExpansionSize, 64*K);
|
define_pd_global(size_t, CodeCacheExpansionSize, 64*K);
|
||||||
|
|
||||||
// Ergonomics related flags
|
// Ergonomics related flags
|
||||||
define_pd_global(uint64_t,MaxRAM, 128ULL*G);
|
define_pd_global(uint64_t,MaxRAM, 128ULL*G);
|
||||||
@@ -69,12 +69,12 @@ define_pd_global(bool, SuperWordLoopUnrollAnalysis, true);
|
|||||||
define_pd_global(uint, SuperWordStoreToLoadForwardingFailureDetection, 8);
|
define_pd_global(uint, SuperWordStoreToLoadForwardingFailureDetection, 8);
|
||||||
define_pd_global(bool, IdealizeClearArrayNode, true);
|
define_pd_global(bool, IdealizeClearArrayNode, true);
|
||||||
|
|
||||||
define_pd_global(intx, ReservedCodeCacheSize, 48*M);
|
define_pd_global(size_t, ReservedCodeCacheSize, 48*M);
|
||||||
define_pd_global(intx, NonProfiledCodeHeapSize, 21*M);
|
define_pd_global(size_t, NonProfiledCodeHeapSize, 21*M);
|
||||||
define_pd_global(intx, ProfiledCodeHeapSize, 22*M);
|
define_pd_global(size_t, ProfiledCodeHeapSize, 22*M);
|
||||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M );
|
||||||
define_pd_global(uintx, CodeCacheMinBlockLength, 6);
|
define_pd_global(size_t, CodeCacheMinBlockLength, 6);
|
||||||
define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
|
define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K);
|
||||||
|
|
||||||
// Ergonomics related flags
|
// Ergonomics related flags
|
||||||
define_pd_global(bool, NeverActAsServerClassMachine, false);
|
define_pd_global(bool, NeverActAsServerClassMachine, false);
|
||||||
|
|||||||
@@ -90,13 +90,15 @@ void CompiledDirectCall::set_to_interpreted(const methodHandle& callee, address
|
|||||||
= nativeMovConstReg_at(stub + NativeInstruction::instruction_size);
|
= nativeMovConstReg_at(stub + NativeInstruction::instruction_size);
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
NativeGeneralJump* jump = nativeGeneralJump_at(method_holder->next_instruction_address());
|
NativeJump* jump = MacroAssembler::codestub_branch_needs_far_jump()
|
||||||
|
? nativeGeneralJump_at(method_holder->next_instruction_address())
|
||||||
|
: nativeJump_at(method_holder->next_instruction_address());
|
||||||
verify_mt_safe(callee, entry, method_holder, jump);
|
verify_mt_safe(callee, entry, method_holder, jump);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Update stub.
|
// Update stub.
|
||||||
method_holder->set_data((intptr_t)callee());
|
method_holder->set_data((intptr_t)callee());
|
||||||
NativeGeneralJump::insert_unconditional(method_holder->next_instruction_address(), entry);
|
MacroAssembler::pd_patch_instruction(method_holder->next_instruction_address(), entry);
|
||||||
ICache::invalidate_range(stub, to_interp_stub_size());
|
ICache::invalidate_range(stub, to_interp_stub_size());
|
||||||
// Update jump to call.
|
// Update jump to call.
|
||||||
set_destination_mt_safe(stub);
|
set_destination_mt_safe(stub);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -101,9 +101,12 @@ frame FreezeBase::new_heap_frame(frame& f, frame& caller) {
|
|||||||
*hf.addr_at(frame::interpreter_frame_locals_offset) = locals_offset;
|
*hf.addr_at(frame::interpreter_frame_locals_offset) = locals_offset;
|
||||||
return hf;
|
return hf;
|
||||||
} else {
|
} else {
|
||||||
// We need to re-read fp out of the frame because it may be an oop and we might have
|
// For a compiled frame we need to re-read fp out of the frame because it may be an
|
||||||
// had a safepoint in finalize_freeze, after constructing f.
|
// oop and we might have had a safepoint in finalize_freeze, after constructing f.
|
||||||
fp = *(intptr_t**)(f.sp() - frame::sender_sp_offset);
|
// For stub/native frames the value is not used while frozen, and will be constructed again
|
||||||
|
// when thawing the frame (see ThawBase::new_stack_frame). We use a special bad address to
|
||||||
|
// help with debugging, particularly when inspecting frames and identifying invalid accesses.
|
||||||
|
fp = FKind::compiled ? *(intptr_t**)(f.sp() - frame::sender_sp_offset) : (intptr_t*)badAddressVal;
|
||||||
|
|
||||||
int fsize = FKind::size(f);
|
int fsize = FKind::size(f);
|
||||||
sp = caller.unextended_sp() - fsize;
|
sp = caller.unextended_sp() - fsize;
|
||||||
@@ -192,6 +195,11 @@ inline void FreezeBase::patch_pd(frame& hf, const frame& caller) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void FreezeBase::patch_pd_unused(intptr_t* sp) {
|
||||||
|
intptr_t* fp_addr = sp - frame::sender_sp_offset;
|
||||||
|
*fp_addr = badAddressVal;
|
||||||
|
}
|
||||||
|
|
||||||
//////// Thaw
|
//////// Thaw
|
||||||
|
|
||||||
// Fast path
|
// Fast path
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ void DowncallLinker::StubGenerator::generate() {
|
|||||||
|
|
||||||
__ verify_sve_vector_length(tmp1);
|
__ verify_sve_vector_length(tmp1);
|
||||||
|
|
||||||
__ safepoint_poll(L_safepoint_poll_slow_path, true /* at_return */, true /* acquire */, false /* in_nmethod */, tmp1);
|
__ safepoint_poll(L_safepoint_poll_slow_path, true /* at_return */, false /* in_nmethod */, tmp1);
|
||||||
|
|
||||||
__ ldrw(tmp1, Address(rthread, JavaThread::suspend_flags_offset()));
|
__ ldrw(tmp1, Address(rthread, JavaThread::suspend_flags_offset()));
|
||||||
__ cbnzw(tmp1, L_safepoint_poll_slow_path);
|
__ cbnzw(tmp1, L_safepoint_poll_slow_path);
|
||||||
|
|||||||
@@ -441,8 +441,8 @@ JavaThread** frame::saved_thread_address(const frame& f) {
|
|||||||
|
|
||||||
JavaThread** thread_addr;
|
JavaThread** thread_addr;
|
||||||
#ifdef COMPILER1
|
#ifdef COMPILER1
|
||||||
if (cb == Runtime1::blob_for(C1StubId::monitorenter_id) ||
|
if (cb == Runtime1::blob_for(StubId::c1_monitorenter_id) ||
|
||||||
cb == Runtime1::blob_for(C1StubId::monitorenter_nofpu_id)) {
|
cb == Runtime1::blob_for(StubId::c1_monitorenter_nofpu_id)) {
|
||||||
thread_addr = (JavaThread**)(f.sp() + Runtime1::runtime_blob_current_thread_offset(f));
|
thread_addr = (JavaThread**)(f.sp() + Runtime1::runtime_blob_current_thread_offset(f));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -292,7 +292,8 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
|
|||||||
} else {
|
} else {
|
||||||
assert(is_phantom, "only remaining strength");
|
assert(is_phantom, "only remaining strength");
|
||||||
assert(!is_narrow, "phantom access cannot be narrow");
|
assert(!is_narrow, "phantom access cannot be narrow");
|
||||||
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom));
|
// AOT saved adapters need relocation for this call.
|
||||||
|
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom)));
|
||||||
}
|
}
|
||||||
__ blr(lr);
|
__ blr(lr);
|
||||||
__ mov(rscratch1, r0);
|
__ mov(rscratch1, r0);
|
||||||
|
|||||||
@@ -106,6 +106,13 @@ instruct zLoadP(iRegPNoSp dst, memory8 mem, rFlagsReg cr)
|
|||||||
match(Set dst (LoadP mem));
|
match(Set dst (LoadP mem));
|
||||||
predicate(UseZGC && !needs_acquiring_load(n) && n->as_Load()->barrier_data() != 0);
|
predicate(UseZGC && !needs_acquiring_load(n) && n->as_Load()->barrier_data() != 0);
|
||||||
effect(TEMP dst, KILL cr);
|
effect(TEMP dst, KILL cr);
|
||||||
|
// The main load is a candidate to implement implicit null checks, as long as
|
||||||
|
// legitimize_address() does not require a preceding lea instruction to
|
||||||
|
// materialize the memory operand. The absence of a preceding lea instruction
|
||||||
|
// is guaranteed for immLoffset8 memory operands, because these do not lead to
|
||||||
|
// out-of-range offsets (see definition of immLoffset8). Fortunately,
|
||||||
|
// immLoffset8 memory operands are the most common ones in practice.
|
||||||
|
ins_is_late_expanded_null_check_candidate(opnd_array(1)->opcode() == INDOFFL8);
|
||||||
|
|
||||||
ins_cost(4 * INSN_COST);
|
ins_cost(4 * INSN_COST);
|
||||||
|
|
||||||
@@ -117,7 +124,11 @@ instruct zLoadP(iRegPNoSp dst, memory8 mem, rFlagsReg cr)
|
|||||||
// Fix up any out-of-range offsets.
|
// Fix up any out-of-range offsets.
|
||||||
assert_different_registers(rscratch2, as_Register($mem$$base));
|
assert_different_registers(rscratch2, as_Register($mem$$base));
|
||||||
assert_different_registers(rscratch2, $dst$$Register);
|
assert_different_registers(rscratch2, $dst$$Register);
|
||||||
ref_addr = __ legitimize_address(ref_addr, 8, rscratch2);
|
int size = 8;
|
||||||
|
assert(!this->is_late_expanded_null_check_candidate() ||
|
||||||
|
!MacroAssembler::legitimize_address_requires_lea(ref_addr, size),
|
||||||
|
"an instruction that can be used for implicit null checking should emit the candidate memory access first");
|
||||||
|
ref_addr = __ legitimize_address(ref_addr, size, rscratch2);
|
||||||
}
|
}
|
||||||
__ ldr($dst$$Register, ref_addr);
|
__ ldr($dst$$Register, ref_addr);
|
||||||
z_load_barrier(masm, this, ref_addr, $dst$$Register, rscratch1);
|
z_load_barrier(masm, this, ref_addr, $dst$$Register, rscratch1);
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap nulls
|
|||||||
|
|
||||||
define_pd_global(bool, DelayCompilerStubsGeneration, COMPILER2_OR_JVMCI);
|
define_pd_global(bool, DelayCompilerStubsGeneration, COMPILER2_OR_JVMCI);
|
||||||
|
|
||||||
define_pd_global(uintx, CodeCacheSegmentSize, 64);
|
define_pd_global(size_t, CodeCacheSegmentSize, 64);
|
||||||
define_pd_global(intx, CodeEntryAlignment, 64);
|
define_pd_global(intx, CodeEntryAlignment, 64);
|
||||||
define_pd_global(intx, OptoLoopAlignment, 16);
|
define_pd_global(intx, OptoLoopAlignment, 16);
|
||||||
|
|
||||||
@@ -117,7 +117,8 @@ define_pd_global(intx, InlineSmallCode, 1000);
|
|||||||
product(ccstr, OnSpinWaitInst, "yield", DIAGNOSTIC, \
|
product(ccstr, OnSpinWaitInst, "yield", DIAGNOSTIC, \
|
||||||
"The instruction to use to implement " \
|
"The instruction to use to implement " \
|
||||||
"java.lang.Thread.onSpinWait()." \
|
"java.lang.Thread.onSpinWait()." \
|
||||||
"Options: none, nop, isb, yield.") \
|
"Valid values are: none, nop, isb, yield, sb.") \
|
||||||
|
constraint(OnSpinWaitInstNameConstraintFunc, AtParse) \
|
||||||
product(uint, OnSpinWaitInstCount, 1, DIAGNOSTIC, \
|
product(uint, OnSpinWaitInstCount, 1, DIAGNOSTIC, \
|
||||||
"The number of OnSpinWaitInst instructions to generate." \
|
"The number of OnSpinWaitInst instructions to generate." \
|
||||||
"It cannot be used with OnSpinWaitInst=none.") \
|
"It cannot be used with OnSpinWaitInst=none.") \
|
||||||
|
|||||||
@@ -603,7 +603,7 @@ void InterpreterMacroAssembler::remove_activation(TosState state,
|
|||||||
// the stack, will call InterpreterRuntime::at_unwind.
|
// the stack, will call InterpreterRuntime::at_unwind.
|
||||||
Label slow_path;
|
Label slow_path;
|
||||||
Label fast_path;
|
Label fast_path;
|
||||||
safepoint_poll(slow_path, true /* at_return */, false /* acquire */, false /* in_nmethod */);
|
safepoint_poll(slow_path, true /* at_return */, false /* in_nmethod */);
|
||||||
br(Assembler::AL, fast_path);
|
br(Assembler::AL, fast_path);
|
||||||
bind(slow_path);
|
bind(slow_path);
|
||||||
push(state);
|
push(state);
|
||||||
@@ -691,104 +691,27 @@ void InterpreterMacroAssembler::leave_jfr_critical_section() {
|
|||||||
void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
||||||
{
|
{
|
||||||
assert(lock_reg == c_rarg1, "The argument is only for looks. It must be c_rarg1");
|
assert(lock_reg == c_rarg1, "The argument is only for looks. It must be c_rarg1");
|
||||||
if (LockingMode == LM_MONITOR) {
|
|
||||||
call_VM_preemptable(noreg,
|
|
||||||
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
|
|
||||||
lock_reg);
|
|
||||||
} else {
|
|
||||||
Label count, done;
|
|
||||||
|
|
||||||
const Register swap_reg = r0;
|
const Register tmp = c_rarg2;
|
||||||
const Register tmp = c_rarg2;
|
const Register obj_reg = c_rarg3; // Will contain the oop
|
||||||
const Register obj_reg = c_rarg3; // Will contain the oop
|
const Register tmp2 = c_rarg4;
|
||||||
const Register tmp2 = c_rarg4;
|
const Register tmp3 = c_rarg5;
|
||||||
const Register tmp3 = c_rarg5;
|
|
||||||
|
|
||||||
const int obj_offset = in_bytes(BasicObjectLock::obj_offset());
|
// Load object pointer into obj_reg %c_rarg3
|
||||||
const int lock_offset = in_bytes(BasicObjectLock::lock_offset());
|
ldr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset()));
|
||||||
const int mark_offset = lock_offset +
|
|
||||||
BasicLock::displaced_header_offset_in_bytes();
|
|
||||||
|
|
||||||
Label slow_case;
|
Label slow_case, done;
|
||||||
|
lightweight_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case);
|
||||||
|
b(done);
|
||||||
|
|
||||||
// Load object pointer into obj_reg %c_rarg3
|
bind(slow_case);
|
||||||
ldr(obj_reg, Address(lock_reg, obj_offset));
|
|
||||||
|
|
||||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
// Call the runtime routine for slow case
|
||||||
lightweight_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case);
|
call_VM_preemptable(noreg,
|
||||||
b(done);
|
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
|
||||||
} else if (LockingMode == LM_LEGACY) {
|
lock_reg);
|
||||||
|
|
||||||
if (DiagnoseSyncOnValueBasedClasses != 0) {
|
bind(done);
|
||||||
load_klass(tmp, obj_reg);
|
|
||||||
ldrb(tmp, Address(tmp, Klass::misc_flags_offset()));
|
|
||||||
tst(tmp, KlassFlags::_misc_is_value_based_class);
|
|
||||||
br(Assembler::NE, slow_case);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load (object->mark() | 1) into swap_reg
|
|
||||||
ldr(rscratch1, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
|
|
||||||
orr(swap_reg, rscratch1, 1);
|
|
||||||
|
|
||||||
// Save (object->mark() | 1) into BasicLock's displaced header
|
|
||||||
str(swap_reg, Address(lock_reg, mark_offset));
|
|
||||||
|
|
||||||
assert(lock_offset == 0,
|
|
||||||
"displached header must be first word in BasicObjectLock");
|
|
||||||
|
|
||||||
Label fail;
|
|
||||||
cmpxchg_obj_header(swap_reg, lock_reg, obj_reg, rscratch1, count, /*fallthrough*/nullptr);
|
|
||||||
|
|
||||||
// Fast check for recursive lock.
|
|
||||||
//
|
|
||||||
// Can apply the optimization only if this is a stack lock
|
|
||||||
// allocated in this thread. For efficiency, we can focus on
|
|
||||||
// recently allocated stack locks (instead of reading the stack
|
|
||||||
// base and checking whether 'mark' points inside the current
|
|
||||||
// thread stack):
|
|
||||||
// 1) (mark & 7) == 0, and
|
|
||||||
// 2) sp <= mark < mark + os::pagesize()
|
|
||||||
//
|
|
||||||
// Warning: sp + os::pagesize can overflow the stack base. We must
|
|
||||||
// neither apply the optimization for an inflated lock allocated
|
|
||||||
// just above the thread stack (this is why condition 1 matters)
|
|
||||||
// nor apply the optimization if the stack lock is inside the stack
|
|
||||||
// of another thread. The latter is avoided even in case of overflow
|
|
||||||
// because we have guard pages at the end of all stacks. Hence, if
|
|
||||||
// we go over the stack base and hit the stack of another thread,
|
|
||||||
// this should not be in a writeable area that could contain a
|
|
||||||
// stack lock allocated by that thread. As a consequence, a stack
|
|
||||||
// lock less than page size away from sp is guaranteed to be
|
|
||||||
// owned by the current thread.
|
|
||||||
//
|
|
||||||
// These 3 tests can be done by evaluating the following
|
|
||||||
// expression: ((mark - sp) & (7 - os::vm_page_size())),
|
|
||||||
// assuming both stack pointer and pagesize have their
|
|
||||||
// least significant 3 bits clear.
|
|
||||||
// NOTE: the mark is in swap_reg %r0 as the result of cmpxchg
|
|
||||||
// NOTE2: aarch64 does not like to subtract sp from rn so take a
|
|
||||||
// copy
|
|
||||||
mov(rscratch1, sp);
|
|
||||||
sub(swap_reg, swap_reg, rscratch1);
|
|
||||||
ands(swap_reg, swap_reg, (uint64_t)(7 - (int)os::vm_page_size()));
|
|
||||||
|
|
||||||
// Save the test result, for recursive case, the result is zero
|
|
||||||
str(swap_reg, Address(lock_reg, mark_offset));
|
|
||||||
br(Assembler::NE, slow_case);
|
|
||||||
|
|
||||||
bind(count);
|
|
||||||
inc_held_monitor_count(rscratch1);
|
|
||||||
b(done);
|
|
||||||
}
|
|
||||||
bind(slow_case);
|
|
||||||
|
|
||||||
// Call the runtime routine for slow case
|
|
||||||
call_VM_preemptable(noreg,
|
|
||||||
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
|
|
||||||
lock_reg);
|
|
||||||
|
|
||||||
bind(done);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -807,57 +730,29 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg)
|
|||||||
{
|
{
|
||||||
assert(lock_reg == c_rarg1, "The argument is only for looks. It must be rarg1");
|
assert(lock_reg == c_rarg1, "The argument is only for looks. It must be rarg1");
|
||||||
|
|
||||||
if (LockingMode == LM_MONITOR) {
|
const Register swap_reg = r0;
|
||||||
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit), lock_reg);
|
const Register header_reg = c_rarg2; // Will contain the old oopMark
|
||||||
} else {
|
const Register obj_reg = c_rarg3; // Will contain the oop
|
||||||
Label count, done;
|
const Register tmp_reg = c_rarg4; // Temporary used by lightweight_unlock
|
||||||
|
|
||||||
const Register swap_reg = r0;
|
save_bcp(); // Save in case of exception
|
||||||
const Register header_reg = c_rarg2; // Will contain the old oopMark
|
|
||||||
const Register obj_reg = c_rarg3; // Will contain the oop
|
|
||||||
const Register tmp_reg = c_rarg4; // Temporary used by lightweight_unlock
|
|
||||||
|
|
||||||
save_bcp(); // Save in case of exception
|
// Load oop into obj_reg(%c_rarg3)
|
||||||
|
ldr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset()));
|
||||||
|
|
||||||
if (LockingMode != LM_LIGHTWEIGHT) {
|
// Free entry
|
||||||
// Convert from BasicObjectLock structure to object and BasicLock
|
str(zr, Address(lock_reg, BasicObjectLock::obj_offset()));
|
||||||
// structure Store the BasicLock address into %r0
|
|
||||||
lea(swap_reg, Address(lock_reg, BasicObjectLock::lock_offset()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load oop into obj_reg(%c_rarg3)
|
Label slow_case, done;
|
||||||
ldr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset()));
|
lightweight_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case);
|
||||||
|
b(done);
|
||||||
|
|
||||||
// Free entry
|
bind(slow_case);
|
||||||
str(zr, Address(lock_reg, BasicObjectLock::obj_offset()));
|
// Call the runtime routine for slow case.
|
||||||
|
str(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset())); // restore obj
|
||||||
Label slow_case;
|
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit), lock_reg);
|
||||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
bind(done);
|
||||||
lightweight_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case);
|
restore_bcp();
|
||||||
b(done);
|
|
||||||
} else if (LockingMode == LM_LEGACY) {
|
|
||||||
// Load the old header from BasicLock structure
|
|
||||||
ldr(header_reg, Address(swap_reg,
|
|
||||||
BasicLock::displaced_header_offset_in_bytes()));
|
|
||||||
|
|
||||||
// Test for recursion
|
|
||||||
cbz(header_reg, count);
|
|
||||||
|
|
||||||
// Atomic swap back the old header
|
|
||||||
cmpxchg_obj_header(swap_reg, header_reg, obj_reg, rscratch1, count, &slow_case);
|
|
||||||
|
|
||||||
bind(count);
|
|
||||||
dec_held_monitor_count(rscratch1);
|
|
||||||
b(done);
|
|
||||||
}
|
|
||||||
|
|
||||||
bind(slow_case);
|
|
||||||
// Call the runtime routine for slow case.
|
|
||||||
str(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset())); // restore obj
|
|
||||||
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit), lock_reg);
|
|
||||||
bind(done);
|
|
||||||
restore_bcp();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterMacroAssembler::test_method_data_pointer(Register mdp,
|
void InterpreterMacroAssembler::test_method_data_pointer(Register mdp,
|
||||||
@@ -1016,31 +911,16 @@ void InterpreterMacroAssembler::update_mdp_for_ret(Register return_bci) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InterpreterMacroAssembler::profile_taken_branch(Register mdp,
|
void InterpreterMacroAssembler::profile_taken_branch(Register mdp) {
|
||||||
Register bumped_count) {
|
|
||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
Label profile_continue;
|
Label profile_continue;
|
||||||
|
|
||||||
// If no method data exists, go to profile_continue.
|
// If no method data exists, go to profile_continue.
|
||||||
// Otherwise, assign to mdp
|
|
||||||
test_method_data_pointer(mdp, profile_continue);
|
test_method_data_pointer(mdp, profile_continue);
|
||||||
|
|
||||||
// We are taking a branch. Increment the taken count.
|
// We are taking a branch. Increment the taken count.
|
||||||
// We inline increment_mdp_data_at to return bumped_count in a register
|
increment_mdp_data_at(mdp, in_bytes(JumpData::taken_offset()));
|
||||||
//increment_mdp_data_at(mdp, in_bytes(JumpData::taken_offset()));
|
|
||||||
Address data(mdp, in_bytes(JumpData::taken_offset()));
|
|
||||||
ldr(bumped_count, data);
|
|
||||||
assert(DataLayout::counter_increment == 1,
|
|
||||||
"flow-free idiom only works with 1");
|
|
||||||
// Intel does this to catch overflow
|
|
||||||
// addptr(bumped_count, DataLayout::counter_increment);
|
|
||||||
// sbbptr(bumped_count, 0);
|
|
||||||
// so we do this
|
|
||||||
adds(bumped_count, bumped_count, DataLayout::counter_increment);
|
|
||||||
Label L;
|
|
||||||
br(Assembler::CS, L); // skip store if counter overflow
|
|
||||||
str(bumped_count, data);
|
|
||||||
bind(L);
|
|
||||||
// The method data pointer needs to be updated to reflect the new target.
|
// The method data pointer needs to be updated to reflect the new target.
|
||||||
update_mdp_by_offset(mdp, in_bytes(JumpData::displacement_offset()));
|
update_mdp_by_offset(mdp, in_bytes(JumpData::displacement_offset()));
|
||||||
bind(profile_continue);
|
bind(profile_continue);
|
||||||
@@ -1055,7 +935,7 @@ void InterpreterMacroAssembler::profile_not_taken_branch(Register mdp) {
|
|||||||
// If no method data exists, go to profile_continue.
|
// If no method data exists, go to profile_continue.
|
||||||
test_method_data_pointer(mdp, profile_continue);
|
test_method_data_pointer(mdp, profile_continue);
|
||||||
|
|
||||||
// We are taking a branch. Increment the not taken count.
|
// We are not taking a branch. Increment the not taken count.
|
||||||
increment_mdp_data_at(mdp, in_bytes(BranchData::not_taken_offset()));
|
increment_mdp_data_at(mdp, in_bytes(BranchData::not_taken_offset()));
|
||||||
|
|
||||||
// The method data pointer needs to be updated to correspond to
|
// The method data pointer needs to be updated to correspond to
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
// narrow int return value
|
// narrow int return value
|
||||||
void narrow(Register result);
|
void narrow(Register result);
|
||||||
|
|
||||||
void profile_taken_branch(Register mdp, Register bumped_count);
|
void profile_taken_branch(Register mdp);
|
||||||
void profile_not_taken_branch(Register mdp);
|
void profile_not_taken_branch(Register mdp);
|
||||||
void profile_call(Register mdp);
|
void profile_call(Register mdp);
|
||||||
void profile_final_call(Register mdp);
|
void profile_final_call(Register mdp);
|
||||||
|
|||||||
@@ -553,13 +553,8 @@ address MacroAssembler::target_addr_for_insn_or_null(address insn_addr, unsigned
|
|||||||
return MacroAssembler::target_addr_for_insn(insn_addr, insn);
|
return MacroAssembler::target_addr_for_insn(insn_addr, insn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::safepoint_poll(Label& slow_path, bool at_return, bool acquire, bool in_nmethod, Register tmp) {
|
void MacroAssembler::safepoint_poll(Label& slow_path, bool at_return, bool in_nmethod, Register tmp) {
|
||||||
if (acquire) {
|
ldr(tmp, Address(rthread, JavaThread::polling_word_offset()));
|
||||||
lea(tmp, Address(rthread, JavaThread::polling_word_offset()));
|
|
||||||
ldar(tmp, tmp);
|
|
||||||
} else {
|
|
||||||
ldr(tmp, Address(rthread, JavaThread::polling_word_offset()));
|
|
||||||
}
|
|
||||||
if (at_return) {
|
if (at_return) {
|
||||||
// Note that when in_nmethod is set, the stack pointer is incremented before the poll. Therefore,
|
// Note that when in_nmethod is set, the stack pointer is incremented before the poll. Therefore,
|
||||||
// we may safely use the sp instead to perform the stack watermark check.
|
// we may safely use the sp instead to perform the stack watermark check.
|
||||||
@@ -989,11 +984,19 @@ void MacroAssembler::emit_static_call_stub() {
|
|||||||
mov_metadata(rmethod, nullptr);
|
mov_metadata(rmethod, nullptr);
|
||||||
|
|
||||||
// Jump to the entry point of the c2i stub.
|
// Jump to the entry point of the c2i stub.
|
||||||
movptr(rscratch1, 0);
|
if (codestub_branch_needs_far_jump()) {
|
||||||
br(rscratch1);
|
movptr(rscratch1, 0);
|
||||||
|
br(rscratch1);
|
||||||
|
} else {
|
||||||
|
b(pc());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MacroAssembler::static_call_stub_size() {
|
int MacroAssembler::static_call_stub_size() {
|
||||||
|
if (!codestub_branch_needs_far_jump()) {
|
||||||
|
// isb; movk; movz; movz; b
|
||||||
|
return 5 * NativeInstruction::instruction_size;
|
||||||
|
}
|
||||||
// isb; movk; movz; movz; movk; movz; movz; br
|
// isb; movk; movz; movz; movk; movz; movz; br
|
||||||
return 8 * NativeInstruction::instruction_size;
|
return 8 * NativeInstruction::instruction_size;
|
||||||
}
|
}
|
||||||
@@ -6418,10 +6421,14 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value)
|
|||||||
|
|
||||||
// Intrinsic for
|
// Intrinsic for
|
||||||
//
|
//
|
||||||
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
|
// - sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
|
||||||
// return the number of characters copied.
|
// Encodes char[] to byte[] in ISO-8859-1
|
||||||
// - java/lang/StringUTF16.compress
|
//
|
||||||
// return index of non-latin1 character if copy fails, otherwise 'len'.
|
// - java.lang.StringCoding#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
|
||||||
|
// Encodes byte[] (containing UTF-16) to byte[] in ISO-8859-1
|
||||||
|
//
|
||||||
|
// - java.lang.StringCoding#encodeAsciiArray0(char[] sa, int sp, byte[] da, int dp, int len)
|
||||||
|
// Encodes char[] to byte[] in ASCII
|
||||||
//
|
//
|
||||||
// This version always returns the number of characters copied, and does not
|
// This version always returns the number of characters copied, and does not
|
||||||
// clobber the 'len' register. A successful copy will complete with the post-
|
// clobber the 'len' register. A successful copy will complete with the post-
|
||||||
@@ -6800,6 +6807,7 @@ void MacroAssembler::verify_cross_modify_fence_not_required() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void MacroAssembler::spin_wait() {
|
void MacroAssembler::spin_wait() {
|
||||||
|
block_comment("spin_wait {");
|
||||||
for (int i = 0; i < VM_Version::spin_wait_desc().inst_count(); ++i) {
|
for (int i = 0; i < VM_Version::spin_wait_desc().inst_count(); ++i) {
|
||||||
switch (VM_Version::spin_wait_desc().inst()) {
|
switch (VM_Version::spin_wait_desc().inst()) {
|
||||||
case SpinWait::NOP:
|
case SpinWait::NOP:
|
||||||
@@ -6811,10 +6819,15 @@ void MacroAssembler::spin_wait() {
|
|||||||
case SpinWait::YIELD:
|
case SpinWait::YIELD:
|
||||||
yield();
|
yield();
|
||||||
break;
|
break;
|
||||||
|
case SpinWait::SB:
|
||||||
|
assert(VM_Version::supports_sb(), "current CPU does not support SB instruction");
|
||||||
|
sb();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
block_comment("}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stack frame creation/removal
|
// Stack frame creation/removal
|
||||||
@@ -7088,7 +7101,6 @@ void MacroAssembler::double_move(VMRegPair src, VMRegPair dst, Register tmp) {
|
|||||||
// - t1, t2, t3: temporary registers, will be destroyed
|
// - t1, t2, t3: temporary registers, will be destroyed
|
||||||
// - slow: branched to if locking fails, absolute offset may larger than 32KB (imm14 encoding).
|
// - slow: branched to if locking fails, absolute offset may larger than 32KB (imm14 encoding).
|
||||||
void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow) {
|
void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow) {
|
||||||
assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
|
|
||||||
assert_different_registers(basic_lock, obj, t1, t2, t3, rscratch1);
|
assert_different_registers(basic_lock, obj, t1, t2, t3, rscratch1);
|
||||||
|
|
||||||
Label push;
|
Label push;
|
||||||
@@ -7148,7 +7160,6 @@ void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Registe
|
|||||||
// - t1, t2, t3: temporary registers
|
// - t1, t2, t3: temporary registers
|
||||||
// - slow: branched to if unlocking fails, absolute offset may larger than 32KB (imm14 encoding).
|
// - slow: branched to if unlocking fails, absolute offset may larger than 32KB (imm14 encoding).
|
||||||
void MacroAssembler::lightweight_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow) {
|
void MacroAssembler::lightweight_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow) {
|
||||||
assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
|
|
||||||
// cmpxchg clobbers rscratch1.
|
// cmpxchg clobbers rscratch1.
|
||||||
assert_different_registers(obj, t1, t2, t3, rscratch1);
|
assert_different_registers(obj, t1, t2, t3, rscratch1);
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class MacroAssembler: public Assembler {
|
|||||||
virtual void check_and_handle_popframe(Register java_thread);
|
virtual void check_and_handle_popframe(Register java_thread);
|
||||||
virtual void check_and_handle_earlyret(Register java_thread);
|
virtual void check_and_handle_earlyret(Register java_thread);
|
||||||
|
|
||||||
void safepoint_poll(Label& slow_path, bool at_return, bool acquire, bool in_nmethod, Register tmp = rscratch1);
|
void safepoint_poll(Label& slow_path, bool at_return, bool in_nmethod, Register tmp = rscratch1);
|
||||||
void rt_call(address dest, Register tmp = rscratch1);
|
void rt_call(address dest, Register tmp = rscratch1);
|
||||||
|
|
||||||
// Load Effective Address
|
// Load Effective Address
|
||||||
@@ -129,16 +129,21 @@ class MacroAssembler: public Assembler {
|
|||||||
a.lea(this, r);
|
a.lea(this, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Whether materializing the given address for a LDR/STR requires an
|
||||||
|
// additional lea instruction.
|
||||||
|
static bool legitimize_address_requires_lea(const Address &a, int size) {
|
||||||
|
return a.getMode() == Address::base_plus_offset &&
|
||||||
|
!Address::offset_ok_for_immed(a.offset(), exact_log2(size));
|
||||||
|
}
|
||||||
|
|
||||||
/* Sometimes we get misaligned loads and stores, usually from Unsafe
|
/* Sometimes we get misaligned loads and stores, usually from Unsafe
|
||||||
accesses, and these can exceed the offset range. */
|
accesses, and these can exceed the offset range. */
|
||||||
Address legitimize_address(const Address &a, int size, Register scratch) {
|
Address legitimize_address(const Address &a, int size, Register scratch) {
|
||||||
if (a.getMode() == Address::base_plus_offset) {
|
if (legitimize_address_requires_lea(a, size)) {
|
||||||
if (! Address::offset_ok_for_immed(a.offset(), exact_log2(size))) {
|
block_comment("legitimize_address {");
|
||||||
block_comment("legitimize_address {");
|
lea(scratch, a);
|
||||||
lea(scratch, a);
|
block_comment("} legitimize_address");
|
||||||
block_comment("} legitimize_address");
|
return Address(scratch);
|
||||||
return Address(scratch);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -543,7 +543,7 @@ void MacroAssembler::generate__ieee754_rem_pio2(address npio2_hw,
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// /* compute n */
|
// /* compute n */
|
||||||
// z = scalbnA(z,q0); /* actual value of z */
|
// z = scalbn(z,q0); /* actual value of z */
|
||||||
// z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
// z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
||||||
// n = (int) z;
|
// n = (int) z;
|
||||||
// z -= (double)n;
|
// z -= (double)n;
|
||||||
@@ -576,7 +576,7 @@ void MacroAssembler::generate__ieee754_rem_pio2(address npio2_hw,
|
|||||||
// }
|
// }
|
||||||
// if(ih==2) {
|
// if(ih==2) {
|
||||||
// z = one - z;
|
// z = one - z;
|
||||||
// if(carry!=0) z -= scalbnA(one,q0);
|
// if(carry!=0) z -= scalbn(one,q0);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@@ -602,7 +602,7 @@ void MacroAssembler::generate__ieee754_rem_pio2(address npio2_hw,
|
|||||||
// jz -= 1; q0 -= 24;
|
// jz -= 1; q0 -= 24;
|
||||||
// while(iq[jz]==0) { jz--; q0-=24;}
|
// while(iq[jz]==0) { jz--; q0-=24;}
|
||||||
// } else { /* break z into 24-bit if necessary */
|
// } else { /* break z into 24-bit if necessary */
|
||||||
// z = scalbnA(z,-q0);
|
// z = scalbn(z,-q0);
|
||||||
// if(z>=two24B) {
|
// if(z>=two24B) {
|
||||||
// fw = (double)((int)(twon24*z));
|
// fw = (double)((int)(twon24*z));
|
||||||
// iq[jz] = (int)(z-two24B*fw);
|
// iq[jz] = (int)(z-two24B*fw);
|
||||||
@@ -612,7 +612,7 @@ void MacroAssembler::generate__ieee754_rem_pio2(address npio2_hw,
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// /* convert integer "bit" chunk to floating-point value */
|
// /* convert integer "bit" chunk to floating-point value */
|
||||||
// fw = scalbnA(one,q0);
|
// fw = scalbn(one,q0);
|
||||||
// for(i=jz;i>=0;i--) {
|
// for(i=jz;i>=0;i--) {
|
||||||
// q[i] = fw*(double)iq[i]; fw*=twon24;
|
// q[i] = fw*(double)iq[i]; fw*=twon24;
|
||||||
// }
|
// }
|
||||||
@@ -925,7 +925,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
fmovd(v25, 1.0);
|
fmovd(v25, 1.0);
|
||||||
fsubd(v18, v25, v18); // z = one - z;
|
fsubd(v18, v25, v18); // z = one - z;
|
||||||
cbzw(rscratch2, IH_HANDLED);
|
cbzw(rscratch2, IH_HANDLED);
|
||||||
fsubd(v18, v18, v30); // z -= scalbnA(one,q0);
|
fsubd(v18, v18, v30); // z -= scalbn(one,q0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bind(IH_HANDLED);
|
bind(IH_HANDLED);
|
||||||
@@ -1026,7 +1026,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
bind(Z_ZERO_CHECK_DONE);
|
bind(Z_ZERO_CHECK_DONE);
|
||||||
// convert integer "bit" chunk to floating-point value
|
// convert integer "bit" chunk to floating-point value
|
||||||
// v17 = twon24
|
// v17 = twon24
|
||||||
// update v30, which was scalbnA(1.0, <old q0>);
|
// update v30, which was scalbn(1.0, <old q0>);
|
||||||
addw(tmp2, rscratch1, 1023); // biased exponent
|
addw(tmp2, rscratch1, 1023); // biased exponent
|
||||||
lsl(tmp2, tmp2, 52); // put at correct position
|
lsl(tmp2, tmp2, 52); // put at correct position
|
||||||
mov(i, jz);
|
mov(i, jz);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user