mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8274242: Implement fast-path for ASCII-compatible CharsetEncoders on x86
Reviewed-by: naoto, thartmann
This commit is contained in:
parent
c4d115701d
commit
aaa36cc006
28 changed files with 428 additions and 391 deletions
|
@ -76,11 +76,11 @@ class CESU_8 extends Unicode
|
|||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private static class Decoder extends CharsetDecoder
|
||||
implements ArrayDecoder {
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private Decoder(Charset cs) {
|
||||
super(cs, 1.0f, 1.0f);
|
||||
}
|
||||
|
@ -434,7 +434,6 @@ class CESU_8 extends Unicode
|
|||
}
|
||||
|
||||
private Surrogate.Parser sgp;
|
||||
private char[] c2;
|
||||
private CoderResult encodeArrayLoop(CharBuffer src,
|
||||
ByteBuffer dst)
|
||||
{
|
||||
|
@ -445,11 +444,12 @@ class CESU_8 extends Unicode
|
|||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
int dlASCII = dp + Math.min(sl - sp, dl - dp);
|
||||
|
||||
// ASCII only loop
|
||||
while (dp < dlASCII && sa[sp] < '\u0080')
|
||||
da[dp++] = (byte) sa[sp++];
|
||||
// Handle ASCII-only prefix
|
||||
int n = JLA.encodeASCII(sa, sp, da, dp, Math.min(sl - sp, dl - dp));
|
||||
sp += n;
|
||||
dp += n;
|
||||
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
if (c < 0x80) {
|
||||
|
@ -549,11 +549,11 @@ class CESU_8 extends Unicode
|
|||
public int encode(char[] sa, int sp, int len, byte[] da) {
|
||||
int sl = sp + len;
|
||||
int dp = 0;
|
||||
int dlASCII = dp + Math.min(len, da.length);
|
||||
|
||||
// ASCII only optimized loop
|
||||
while (dp < dlASCII && sa[sp] < '\u0080')
|
||||
da[dp++] = (byte) sa[sp++];
|
||||
// Handle ASCII-only prefix
|
||||
int n = JLA.encodeASCII(sa, sp, da, dp, Math.min(len, da.length));
|
||||
sp += n;
|
||||
dp += n;
|
||||
|
||||
while (sp < sl) {
|
||||
char c = sa[sp++];
|
||||
|
|
|
@ -49,11 +49,11 @@ public class SingleByte
|
|||
return cr;
|
||||
}
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
public static final class Decoder extends CharsetDecoder
|
||||
implements ArrayDecoder {
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private final char[] b2c;
|
||||
private final boolean isASCIICompatible;
|
||||
private final boolean isLatin1Decodable;
|
||||
|
@ -214,8 +214,14 @@ public class SingleByte
|
|||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
int len = Math.min(dl - dp, sl - sp);
|
||||
int len = Math.min(dl - dp, sl - sp);
|
||||
|
||||
if (isASCIICompatible) {
|
||||
int n = JLA.encodeASCII(sa, sp, da, dp, len);
|
||||
sp += n;
|
||||
dp += n;
|
||||
len -= n;
|
||||
}
|
||||
while (len-- > 0) {
|
||||
char c = sa[sp];
|
||||
int b = encode(c);
|
||||
|
|
|
@ -61,9 +61,9 @@ public class US_ASCII
|
|||
return new Encoder(this);
|
||||
}
|
||||
|
||||
private static class Decoder extends CharsetDecoder {
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
private static class Decoder extends CharsetDecoder {
|
||||
|
||||
private Decoder(Charset cs) {
|
||||
super(cs, 1.0f, 1.0f);
|
||||
|
@ -159,6 +159,10 @@ public class US_ASCII
|
|||
assert (dp <= dl);
|
||||
dp = (dp <= dl ? dp : dl);
|
||||
|
||||
int n = JLA.encodeASCII(sa, sp, da, dp, Math.min(sl - sp, dl - dp));
|
||||
sp += n;
|
||||
dp += n;
|
||||
|
||||
try {
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
|
|
|
@ -83,9 +83,9 @@ public final class UTF_8 extends Unicode {
|
|||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
|
||||
private static class Decoder extends CharsetDecoder {
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
private static class Decoder extends CharsetDecoder {
|
||||
|
||||
private Decoder(Charset cs) {
|
||||
super(cs, 1.0f, 1.0f);
|
||||
|
@ -443,8 +443,7 @@ public final class UTF_8 extends Unicode {
|
|||
|
||||
private Surrogate.Parser sgp;
|
||||
private CoderResult encodeArrayLoop(CharBuffer src,
|
||||
ByteBuffer dst)
|
||||
{
|
||||
ByteBuffer dst) {
|
||||
char[] sa = src.array();
|
||||
int sp = src.arrayOffset() + src.position();
|
||||
int sl = src.arrayOffset() + src.limit();
|
||||
|
@ -452,11 +451,22 @@ public final class UTF_8 extends Unicode {
|
|||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
int dlASCII = dp + Math.min(sl - sp, dl - dp);
|
||||
|
||||
// ASCII only loop
|
||||
while (dp < dlASCII && sa[sp] < '\u0080')
|
||||
da[dp++] = (byte) sa[sp++];
|
||||
// Handle ASCII-only prefix
|
||||
int n = JLA.encodeASCII(sa, sp, da, dp, Math.min(sl - sp, dl - dp));
|
||||
sp += n;
|
||||
dp += n;
|
||||
|
||||
if (sp < sl) {
|
||||
return encodeArrayLoopSlow(src, sa, sp, sl, dst, da, dp, dl);
|
||||
} else {
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return CoderResult.UNDERFLOW;
|
||||
}
|
||||
}
|
||||
|
||||
private CoderResult encodeArrayLoopSlow(CharBuffer src, char[] sa, int sp, int sl,
|
||||
ByteBuffer dst, byte[] da, int dp, int dl) {
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
if (c < 0x80) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue