@@ -5614,7 +5614,7 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
56145614 BIND (L_exit);
56155615}
56165616
5617- // encode char[] to byte[] in ISO_8859_1
5617+ // encode char[] to byte[] in ISO_8859_1 or ASCII
56185618 // @IntrinsicCandidate
56195619 // private static int implEncodeISOArray(byte[] sa, int sp,
56205620 // byte[] da, int dp, int len) {
@@ -5627,10 +5627,23 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
56275627 // }
56285628 // return i;
56295629 // }
5630+ //
5631+ // @IntrinsicCandidate
5632+ // private static int implEncodeAsciiArray(char[] sa, int sp,
5633+ // byte[] da, int dp, int len) {
5634+ // int i = 0;
5635+ // for (; i < len; i++) {
5636+ // char c = sa[sp++];
5637+ // if (c >= '\u0080')
5638+ // break;
5639+ // da[dp++] = (byte)c;
5640+ // }
5641+ // return i;
5642+ // }
56305643void MacroAssembler::encode_iso_array (Register src, Register dst, Register len,
56315644 XMMRegister tmp1Reg, XMMRegister tmp2Reg,
56325645 XMMRegister tmp3Reg, XMMRegister tmp4Reg,
5633- Register tmp5, Register result) {
5646+ Register tmp5, Register result, bool ascii ) {
56345647
56355648 // rsi: src
56365649 // rdi: dst
@@ -5641,6 +5654,9 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
56415654 assert_different_registers (src, dst, len, tmp5, result);
56425655 Label L_done, L_copy_1_char, L_copy_1_char_exit;
56435656
5657+ int mask = ascii ? 0xff80ff80 : 0xff00ff00 ;
5658+ int short_mask = ascii ? 0xff80 : 0xff00 ;
5659+
56445660 // set result
56455661 xorl (result, result);
56465662 // check for zero length
@@ -5660,7 +5676,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
56605676
56615677 if (UseAVX >= 2 ) {
56625678 Label L_chars_32_check, L_copy_32_chars, L_copy_32_chars_exit;
5663- movl (tmp5, 0xff00ff00 ); // create mask to test for Unicode chars in vector
5679+ movl (tmp5, mask ); // create mask to test for Unicode or non-ASCII chars in vector
56645680 movdl (tmp1Reg, tmp5);
56655681 vpbroadcastd (tmp1Reg, tmp1Reg, Assembler::AVX_256bit);
56665682 jmp (L_chars_32_check);
@@ -5669,7 +5685,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
56695685 vmovdqu (tmp3Reg, Address (src, len, Address::times_2, -64 ));
56705686 vmovdqu (tmp4Reg, Address (src, len, Address::times_2, -32 ));
56715687 vpor (tmp2Reg, tmp3Reg, tmp4Reg, /* vector_len */ 1 );
5672- vptest (tmp2Reg, tmp1Reg); // check for Unicode chars in vector
5688+ vptest (tmp2Reg, tmp1Reg); // check for Unicode or non-ASCII chars in vector
56735689 jccb (Assembler::notZero, L_copy_32_chars_exit);
56745690 vpackuswb (tmp3Reg, tmp3Reg, tmp4Reg, /* vector_len */ 1 );
56755691 vpermq (tmp4Reg, tmp3Reg, 0xD8 , /* vector_len */ 1 );
@@ -5684,7 +5700,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
56845700 jccb (Assembler::greater, L_copy_16_chars_exit);
56855701
56865702 } else if (UseSSE42Intrinsics) {
5687- movl (tmp5, 0xff00ff00 ); // create mask to test for Unicode chars in vector
5703+ movl (tmp5, mask ); // create mask to test for Unicode or non-ASCII chars in vector
56885704 movdl (tmp1Reg, tmp5);
56895705 pshufd (tmp1Reg, tmp1Reg, 0 );
56905706 jmpb (L_chars_16_check);
@@ -5708,7 +5724,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
57085724 movdqu (tmp4Reg, Address (src, len, Address::times_2, -16 ));
57095725 por (tmp2Reg, tmp4Reg);
57105726 }
5711- ptest (tmp2Reg, tmp1Reg); // check for Unicode chars in vector
5727+ ptest (tmp2Reg, tmp1Reg); // check for Unicode or non-ASCII chars in vector
57125728 jccb (Assembler::notZero, L_copy_16_chars_exit);
57135729 packuswb (tmp3Reg, tmp4Reg);
57145730 }
@@ -5746,7 +5762,7 @@ void MacroAssembler::encode_iso_array(Register src, Register dst, Register len,
57465762
57475763 bind (L_copy_1_char);
57485764 load_unsigned_short (tmp5, Address (src, len, Address::times_2, 0 ));
5749- testl (tmp5, 0xff00 ); // check if Unicode char
5765+ testl (tmp5, short_mask ); // check if Unicode or non-ASCII char
57505766 jccb (Assembler::notZero, L_copy_1_char_exit);
57515767 movb (Address (dst, len, Address::times_1, 0 ), tmp5);
57525768 addptr (len, 1 );
0 commit comments