Commit b2d21137 authored by Théotime Grohens's avatar Théotime Grohens Committed by Commit Bot

[torque] Remove DataView fast path in Torque

This CL is a manual revert of 3e78711c.

Adding the fast path did not result in any performance improvement,
and actually decreased DataView performance in the performance test.

Change-Id: I149670088b07c31e44d93ed65505254ec0caf8ba
Reviewed-on: https://chromium-review.googlesource.com/1126925Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
Commit-Queue: Théotime Grohens <theotime@google.com>
Cr-Commit-Position: refs/heads/master@{#54251}
parent fefc035e
......@@ -25,14 +25,6 @@ class DataViewBuiltinsAssembler : public BaseBuiltinsFromDSLAssembler {
return CAST(LoadObjectField(data_view, JSDataView::kByteLengthOffset));
}
bool IsTargetLittleEndian() {
#ifdef V8_TARGET_LITTLE_ENDIAN
return true;
#else
return false;
#endif
}
TNode<Int32T> LoadUint8(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset) {
return UncheckedCast<Int32T>(
Load(MachineType::Uint8(), data_pointer, offset));
......@@ -43,57 +35,12 @@ class DataViewBuiltinsAssembler : public BaseBuiltinsFromDSLAssembler {
Load(MachineType::Int8(), data_pointer, offset));
}
TNode<Int32T> LoadUint16(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset) {
return UncheckedCast<Int32T>(
Load(MachineType::Uint16(), data_pointer, offset));
}
TNode<Int32T> LoadInt16(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset) {
return UncheckedCast<Int32T>(
Load(MachineType::Int16(), data_pointer, offset));
}
TNode<Uint32T> LoadUint32(TNode<RawPtrT> data_pointer,
TNode<IntPtrT> offset) {
return UncheckedCast<Uint32T>(
Load(MachineType::Uint32(), data_pointer, offset));
}
TNode<Int32T> LoadInt32(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset) {
return UncheckedCast<Int32T>(
Load(MachineType::Int32(), data_pointer, offset));
}
TNode<Float32T> LoadFloat32(TNode<RawPtrT> data_pointer,
TNode<IntPtrT> offset) {
return UncheckedCast<Float32T>(
Load(MachineType::Float32(), data_pointer, offset));
}
TNode<Float64T> LoadFloat64(TNode<RawPtrT> data_pointer,
TNode<IntPtrT> offset) {
return UncheckedCast<Float64T>(
Load(MachineType::Float64(), data_pointer, offset));
}
void StoreWord8(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset,
TNode<Word32T> value) {
StoreNoWriteBarrier(MachineRepresentation::kWord8, data_pointer, offset,
value);
}
void StoreWord16(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset,
TNode<Word32T> value) {
StoreNoWriteBarrier(MachineRepresentation::kWord16, data_pointer, offset,
value);
}
void StoreWord32(TNode<RawPtrT> data_pointer, TNode<IntPtrT> offset,
TNode<Word32T> value) {
StoreNoWriteBarrier(MachineRepresentation::kWord32, data_pointer, offset,
value);
}
int32_t DataViewElementSize(ElementsKind elements_kind) {
return ElementsKindToByteSize(elements_kind);
}
......
......@@ -59,28 +59,6 @@ module data_view {
return data_view.byte_offset;
}
extern macro IsTargetLittleEndian(): constexpr bool;
macro EndiannessMatchesTarget(requested_little_endian: bool): bool {
if constexpr (IsTargetLittleEndian()) {
return requested_little_endian;
} else {
return !requested_little_endian;
}
}
macro IsAddressAligned(address: intptr, width: constexpr int31): bool {
if constexpr (width == 2) {
return (address & 1) == 0;
} else if constexpr (width == 4) {
return (address & 3) == 0;
} else if constexpr (width == 8) {
return (address & 7) == 0;
} else {
unreachable;
}
}
extern macro BitcastInt32ToFloat32(uint32): float32;
extern macro BitcastFloat32ToInt32(float32): uint32;
extern macro Float64ExtractLowWord32(float64): uint32;
......@@ -90,12 +68,6 @@ module data_view {
extern macro LoadUint8(RawPtr, intptr): uint32;
extern macro LoadInt8(RawPtr, intptr): int32;
extern macro LoadUint16(RawPtr, intptr): int32;
extern macro LoadInt16(RawPtr, intptr): int32;
extern macro LoadUint32(RawPtr, intptr): uint32;
extern macro LoadInt32(RawPtr, intptr): int32;
extern macro LoadFloat32(RawPtr, intptr): float32;
extern macro LoadFloat64(RawPtr, intptr): float64;
macro LoadDataViewUint8(buffer: JSArrayBuffer, offset: intptr): Smi {
return convert<Smi>(LoadUint8(buffer.backing_store, offset));
......@@ -110,17 +82,6 @@ module data_view {
signed: constexpr bool): Number {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly load the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 2) &&
EndiannessMatchesTarget(requested_little_endian)) {
if constexpr (signed) {
return convert<Number>(LoadInt16(data_pointer, offset));
} else {
return convert<Number>(LoadUint16(data_pointer, offset));
}
}
let b0: int32;
let b1: int32;
let result: int32;
......@@ -148,17 +109,6 @@ module data_view {
signed: constexpr bool): Number {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly load the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 4) &&
EndiannessMatchesTarget(requested_little_endian)) {
if constexpr (signed) {
return convert<Number>(LoadInt32(data_pointer, offset));
} else {
return convert<Number>(LoadUint32(data_pointer, offset));
}
}
let b0: uint32 = LoadUint8(data_pointer, offset);
let b1: uint32 = LoadUint8(data_pointer, offset + 1);
let b2: uint32 = LoadUint8(data_pointer, offset + 2);
......@@ -182,14 +132,6 @@ module data_view {
requested_little_endian: bool): Number {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly load the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 4) &&
EndiannessMatchesTarget(requested_little_endian)) {
let res: float64 = convert<float64>(LoadFloat32(data_pointer, offset));
return convert<Number>(res);
}
let b0: uint32 = LoadUint8(data_pointer, offset);
let b1: uint32 = LoadUint8(data_pointer, offset + 1);
let b2: uint32 = LoadUint8(data_pointer, offset + 2);
......@@ -210,13 +152,6 @@ module data_view {
requested_little_endian: bool): Number {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly load the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 8) &&
EndiannessMatchesTarget(requested_little_endian)) {
return convert<Number>(LoadFloat64(data_pointer, offset));
}
let b0: uint32 = LoadUint8(data_pointer, offset);
let b1: uint32 = LoadUint8(data_pointer, offset + 1);
let b2: uint32 = LoadUint8(data_pointer, offset + 2);
......@@ -388,38 +323,24 @@ module data_view {
requested_little_endian: bool,
signed: constexpr bool): BigInt {
let data_pointer: RawPtr = buffer.backing_store;
let b0: uint32 = LoadUint8(data_pointer, offset);
let b1: uint32 = LoadUint8(data_pointer, offset + 1);
let b2: uint32 = LoadUint8(data_pointer, offset + 2);
let b3: uint32 = LoadUint8(data_pointer, offset + 3);
let b4: uint32 = LoadUint8(data_pointer, offset + 4);
let b5: uint32 = LoadUint8(data_pointer, offset + 5);
let b6: uint32 = LoadUint8(data_pointer, offset + 6);
let b7: uint32 = LoadUint8(data_pointer, offset + 7);
let low_word: uint32;
let high_word: uint32;
// If endiannesses match and the pointer is aligned, we can
// directly load the words.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 4) &&
EndiannessMatchesTarget(requested_little_endian)) {
if (requested_little_endian) {
low_word = LoadUint32(data_pointer, offset);
high_word = LoadUint32(data_pointer, offset + 4);
} else {
high_word = LoadUint32(data_pointer, offset);
low_word = LoadUint32(data_pointer, offset + 4);
}
}
else { // We have to perform the loads byte by byte.
let b0: uint32 = LoadUint8(data_pointer, offset);
let b1: uint32 = LoadUint8(data_pointer, offset + 1);
let b2: uint32 = LoadUint8(data_pointer, offset + 2);
let b3: uint32 = LoadUint8(data_pointer, offset + 3);
let b4: uint32 = LoadUint8(data_pointer, offset + 4);
let b5: uint32 = LoadUint8(data_pointer, offset + 5);
let b6: uint32 = LoadUint8(data_pointer, offset + 6);
let b7: uint32 = LoadUint8(data_pointer, offset + 7);
if (requested_little_endian) {
low_word = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
high_word = (b7 << 24) | (b6 << 16) | (b5 << 8) | b4;
} else {
high_word = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
low_word = (b4 << 24) | (b5 << 16) | (b6 << 8) | b7;
}
if (requested_little_endian) {
low_word = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
high_word = (b7 << 24) | (b6 << 16) | (b5 << 8) | b4;
} else {
high_word = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
low_word = (b4 << 24) | (b5 << 16) | (b6 << 8) | b7;
}
return MakeBigInt(low_word, high_word, signed);
......@@ -608,8 +529,6 @@ module data_view {
extern macro TruncateFloat64ToWord32(float64): uint32;
extern macro StoreWord8(RawPtr, intptr, uint32): void;
extern macro StoreWord16(RawPtr, intptr, uint32): void;
extern macro StoreWord32(RawPtr, intptr, uint32): void;
macro StoreDataView8(buffer: JSArrayBuffer, offset: intptr,
value: uint32) {
......@@ -620,14 +539,6 @@ module data_view {
requested_little_endian: bool) {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly store the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 2) &&
EndiannessMatchesTarget(requested_little_endian)) {
StoreWord16(data_pointer, offset, value);
return;
}
let b0: uint32 = value & 0xFF;
let b1: uint32 = (value >>> 8) & 0xFF;
......@@ -644,14 +555,6 @@ module data_view {
requested_little_endian: bool) {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly store the value.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 4) &&
EndiannessMatchesTarget(requested_little_endian)) {
StoreWord32(data_pointer, offset, value);
return;
}
let b0: uint32 = value & 0xFF;
let b1: uint32 = (value >>> 8) & 0xFF;
let b2: uint32 = (value >>> 16) & 0xFF;
......@@ -675,20 +578,6 @@ module data_view {
requested_little_endian: bool) {
let data_pointer: RawPtr = buffer.backing_store;
// If endiannesses match and the pointer is aligned, we can
// directly store the words.
if (IsAddressAligned(convert<intptr>(data_pointer) + offset, 4) &&
EndiannessMatchesTarget(requested_little_endian)) {
if (requested_little_endian) {
StoreWord32(data_pointer, offset, low_word);
StoreWord32(data_pointer, offset + 4, high_word);
} else {
StoreWord32(data_pointer, offset, high_word);
StoreWord32(data_pointer, offset + 4, low_word);
}
return;
}
let b0: uint32 = low_word & 0xFF;
let b1: uint32 = (low_word >>> 8) & 0xFF;
let b2: uint32 = (low_word >>> 16) & 0xFF;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment