Skip to content

Commit 4503037

Browse files
authored
Merge branch 'openjdk:master' into backport-sendaoYan-c0c76703-master
2 parents 48937c0 + 39fbe38 commit 4503037

File tree

156 files changed

+13796
-9933
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

156 files changed

+13796
-9933
lines changed

make/autoconf/boot-jdk.m4

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,9 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
444444
# Force en-US environment
445445
UTIL_ADD_JVM_ARG_IF_OK([-Duser.language=en -Duser.country=US],boot_jdk_jvmargs,[$JAVA])
446446
447+
UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=off:stdout],boot_jdk_jvmargs,[$JAVA])
448+
UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=warning:stderr],boot_jdk_jvmargs,[$JAVA])
449+
447450
if test "x$BOOTJDK_USE_LOCAL_CDS" = xtrue; then
448451
# Use our own CDS archive
449452
UTIL_ADD_JVM_ARG_IF_OK([$boot_jdk_cds_args -Xshare:auto],boot_jdk_jvmargs,[$JAVA])

src/hotspot/cpu/aarch64/aarch64.ad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3401,7 +3401,7 @@ encode %{
34013401
}
34023402
%}
34033403

3404-
/// mov envcodings
3404+
// mov encodings
34053405

34063406
enc_class aarch64_enc_movw_imm(iRegI dst, immI src) %{
34073407
C2_MacroAssembler _masm(&cbuf);

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5913,7 +5913,7 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value)
59135913
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
59145914
// return the number of characters copied.
59155915
// - java/lang/StringUTF16.compress
5916-
// return zero (0) if copy fails, otherwise 'len'.
5916+
// return index of non-latin1 character if copy fails, otherwise 'len'.
59175917
//
59185918
// This version always returns the number of characters copied, and does not
59195919
// clobber the 'len' register. A successful copy will complete with the post-
@@ -6130,15 +6130,15 @@ address MacroAssembler::byte_array_inflate(Register src, Register dst, Register
61306130
}
61316131

61326132
// Compress char[] array to byte[].
6133+
// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len)
6134+
// Return the array length if every element in array can be encoded,
6135+
// otherwise, the index of first non-latin1 (> 0xff) character.
61336136
void MacroAssembler::char_array_compress(Register src, Register dst, Register len,
61346137
Register res,
61356138
FloatRegister tmp0, FloatRegister tmp1,
61366139
FloatRegister tmp2, FloatRegister tmp3,
61376140
FloatRegister tmp4, FloatRegister tmp5) {
61386141
encode_iso_array(src, dst, len, res, false, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
6139-
// Adjust result: res == len ? len : 0
6140-
cmp(len, res);
6141-
csel(res, res, zr, EQ);
61426142
}
61436143

61446144
// java.math.round(double a)

src/hotspot/cpu/ppc/ppc.ad

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12799,16 +12799,8 @@ instruct string_compress(rarg1RegP src, rarg2RegP dst, iRegIsrc len, iRegIdst re
1279912799
ins_cost(300);
1280012800
format %{ "String Compress $src,$dst,$len -> $result \t// KILL $tmp1, $tmp2, $tmp3, $tmp4, $tmp5" %}
1280112801
ins_encode %{
12802-
Label Lskip, Ldone;
12803-
__ li($result$$Register, 0);
12804-
__ string_compress_16($src$$Register, $dst$$Register, $len$$Register, $tmp1$$Register,
12805-
$tmp2$$Register, $tmp3$$Register, $tmp4$$Register, $tmp5$$Register, Ldone);
12806-
__ rldicl_($tmp1$$Register, $len$$Register, 0, 64-3); // Remaining characters.
12807-
__ beq(CCR0, Lskip);
12808-
__ string_compress($src$$Register, $dst$$Register, $tmp1$$Register, $tmp2$$Register, Ldone);
12809-
__ bind(Lskip);
12810-
__ mr($result$$Register, $len$$Register);
12811-
__ bind(Ldone);
12802+
__ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, $tmp1$$Register, $tmp2$$Register,
12803+
$tmp3$$Register, $tmp4$$Register, $tmp5$$Register, $result$$Register, false);
1281212804
%}
1281312805
ins_pipe(pipe_class_default);
1281412806
%}

