@@ -5423,7 +5423,7 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
54235423 BIND (L_exit);
54245424}
54255425
5426- // encode char[] to byte[] in ISO_8859_1
5426+ // encode char[] to byte[] in ISO_8859_1 or ASCII
54275427 // @IntrinsicCandidate
54285428 // private static int implEncodeISOArray(byte[] sa, int sp,
54295429 // byte[] da, int dp, int len) {
@@ -5436,10 +5436,23 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
54365436 // }
54375437 // return i;
54385438 // }
5439+ //
5440+ // @IntrinsicCandidate
5441+ // private static int implEncodeAsciiArray(char[] sa, int sp,
5442+ // byte[] da, int dp, int len) {
5443+ // int i = 0;
5444+ // for (; i < len; i++) {
5445+ // char c = sa[sp++];
5446+ // if (c >= '\u0080')
5447+ // break;
5448+ // da[dp++] = (byte)c;
5449+ // }
5450+ // return i;
5451+ // }
54395452void MacroAssembler::encode_iso_array (Register src, Register dst, Register len,
54405453 XMMRegister tmp1Reg, XMMRegister tmp2Reg,
54415454 XMMRegister tmp3Reg, XMMRegister tmp4Reg,
5442- Register tmp5, Register result) {
5455+ Register tmp5, Register result, bool ascii ) {
54435456
54445457 // rsi: src
54455458 // rdi: dst
@@ -5450,6 +5463,9 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
54505463 assert_different_registers (src, dst, len, tmp5, result);
54515464 Label L_done, L_copy_1_char, L_copy_1_char_exit;
54525465
5466+ int mask = ascii ? 0xff80ff80 : 0xff00ff00 ;
5467+ int short_mask = ascii ? 0xff80 : 0xff00 ;
5468+
54535469 // set result
54545470 xorl (result, result);
54555471 // check for zero length
@@ -5469,7 +5485,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
54695485
54705486 if (UseAVX >= 2 ) {
54715487 Label L_chars_32_check, L_copy_32_chars, L_copy_32_chars_exit;
5472- movl (tmp5, 0xff00ff00 ); // create mask to test for Unicode chars in vector
5488+ movl (tmp5, mask ); // create mask to test for Unicode or non-ASCII chars in vector
54735489 movdl (tmp1Reg, tmp5);
54745490 vpbroadcastd (tmp1Reg, tmp1Reg, Assembler::AVX_256bit);
54755491 jmp (L_chars_32_check);
@@ -5478,7 +5494,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
54785494 vmovdqu (tmp3Reg, Address (src, len, Address::times_2, -64 ));
54795495 vmovdqu (tmp4Reg, Address (src, len, Address::times_2, -32 ));
54805496 vpor (tmp2Reg, tmp3Reg, tmp4Reg, /* vector_len */ 1 );
5481- vptest (tmp2Reg, tmp1Reg); // check for Unicode chars in vector
5497+ vptest (tmp2Reg, tmp1Reg); // check for Unicode or non-ASCII chars in vector
54825498 jccb (Assembler::notZero, L_copy_32_chars_exit);
54835499 vpackuswb (tmp3Reg, tmp3Reg, tmp4Reg, /* vector_len */ 1 );
54845500 vpermq (tmp4Reg, tmp3Reg, 0xD8 , /* vector_len */ 1 );
@@ -5493,7 +5509,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
54935509 jccb (Assembler::greater, L_copy_16_chars_exit);
54945510
54955511 } else if (UseSSE42Intrinsics) {
5496- movl (tmp5, 0xff00ff00 ); // create mask to test for Unicode chars in vector
5512+ movl (tmp5, mask ); // create mask to test for Unicode or non-ASCII chars in vector
54975513 movdl (tmp1Reg, tmp5);
54985514 pshufd (tmp1Reg, tmp1Reg, 0 );
54995515 jmpb (L_chars_16_check);
@@ -5517,7 +5533,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
55175533 movdqu (tmp4Reg, Address (src, len, Address::times_2, -16 ));
55185534 por (tmp2Reg, tmp4Reg);
55195535 }
5520- ptest (tmp2Reg, tmp1Reg); // check for Unicode chars in vector
5536+ ptest (tmp2Reg, tmp1Reg); // check for Unicode or non-ASCII chars in vector
55215537 jccb (Assembler::notZero, L_copy_16_chars_exit);
55225538 packuswb (tmp3Reg, tmp4Reg);
55235539 }
@@ -5555,7 +5571,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
55555571
55565572 bind (L_copy_1_char);
55575573 load_unsigned_short (tmp5, Address (src, len, Address::times_2, 0 ));
5558- testl (tmp5, 0xff00 ); // check if Unicode char
5574+ testl (tmp5, short_mask ); // check if Unicode or non-ASCII char
55595575 jccb (Assembler::notZero, L_copy_1_char_exit);
55605576 movb (Address (dst, len, Address::times_1, 0 ), tmp5);
55615577 addptr (len, 1 );
0 commit comments