Skip to content

Commit 0fa04fe

Browse files
DingliZhangRealFYang
authored andcommitted
8309254: Implement fast-path for ASCII-compatible CharsetEncoders on RISC-V
Reviewed-by: fyang Backport-of: 61bb014a8692305c705a4cf0361e319275c35ca3
1 parent 4dca60e commit 0fa04fe

File tree

4 files changed

+47
-17
lines changed

4 files changed

+47
-17
lines changed

src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,26 +1500,39 @@ void C2_MacroAssembler::byte_array_inflate_v(Register src, Register dst, Registe
15001500

15011501
// Compress char[] array to byte[].
15021502
// result: the array length if every element in array can be encoded; 0, otherwise.
1503-
void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Register len, Register result, Register tmp) {
1503+
void C2_MacroAssembler::char_array_compress_v(Register src, Register dst, Register len,
1504+
Register result, Register tmp) {
15041505
Label done;
1505-
encode_iso_array_v(src, dst, len, result, tmp);
1506+
encode_iso_array_v(src, dst, len, result, tmp, false);
15061507
beqz(len, done);
15071508
mv(result, zr);
15081509
bind(done);
15091510
}
15101511

1511-
// result: the number of elements had been encoded.
1512-
void C2_MacroAssembler::encode_iso_array_v(Register src, Register dst, Register len, Register result, Register tmp) {
1513-
Label loop, DIFFERENCE, DONE;
1512+
// Intrinsic for
1513+
//
1514+
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
1515+
// return the number of characters copied.
1516+
// - java/lang/StringUTF16.compress
1517+
// return zero (0) if copy fails, otherwise 'len'.
1518+
//
1519+
// This version always returns the number of characters copied. A successful
1520+
// copy will complete with the post-condition: 'res' == 'len', while an
1521+
// unsuccessful copy will exit with the post-condition: 0 <= 'res' < 'len'.
1522+
//
1523+
// Clobbers: src, dst, len, result, t0
1524+
void C2_MacroAssembler::encode_iso_array_v(Register src, Register dst, Register len,
1525+
Register result, Register tmp, bool ascii) {
1526+
Label loop, fail, done;
15141527

15151528
BLOCK_COMMENT("encode_iso_array_v {");
15161529
mv(result, 0);
15171530

15181531
bind(loop);
1519-
mv(tmp, 0xff);
1532+
mv(tmp, ascii ? 0x7f : 0xff);
15201533
vsetvli(t0, len, Assembler::e16, Assembler::m2);
15211534
vle16_v(v2, src);
1522-
// if element > 0xff, stop
1535+
15231536
vmsgtu_vx(v1, v2, tmp);
15241537
vfirst_m(tmp, v1);
15251538
vmsbf_m(v0, v1);
@@ -1528,18 +1541,19 @@ void C2_MacroAssembler::encode_iso_array_v(Register src, Register dst, Register
15281541
vncvt_x_x_w(v1, v2, Assembler::v0_t);
15291542
vse8_v(v1, dst, Assembler::v0_t);
15301543

1531-
bgez(tmp, DIFFERENCE);
1544+
// fail if char > 0x7f/0xff
1545+
bgez(tmp, fail);
15321546
add(result, result, t0);
15331547
add(dst, dst, t0);
15341548
sub(len, len, t0);
15351549
shadd(src, t0, src, t0, 1);
15361550
bnez(len, loop);
1537-
j(DONE);
1551+
j(done);
15381552

1539-
bind(DIFFERENCE);
1553+
bind(fail);
15401554
add(result, result, tmp);
15411555

1542-
bind(DONE);
1556+
bind(done);
15431557
BLOCK_COMMENT("} encode_iso_array_v");
15441558
}
15451559

src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@
171171

172172
void encode_iso_array_v(Register src, Register dst,
173173
Register len, Register result,
174-
Register tmp);
174+
Register tmp, bool ascii);
175175

176176
void has_negatives_v(Register ary, Register len,
177177
Register result, Register tmp);

src/hotspot/cpu/riscv/matcher_riscv.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@
159159
}
160160

161161
// Implements a variant of EncodeISOArrayNode that encode ASCII only
162-
static const bool supports_encode_ascii_array = false;
162+
static const bool supports_encode_ascii_array = true;
163163

164164
// Returns pre-selection estimated size of a vector operation.
165165
static int vector_op_pre_select_sz_estimate(int vopc, BasicType ety, int vlen) {

src/hotspot/cpu/riscv/riscv_v.ad

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,17 +1935,33 @@ instruct vstring_inflate(Universe dummy, iRegP_R10 src, iRegP_R11 dst, iRegI_R12
19351935
instruct vencode_iso_array(iRegP_R12 src, iRegP_R11 dst, iRegI_R13 len, iRegI_R10 result,
19361936
vReg_V1 v1, vReg_V2 v2, vReg_V3 v3, iRegLNoSp tmp)
19371937
%{
1938-
predicate(UseRVV);
1938+
predicate(UseRVV && !((EncodeISOArrayNode*)n)->is_ascii());
19391939
match(Set result (EncodeISOArray src (Binary dst len)));
19401940
effect(TEMP_DEF result, USE_KILL src, USE_KILL dst, USE_KILL len,
19411941
TEMP v1, TEMP v2, TEMP v3, TEMP tmp);
19421942

1943-
format %{ "Encode array $src,$dst,$len -> $result" %}
1943+
format %{ "Encode ISO array $src, $dst, $len -> $result # KILL $src, $dst, $len, $tmp, V1-V3" %}
19441944
ins_encode %{
19451945
__ encode_iso_array_v($src$$Register, $dst$$Register, $len$$Register,
1946-
$result$$Register, $tmp$$Register);
1946+
$result$$Register, $tmp$$Register, false /* ascii */);
19471947
%}
1948-
ins_pipe( pipe_class_memory );
1948+
ins_pipe(pipe_class_memory);
1949+
%}
1950+
1951+
instruct vencode_ascii_array(iRegP_R12 src, iRegP_R11 dst, iRegI_R13 len, iRegI_R10 result,
1952+
vReg_V1 v1, vReg_V2 v2, vReg_V3 v3, iRegLNoSp tmp)
1953+
%{
1954+
predicate(UseRVV && ((EncodeISOArrayNode*)n)->is_ascii());
1955+
match(Set result (EncodeISOArray src (Binary dst len)));
1956+
effect(TEMP_DEF result, USE_KILL src, USE_KILL dst, USE_KILL len,
1957+
TEMP v1, TEMP v2, TEMP v3, TEMP tmp);
1958+
1959+
format %{ "Encode ASCII array $src, $dst, $len -> $result # KILL $src, $dst, $len, $tmp, V1-V3" %}
1960+
ins_encode %{
1961+
__ encode_iso_array_v($src$$Register, $dst$$Register, $len$$Register,
1962+
$result$$Register, $tmp$$Register, true /* ascii */);
1963+
%}
1964+
ins_pipe(pipe_class_memory);
19491965
%}
19501966

19511967
// fast char[] to byte[] compression

0 commit comments

Comments
 (0)