[loong64][mips64][compiler] Remove delayed string constants
Port commit de04959f17
Change-Id: Ie7740a09b848f06c87ad096218e3e4e34c2bae3f
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3830647
Auto-Submit: Liu Yu <liuyu@loongson.cn>
Reviewed-by: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn>
Commit-Queue: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn>
Cr-Commit-Position: refs/heads/main@{#82461}
This commit is contained in:
parent
7ec18f74f9
commit
e442dce90f
@ -23,7 +23,7 @@ bool Operand::is_reg() const { return rm_.is_valid(); }
|
||||
|
||||
int64_t Operand::immediate() const {
|
||||
DCHECK(!is_reg());
|
||||
DCHECK(!IsHeapObjectRequest());
|
||||
DCHECK(!IsHeapNumberRequest());
|
||||
return value_.immediate;
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include "src/codegen/loong64/assembler-loong64-inl.h"
|
||||
#include "src/codegen/machine-type.h"
|
||||
#include "src/codegen/safepoint-table.h"
|
||||
#include "src/codegen/string-constants.h"
|
||||
#include "src/deoptimizer/deoptimizer.h"
|
||||
#include "src/objects/heap-number-inl.h"
|
||||
|
||||
@ -124,15 +123,8 @@ Operand Operand::EmbeddedNumber(double value) {
|
||||
int32_t smi;
|
||||
if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi));
|
||||
Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
result.is_heap_object_request_ = true;
|
||||
result.value_.heap_object_request = HeapObjectRequest(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) {
|
||||
Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
result.is_heap_object_request_ = true;
|
||||
result.value_.heap_object_request = HeapObjectRequest(str);
|
||||
result.is_heap_number_request_ = true;
|
||||
result.value_.heap_number_request = HeapNumberRequest(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -142,21 +134,12 @@ MemOperand::MemOperand(Register base, int32_t offset)
|
||||
MemOperand::MemOperand(Register base, Register index)
|
||||
: base_(base), index_(index), offset_(0) {}
|
||||
|
||||
void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
|
||||
DCHECK_IMPLIES(isolate == nullptr, heap_object_requests_.empty());
|
||||
for (auto& request : heap_object_requests_) {
|
||||
void Assembler::AllocateAndInstallRequestedHeapNumbers(Isolate* isolate) {
|
||||
DCHECK_IMPLIES(isolate == nullptr, heap_number_requests_.empty());
|
||||
for (auto& request : heap_number_requests_) {
|
||||
Handle<HeapObject> object;
|
||||
switch (request.kind()) {
|
||||
case HeapObjectRequest::kHeapNumber:
|
||||
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
|
||||
request.heap_number());
|
||||
break;
|
||||
case HeapObjectRequest::kStringConstant:
|
||||
const StringConstantBase* str = request.string();
|
||||
CHECK_NOT_NULL(str);
|
||||
object = str->AllocateStringConstant(isolate);
|
||||
break;
|
||||
}
|
||||
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
|
||||
request.heap_number());
|
||||
Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset();
|
||||
set_target_value_at(pc, reinterpret_cast<uint64_t>(object.location()));
|
||||
}
|
||||
@ -206,7 +189,7 @@ void Assembler::GetCode(Isolate* isolate, CodeDesc* desc,
|
||||
|
||||
DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap.
|
||||
|
||||
AllocateAndInstallRequestedHeapObjects(isolate);
|
||||
AllocateAndInstallRequestedHeapNumbers(isolate);
|
||||
|
||||
// Set up code descriptor.
|
||||
// TODO(jgruber): Reconsider how these offsets and sizes are maintained up to
|
||||
|
@ -48,7 +48,6 @@ class Operand {
|
||||
}
|
||||
|
||||
static Operand EmbeddedNumber(double number); // Smi or HeapNumber.
|
||||
static Operand EmbeddedStringConstant(const StringConstantBase* str);
|
||||
|
||||
// Register.
|
||||
V8_INLINE explicit Operand(Register rm) : rm_(rm) {}
|
||||
@ -60,17 +59,17 @@ class Operand {
|
||||
|
||||
bool IsImmediate() const { return !rm_.is_valid(); }
|
||||
|
||||
HeapObjectRequest heap_object_request() const {
|
||||
DCHECK(IsHeapObjectRequest());
|
||||
return value_.heap_object_request;
|
||||
HeapNumberRequest heap_number_request() const {
|
||||
DCHECK(IsHeapNumberRequest());
|
||||
return value_.heap_number_request;
|
||||
}
|
||||
|
||||
bool IsHeapObjectRequest() const {
|
||||
DCHECK_IMPLIES(is_heap_object_request_, IsImmediate());
|
||||
DCHECK_IMPLIES(is_heap_object_request_,
|
||||
bool IsHeapNumberRequest() const {
|
||||
DCHECK_IMPLIES(is_heap_number_request_, IsImmediate());
|
||||
DCHECK_IMPLIES(is_heap_number_request_,
|
||||
rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
|
||||
rmode_ == RelocInfo::CODE_TARGET);
|
||||
return is_heap_object_request_;
|
||||
return is_heap_number_request_;
|
||||
}
|
||||
|
||||
Register rm() const { return rm_; }
|
||||
@ -81,10 +80,10 @@ class Operand {
|
||||
Register rm_;
|
||||
union Value {
|
||||
Value() {}
|
||||
HeapObjectRequest heap_object_request; // if is_heap_object_request_
|
||||
HeapNumberRequest heap_number_request; // if is_heap_number_request_
|
||||
int64_t immediate; // otherwise
|
||||
} value_; // valid if rm_ == no_reg
|
||||
bool is_heap_object_request_ = false;
|
||||
bool is_heap_number_request_ = false;
|
||||
RelocInfo::Mode rmode_;
|
||||
|
||||
friend class Assembler;
|
||||
@ -1072,7 +1071,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
|
||||
DoubleRegList scratch_fpregister_list_;
|
||||
|
||||
private:
|
||||
void AllocateAndInstallRequestedHeapObjects(Isolate* isolate);
|
||||
void AllocateAndInstallRequestedHeapNumbers(Isolate* isolate);
|
||||
|
||||
int WriteCodeComments();
|
||||
|
||||
|
@ -1122,11 +1122,6 @@ void TurboAssembler::li(Register dst, ExternalReference value, LiFlags mode) {
|
||||
li(dst, Operand(value), mode);
|
||||
}
|
||||
|
||||
void TurboAssembler::li(Register dst, const StringConstantBase* string,
|
||||
LiFlags mode) {
|
||||
li(dst, Operand::EmbeddedStringConstant(string), mode);
|
||||
}
|
||||
|
||||
static inline int InstrCountForLiLower32Bit(int64_t value) {
|
||||
if (is_int12(static_cast<int32_t>(value)) ||
|
||||
is_uint12(static_cast<int32_t>(value)) || !(value & kImm12Mask)) {
|
||||
@ -1221,8 +1216,8 @@ void TurboAssembler::li(Register rd, Operand j, LiFlags mode) {
|
||||
li_optimized(rd, j, mode);
|
||||
} else if (MustUseReg(j.rmode())) {
|
||||
int64_t immediate;
|
||||
if (j.IsHeapObjectRequest()) {
|
||||
RequestHeapObject(j.heap_object_request());
|
||||
if (j.IsHeapNumberRequest()) {
|
||||
RequestHeapNumber(j.heap_number_request());
|
||||
immediate = 0;
|
||||
} else {
|
||||
immediate = j.immediate();
|
||||
|
@ -154,8 +154,6 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
}
|
||||
void li(Register dst, Handle<HeapObject> value, LiFlags mode = OPTIMIZE_SIZE);
|
||||
void li(Register dst, ExternalReference value, LiFlags mode = OPTIMIZE_SIZE);
|
||||
void li(Register dst, const StringConstantBase* string,
|
||||
LiFlags mode = OPTIMIZE_SIZE);
|
||||
|
||||
void LoadFromConstantsTable(Register destination, int constant_index) final;
|
||||
void LoadRootRegisterOffset(Register destination, intptr_t offset) final;
|
||||
|
@ -54,7 +54,7 @@ bool Operand::is_reg() const { return rm_.is_valid(); }
|
||||
|
||||
int64_t Operand::immediate() const {
|
||||
DCHECK(!is_reg());
|
||||
DCHECK(!IsHeapObjectRequest());
|
||||
DCHECK(!IsHeapNumberRequest());
|
||||
return value_.immediate;
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,6 @@
|
||||
#include "src/codegen/machine-type.h"
|
||||
#include "src/codegen/mips64/assembler-mips64-inl.h"
|
||||
#include "src/codegen/safepoint-table.h"
|
||||
#include "src/codegen/string-constants.h"
|
||||
#include "src/deoptimizer/deoptimizer.h"
|
||||
#include "src/objects/heap-number-inl.h"
|
||||
|
||||
@ -187,15 +186,8 @@ Operand Operand::EmbeddedNumber(double value) {
|
||||
int32_t smi;
|
||||
if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi));
|
||||
Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
result.is_heap_object_request_ = true;
|
||||
result.value_.heap_object_request = HeapObjectRequest(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
Operand Operand::EmbeddedStringConstant(const StringConstantBase* str) {
|
||||
Operand result(0, RelocInfo::FULL_EMBEDDED_OBJECT);
|
||||
result.is_heap_object_request_ = true;
|
||||
result.value_.heap_object_request = HeapObjectRequest(str);
|
||||
result.is_heap_number_request_ = true;
|
||||
result.value_.heap_number_request = HeapNumberRequest(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -209,21 +201,12 @@ MemOperand::MemOperand(Register rm, int32_t unit, int32_t multiplier,
|
||||
offset_ = unit * multiplier + offset_addend;
|
||||
}
|
||||
|
||||
void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
|
||||
DCHECK_IMPLIES(isolate == nullptr, heap_object_requests_.empty());
|
||||
for (auto& request : heap_object_requests_) {
|
||||
void Assembler::AllocateAndInstallRequestedHeapNumbers(Isolate* isolate) {
|
||||
DCHECK_IMPLIES(isolate == nullptr, heap_number_requests_.empty());
|
||||
for (auto& request : heap_number_requests_) {
|
||||
Handle<HeapObject> object;
|
||||
switch (request.kind()) {
|
||||
case HeapObjectRequest::kHeapNumber:
|
||||
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
|
||||
request.heap_number());
|
||||
break;
|
||||
case HeapObjectRequest::kStringConstant:
|
||||
const StringConstantBase* str = request.string();
|
||||
CHECK_NOT_NULL(str);
|
||||
object = str->AllocateStringConstant(isolate);
|
||||
break;
|
||||
}
|
||||
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
|
||||
request.heap_number());
|
||||
Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset();
|
||||
set_target_value_at(pc, reinterpret_cast<uint64_t>(object.location()));
|
||||
}
|
||||
@ -306,7 +289,7 @@ void Assembler::GetCode(Isolate* isolate, CodeDesc* desc,
|
||||
|
||||
DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap.
|
||||
|
||||
AllocateAndInstallRequestedHeapObjects(isolate);
|
||||
AllocateAndInstallRequestedHeapNumbers(isolate);
|
||||
|
||||
// Set up code descriptor.
|
||||
// TODO(jgruber): Reconsider how these offsets and sizes are maintained up to
|
||||
|
@ -78,7 +78,6 @@ class Operand {
|
||||
}
|
||||
|
||||
static Operand EmbeddedNumber(double number); // Smi or HeapNumber.
|
||||
static Operand EmbeddedStringConstant(const StringConstantBase* str);
|
||||
|
||||
// Register.
|
||||
V8_INLINE explicit Operand(Register rm) : rm_(rm) {}
|
||||
@ -90,17 +89,17 @@ class Operand {
|
||||
|
||||
bool IsImmediate() const { return !rm_.is_valid(); }
|
||||
|
||||
HeapObjectRequest heap_object_request() const {
|
||||
DCHECK(IsHeapObjectRequest());
|
||||
return value_.heap_object_request;
|
||||
HeapNumberRequest heap_number_request() const {
|
||||
DCHECK(IsHeapNumberRequest());
|
||||
return value_.heap_number_request;
|
||||
}
|
||||
|
||||
bool IsHeapObjectRequest() const {
|
||||
DCHECK_IMPLIES(is_heap_object_request_, IsImmediate());
|
||||
DCHECK_IMPLIES(is_heap_object_request_,
|
||||
bool IsHeapNumberRequest() const {
|
||||
DCHECK_IMPLIES(is_heap_number_request_, IsImmediate());
|
||||
DCHECK_IMPLIES(is_heap_number_request_,
|
||||
rmode_ == RelocInfo::FULL_EMBEDDED_OBJECT ||
|
||||
rmode_ == RelocInfo::CODE_TARGET);
|
||||
return is_heap_object_request_;
|
||||
return is_heap_number_request_;
|
||||
}
|
||||
|
||||
Register rm() const { return rm_; }
|
||||
@ -111,10 +110,10 @@ class Operand {
|
||||
Register rm_;
|
||||
union Value {
|
||||
Value() {}
|
||||
HeapObjectRequest heap_object_request; // if is_heap_object_request_
|
||||
HeapNumberRequest heap_number_request; // if is_heap_number_request_
|
||||
int64_t immediate; // otherwise
|
||||
} value_; // valid if rm_ == no_reg
|
||||
bool is_heap_object_request_ = false;
|
||||
bool is_heap_number_request_ = false;
|
||||
RelocInfo::Mode rmode_;
|
||||
|
||||
friend class Assembler;
|
||||
@ -1908,7 +1907,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
|
||||
RegList scratch_register_list_;
|
||||
|
||||
private:
|
||||
void AllocateAndInstallRequestedHeapObjects(Isolate* isolate);
|
||||
void AllocateAndInstallRequestedHeapNumbers(Isolate* isolate);
|
||||
|
||||
int WriteCodeComments();
|
||||
|
||||
|
@ -1536,11 +1536,6 @@ void TurboAssembler::li(Register dst, ExternalReference value, LiFlags mode) {
|
||||
li(dst, Operand(value), mode);
|
||||
}
|
||||
|
||||
void TurboAssembler::li(Register dst, const StringConstantBase* string,
|
||||
LiFlags mode) {
|
||||
li(dst, Operand::EmbeddedStringConstant(string), mode);
|
||||
}
|
||||
|
||||
static inline int InstrCountForLiLower32Bit(int64_t value) {
|
||||
if (!is_int16(static_cast<int32_t>(value)) && (value & kUpper16MaskOf64) &&
|
||||
(value & kImm16Mask)) {
|
||||
@ -1869,8 +1864,8 @@ void TurboAssembler::li(Register rd, Operand j, LiFlags mode) {
|
||||
}
|
||||
} else if (MustUseReg(j.rmode())) {
|
||||
int64_t immediate;
|
||||
if (j.IsHeapObjectRequest()) {
|
||||
RequestHeapObject(j.heap_object_request());
|
||||
if (j.IsHeapNumberRequest()) {
|
||||
RequestHeapNumber(j.heap_number_request());
|
||||
immediate = 0;
|
||||
} else {
|
||||
immediate = j.immediate();
|
||||
|
@ -214,8 +214,6 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
// }
|
||||
void li(Register dst, Handle<HeapObject> value, LiFlags mode = OPTIMIZE_SIZE);
|
||||
void li(Register dst, ExternalReference value, LiFlags mode = OPTIMIZE_SIZE);
|
||||
void li(Register dst, const StringConstantBase* string,
|
||||
LiFlags mode = OPTIMIZE_SIZE);
|
||||
|
||||
void LoadFromConstantsTable(Register destination, int constant_index) final;
|
||||
void LoadRootRegisterOffset(Register destination, intptr_t offset) final;
|
||||
|
@ -89,9 +89,6 @@ class Loong64OperandConverter final : public InstructionOperandConverter {
|
||||
case Constant::kCompressedHeapObject:
|
||||
case Constant::kHeapObject:
|
||||
break;
|
||||
case Constant::kDelayedStringConstant:
|
||||
return Operand::EmbeddedStringConstant(
|
||||
constant.ToDelayedStringConstant());
|
||||
case Constant::kRpoNumber:
|
||||
UNREACHABLE(); // TODO(titzer): RPO immediates on loong64?
|
||||
}
|
||||
@ -2642,9 +2639,6 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
|
||||
case Constant::kExternalReference:
|
||||
__ li(dst, src.ToExternalReference());
|
||||
break;
|
||||
case Constant::kDelayedStringConstant:
|
||||
__ li(dst, src.ToDelayedStringConstant());
|
||||
break;
|
||||
case Constant::kHeapObject: {
|
||||
Handle<HeapObject> src_object = src.ToHeapObject();
|
||||
RootIndex index;
|
||||
|
@ -91,9 +91,6 @@ class MipsOperandConverter final : public InstructionOperandConverter {
|
||||
// TODO(plind): Maybe we should handle ExtRef & HeapObj here?
|
||||
// maybe not done on arm due to const pool ??
|
||||
break;
|
||||
case Constant::kDelayedStringConstant:
|
||||
return Operand::EmbeddedStringConstant(
|
||||
constant.ToDelayedStringConstant());
|
||||
case Constant::kRpoNumber:
|
||||
UNREACHABLE(); // TODO(titzer): RPO immediates on mips?
|
||||
}
|
||||
@ -4528,9 +4525,6 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
|
||||
case Constant::kExternalReference:
|
||||
__ li(dst, src.ToExternalReference());
|
||||
break;
|
||||
case Constant::kDelayedStringConstant:
|
||||
__ li(dst, src.ToDelayedStringConstant());
|
||||
break;
|
||||
case Constant::kHeapObject: {
|
||||
Handle<HeapObject> src_object = src.ToHeapObject();
|
||||
RootIndex index;
|
||||
|
Loading…
Reference in New Issue
Block a user