src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,22 +1768,20 @@ void C2_MacroAssembler::byte_array_inflate_v(Register src, Register dst, Registe
17681768
}
17691769

17701770
// Compress char[] array to byte[].
1771-
// result: the array length if every element in array can be encoded; 0, otherwise.
1771+
// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len)
1772+
// result: the array length if every element in array can be encoded,
1773+
// otherwise, the index of first non-latin1 (> 0xff) character.
17721774
void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Register len,
17731775
Register result, Register tmp) {
1774-
Label done;
17751776
encode_iso_array_v(src, dst, len, result, tmp, false);
1776-
beqz(len, done);
1777-
mv(result, zr);
1778-
bind(done);
17791777
}
17801778

17811779
// Intrinsic for
17821780
//
17831781
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
17841782
// return the number of characters copied.
17851783
// - java/lang/StringUTF16.compress
1786-
// return zero (0) if copy fails, otherwise 'len'.
1784+
// return index of non-latin1 character if copy fails, otherwise 'len'.
17871785
//
17881786
// This version always returns the number of characters copied. A successful
17891787
// copy will complete with the post-condition: 'res' == 'len', while an

src/hotspot/cpu/s390/s390.ad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10177,7 +10177,7 @@ instruct string_compress(iRegP src, iRegP dst, iRegI result, iRegI len, iRegI tm
1017710177
format %{ "String Compress $src->$dst($len) -> $result" %}
1017810178
ins_encode %{
1017910179
__ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
10180-
$tmp$$Register, false, false);
10180+
$tmp$$Register, true, false);
1018110181
%}
1018210182
ins_pipe(pipe_class_dummy);
1018310183
%}

src/hotspot/cpu/x86/macroAssembler_x86.cpp

Lines changed: 75 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -8837,23 +8837,27 @@ void MacroAssembler::crc32c_ipl_alg2_alt2(Register in_out, Register in1, Registe
88378837
#undef BLOCK_COMMENT
88388838

88398839
// Compress char[] array to byte[].
8840-
// ..\jdk\src\java.base\share\classes\java\lang\StringUTF16.java
8840+
// Intrinsic for java.lang.StringUTF16.compress(char[] src, int srcOff, byte[] dst, int dstOff, int len)
8841+
// Return the array length if every element in array can be encoded,
8842+
// otherwise, the index of first non-latin1 (> 0xff) character.
88418843
// @IntrinsicCandidate
8842-
// private static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) {
8844+
// public static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) {
88438845
// for (int i = 0; i < len; i++) {
8844-
// int c = src[srcOff++];
8845-
// if (c >>> 8 != 0) {
8846-
// return 0;
8846+
// char c = src[srcOff];
8847+
// if (c > 0xff) {
8848+
// return i; // return index of non-latin1 char
88478849
// }
8848-
// dst[dstOff++] = (byte)c;
8850+
// dst[dstOff] = (byte)c;
8851+
// srcOff++;
8852+
// dstOff++;
88498853
// }
88508854
// return len;
88518855
// }
88528856
void MacroAssembler::char_array_compress(Register src, Register dst, Register len,
88538857
XMMRegister tmp1Reg, XMMRegister tmp2Reg,
88548858
XMMRegister tmp3Reg, XMMRegister tmp4Reg,
88558859
Register tmp5, Register result, KRegister mask1, KRegister mask2) {
8856-
Label copy_chars_loop, return_length, return_zero, done;
8860+
Label copy_chars_loop, done, reset_sp, copy_tail;
88578861

88588862
// rsi: src
88598863
// rdi: dst
@@ -8868,28 +8872,28 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
88688872
assert(len != result, "");
88698873

88708874
// save length for return
8871-
push(len);
8875+
movl(result, len);
88728876

88738877
if ((AVX3Threshold == 0) && (UseAVX > 2) && // AVX512
88748878
VM_Version::supports_avx512vlbw() &&
88758879
VM_Version::supports_bmi2()) {
88768880

8877-
Label copy_32_loop, copy_loop_tail, below_threshold;
8881+
Label copy_32_loop, copy_loop_tail, below_threshold, reset_for_copy_tail;
88788882

88798883
// alignment
88808884
Label post_alignment;
88818885

8882-
// if length of the string is less than 16, handle it in an old fashioned way
8886+
// if length of the string is less than 32, handle it the old fashioned way
88838887
testl(len, -32);
88848888
jcc(Assembler::zero, below_threshold);
88858889

88868890
// First check whether a character is compressible ( <= 0xFF).
88878891
// Create mask to test for Unicode chars inside zmm vector
8888-
movl(result, 0x00FF);
8889-
evpbroadcastw(tmp2Reg, result, Assembler::AVX_512bit);
8892+
movl(tmp5, 0x00FF);
8893+
evpbroadcastw(tmp2Reg, tmp5, Assembler::AVX_512bit);
88908894

88918895
testl(len, -64);
8892-
jcc(Assembler::zero, post_alignment);
8896+
jccb(Assembler::zero, post_alignment);
88938897

88948898
movl(tmp5, dst);
88958899
andl(tmp5, (32 - 1));
@@ -8898,18 +8902,19 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
88988902

88998903
// bail out when there is nothing to be done
89008904
testl(tmp5, 0xFFFFFFFF);
8901-
jcc(Assembler::zero, post_alignment);
8905+
jccb(Assembler::zero, post_alignment);
89028906

89038907
// ~(~0 << len), where len is the # of remaining elements to process
8904-
movl(result, 0xFFFFFFFF);
8905-
shlxl(result, result, tmp5);
8906-
notl(result);
8907-
kmovdl(mask2, result);
8908+
movl(len, 0xFFFFFFFF);
8909+
shlxl(len, len, tmp5);
8910+
notl(len);
8911+
kmovdl(mask2, len);
8912+
movl(len, result);
89088913

89098914
evmovdquw(tmp1Reg, mask2, Address(src, 0), /*merge*/ false, Assembler::AVX_512bit);
89108915
evpcmpw(mask1, mask2, tmp1Reg, tmp2Reg, Assembler::le, /*signed*/ false, Assembler::AVX_512bit);
89118916
ktestd(mask1, mask2);
8912-
jcc(Assembler::carryClear, return_zero);
8917+
jcc(Assembler::carryClear, copy_tail);
89138918

89148919
evpmovwb(Address(dst, 0), mask2, tmp1Reg, Assembler::AVX_512bit);
89158920

@@ -8924,7 +8929,7 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
89248929
movl(tmp5, len);
89258930
andl(tmp5, (32 - 1)); // tail count (in chars)
89268931
andl(len, ~(32 - 1)); // vector count (in chars)
8927-
jcc(Assembler::zero, copy_loop_tail);
8932+
jccb(Assembler::zero, copy_loop_tail);
89288933

89298934
lea(src, Address(src, len, Address::times_2));
89308935
lea(dst, Address(dst, len, Address::times_1));
@@ -8934,55 +8939,60 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
89348939
evmovdquw(tmp1Reg, Address(src, len, Address::times_2), Assembler::AVX_512bit);
89358940
evpcmpuw(mask1, tmp1Reg, tmp2Reg, Assembler::le, Assembler::AVX_512bit);
89368941
kortestdl(mask1, mask1);
8937-
jcc(Assembler::carryClear, return_zero);
8942+
jccb(Assembler::carryClear, reset_for_copy_tail);
89388943

89398944
// All elements in current processed chunk are valid candidates for
89408945
// compression. Write a truncated byte elements to the memory.
89418946
evpmovwb(Address(dst, len, Address::times_1), tmp1Reg, Assembler::AVX_512bit);
89428947
addptr(len, 32);
8943-
jcc(Assembler::notZero, copy_32_loop);
8948+
jccb(Assembler::notZero, copy_32_loop);
89448949

89458950
bind(copy_loop_tail);
89468951
// bail out when there is nothing to be done
89478952
testl(tmp5, 0xFFFFFFFF);
8948-
jcc(Assembler::zero, return_length);
8953+
jcc(Assembler::zero, done);
89498954

89508955
movl(len, tmp5);
89518956

89528957
// ~(~0 << len), where len is the # of remaining elements to process
8953-
movl(result, 0xFFFFFFFF);
8954-
shlxl(result, result, len);
8955-
notl(result);
8958+
movl(tmp5, 0xFFFFFFFF);
8959+
shlxl(tmp5, tmp5, len);
8960+
notl(tmp5);
89568961

8957-
kmovdl(mask2, result);
8962+
kmovdl(mask2, tmp5);
89588963

89598964
evmovdquw(tmp1Reg, mask2, Address(src, 0), /*merge*/ false, Assembler::AVX_512bit);
89608965
evpcmpw(mask1, mask2, tmp1Reg, tmp2Reg, Assembler::le, /*signed*/ false, Assembler::AVX_512bit);
89618966
ktestd(mask1, mask2);
8962-
jcc(Assembler::carryClear, return_zero);
8967+
jcc(Assembler::carryClear, copy_tail);
89638968

89648969
evpmovwb(Address(dst, 0), mask2, tmp1Reg, Assembler::AVX_512bit);
8965-
jmp(return_length);
8970+
jmp(done);
8971+
8972+
bind(reset_for_copy_tail);
8973+
lea(src, Address(src, tmp5, Address::times_2));
8974+
lea(dst, Address(dst, tmp5, Address::times_1));
8975+
subptr(len, tmp5);
8976+
jmp(copy_chars_loop);
89668977

89678978
bind(below_threshold);
89688979
}
89698980

89708981
if (UseSSE42Intrinsics) {
8971-
Label copy_32_loop, copy_16, copy_tail;
8982+
Label copy_32_loop, copy_16, copy_tail_sse, reset_for_copy_tail;
89728983

8973-
movl(result, len);
8984+
// vectored compression
8985+
testl(len, 0xfffffff8);
8986+
jcc(Assembler::zero, copy_tail);
89748987

89758988
movl(tmp5, 0xff00ff00); // create mask to test for Unicode chars in vectors
8989+
movdl(tmp1Reg, tmp5);
8990+
pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg
89768991

8977-
// vectored compression
8978-
andl(len, 0xfffffff0); // vector count (in chars)
8979-
andl(result, 0x0000000f); // tail count (in chars)
8980-
testl(len, len);
8981-
jcc(Assembler::zero, copy_16);
8992+
andl(len, 0xfffffff0);
8993+
jccb(Assembler::zero, copy_16);
89828994

89838995
// compress 16 chars per iter
8984-
movdl(tmp1Reg, tmp5);
8985-
pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg
89868996
pxor(tmp4Reg, tmp4Reg);
89878997

89888998
lea(src, Address(src, len, Address::times_2));
@@ -8995,59 +9005,60 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
89959005
movdqu(tmp3Reg, Address(src, len, Address::times_2, 16)); // load next 8 characters
89969006
por(tmp4Reg, tmp3Reg);
89979007
ptest(tmp4Reg, tmp1Reg); // check for Unicode chars in next vector
8998-
jcc(Assembler::notZero, return_zero);
9008+
jccb(Assembler::notZero, reset_for_copy_tail);
89999009
packuswb(tmp2Reg, tmp3Reg); // only ASCII chars; compress each to 1 byte
90009010
movdqu(Address(dst, len, Address::times_1), tmp2Reg);
90019011
addptr(len, 16);
9002-
jcc(Assembler::notZero, copy_32_loop);
9012+
jccb(Assembler::notZero, copy_32_loop);
90039013

90049014
// compress next vector of 8 chars (if any)
90059015
bind(copy_16);
9006-
movl(len, result);
9007-
andl(len, 0xfffffff8); // vector count (in chars)
9008-
andl(result, 0x00000007); // tail count (in chars)
9009-
testl(len, len);
9010-
jccb(Assembler::zero, copy_tail);
9016+
// len = 0
9017+
testl(result, 0x00000008); // check if there's a block of 8 chars to compress
9018+
jccb(Assembler::zero, copy_tail_sse);
90119019

9012-
movdl(tmp1Reg, tmp5);
9013-
pshufd(tmp1Reg, tmp1Reg, 0); // store Unicode mask in tmp1Reg
90149020
pxor(tmp3Reg, tmp3Reg);
90159021

90169022
movdqu(tmp2Reg, Address(src, 0));
90179023
ptest(tmp2Reg, tmp1Reg); // check for Unicode chars in vector
9018-
jccb(Assembler::notZero, return_zero);
9024+
jccb(Assembler::notZero, reset_for_copy_tail);
90199025
packuswb(tmp2Reg, tmp3Reg); // only LATIN1 chars; compress each to 1 byte
90209026
movq(Address(dst, 0), tmp2Reg);
90219027
addptr(src, 16);
90229028
addptr(dst, 8);
9029+
jmpb(copy_tail_sse);
90239030

9024-
bind(copy_tail);
9031+
bind(reset_for_copy_tail);
9032+
movl(tmp5, result);
9033+
andl(tmp5, 0x0000000f);
9034+
lea(src, Address(src, tmp5, Address::times_2));
9035+
lea(dst, Address(dst, tmp5, Address::times_1));
9036+
subptr(len, tmp5);
9037+
jmpb(copy_chars_loop);
9038+
9039+
bind(copy_tail_sse);
90259040
movl(len, result);
9041+
andl(len, 0x00000007); // tail count (in chars)
90269042
}
90279043
// compress 1 char per iter
9044+
bind(copy_tail);
90289045
testl(len, len);
9029-
jccb(Assembler::zero, return_length);
9046+
jccb(Assembler::zero, done);
90309047
lea(src, Address(src, len, Address::times_2));
90319048
lea(dst, Address(dst, len, Address::times_1));
90329049
negptr(len);
90339050

90349051
bind(copy_chars_loop);
9035-
load_unsigned_short(result, Address(src, len, Address::times_2));
9036-
testl(result, 0xff00); // check if Unicode char
9037-
jccb(Assembler::notZero, return_zero);
9038-
movb(Address(dst, len, Address::times_1), result); // ASCII char; compress to 1 byte
9052+
load_unsigned_short(tmp5, Address(src, len, Address::times_2));
9053+
testl(tmp5, 0xff00); // check if Unicode char
9054+
jccb(Assembler::notZero, reset_sp);
9055+
movb(Address(dst, len, Address::times_1), tmp5); // ASCII char; compress to 1 byte
90399056
increment(len);
9040-
jcc(Assembler::notZero, copy_chars_loop);
9057+
jccb(Assembler::notZero, copy_chars_loop);
90419058

9042-
// if compression succeeded, return length
9043-
bind(return_length);
9044-
pop(result);
9045-
jmpb(done);
9046-
9047-
// if compression failed, return 0
9048-
bind(return_zero);
9049-
xorl(result, result);
9050-
addptr(rsp, wordSize);
9059+
// add len then return (len will be zero if compress succeeded, otherwise negative)
9060+
bind(reset_sp);
9061+
addl(result, len);
90519062

90529063
bind(done);
90539064
}

0 commit comments

Comments
 (0)