mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 14:24:46 +02:00
8345465: Fix performance regression on x64 after JDK-8345120
Reviewed-by: mcimadamore
This commit is contained in:
parent
2979806c72
commit
06c44dd568
2 changed files with 29 additions and 24 deletions
|
@ -130,8 +130,8 @@ public final class StringSupport {
|
|||
final long toOffset) {
|
||||
final long length = toOffset - fromOffset;
|
||||
segment.checkBounds(fromOffset, length);
|
||||
if (length == 0) {
|
||||
// The state has to be checked explicitly for zero-length segments
|
||||
if (length < Byte.BYTES) {
|
||||
// There can be no null terminator present
|
||||
segment.scope.checkValidState();
|
||||
throw nullNotFound(segment, fromOffset, toOffset);
|
||||
}
|
||||
|
@ -164,7 +164,8 @@ public final class StringSupport {
|
|||
final long toOffset) {
|
||||
final long length = toOffset - fromOffset;
|
||||
segment.checkBounds(fromOffset, length);
|
||||
if (length == 0) {
|
||||
if (length < Short.BYTES) {
|
||||
// There can be no null terminator present
|
||||
segment.scope.checkValidState();
|
||||
throw nullNotFound(segment, fromOffset, toOffset);
|
||||
}
|
||||
|
@ -199,19 +200,23 @@ public final class StringSupport {
|
|||
final long toOffset) {
|
||||
final long length = toOffset - fromOffset;
|
||||
segment.checkBounds(fromOffset, length);
|
||||
if (length == 0) {
|
||||
if (length < Integer.BYTES) {
|
||||
// There can be no null terminator present
|
||||
segment.scope.checkValidState();
|
||||
throw nullNotFound(segment, fromOffset, toOffset);
|
||||
}
|
||||
final long longBytes = length & LONG_MASK;
|
||||
final long longLimit = fromOffset + longBytes;
|
||||
long offset = fromOffset;
|
||||
for (; offset < longLimit; offset += Long.BYTES) {
|
||||
long val = SCOPED_MEMORY_ACCESS.getLongUnaligned(segment.sessionImpl(), segment.unsafeGetBase(), segment.unsafeGetOffset() + offset, !Architecture.isLittleEndian());
|
||||
if (mightContainZeroInt(val)) {
|
||||
for (int j = 0; j < Long.BYTES; j += Integer.BYTES) {
|
||||
if (SCOPED_MEMORY_ACCESS.getIntUnaligned(segment.sessionImpl(), segment.unsafeGetBase(), segment.unsafeGetOffset() + offset + j, !Architecture.isLittleEndian()) == 0) {
|
||||
return requireWithinStringSize(offset + j - fromOffset, segment, fromOffset, toOffset);
|
||||
// For quad byte strings, it does not pay off to use long scanning on x64
|
||||
if (!Architecture.isX64()) {
|
||||
final long longBytes = length & LONG_MASK;
|
||||
final long longLimit = fromOffset + longBytes;
|
||||
for (; offset < longLimit; offset += Long.BYTES) {
|
||||
long val = SCOPED_MEMORY_ACCESS.getLongUnaligned(segment.sessionImpl(), segment.unsafeGetBase(), segment.unsafeGetOffset() + offset, !Architecture.isLittleEndian());
|
||||
if (mightContainZeroInt(val)) {
|
||||
for (int j = 0; j < Long.BYTES; j += Integer.BYTES) {
|
||||
if (SCOPED_MEMORY_ACCESS.getIntUnaligned(segment.sessionImpl(), segment.unsafeGetBase(), segment.unsafeGetOffset() + offset + j, !Architecture.isLittleEndian()) == 0) {
|
||||
return requireWithinStringSize(offset + j - fromOffset, segment, fromOffset, toOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue