Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Unified Diff: src/ia32/assembler-ia32.h

Issue 2900683002: [compiler] Delay allocation of code-embedded heap numbers. (Closed)
Patch Set: Fix rebase. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/deoptimizer.cc ('k') | src/ia32/assembler-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ia32/assembler-ia32.h
diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h
index cbb8ba276197a0205cf4d2951428bd2813f8cb4b..07aee910b3400a94ff6a85663371eea517943398 100644
--- a/src/ia32/assembler-ia32.h
+++ b/src/ia32/assembler-ia32.h
@@ -275,28 +275,50 @@ class Immediate BASE_EMBEDDED {
inline explicit Immediate(Address addr);
inline explicit Immediate(Address x, RelocInfo::Mode rmode);
+ static Immediate EmbeddedNumber(double value); // Smi or HeapNumber.
+
static Immediate CodeRelativeOffset(Label* label) {
return Immediate(label);
}
- bool is_zero() const { return x_ == 0 && RelocInfo::IsNone(rmode_); }
+ bool is_heap_number() const {
+ DCHECK_IMPLIES(is_heap_number_, rmode_ == RelocInfo::EMBEDDED_OBJECT);
+ return is_heap_number_;
+ }
+
+ double heap_number() const {
+ DCHECK(is_heap_number());
+ return value_.heap_number;
+ }
+
+ int immediate() const {
+ DCHECK(!is_heap_number());
+ return value_.immediate;
+ }
+
+ bool is_zero() const { return RelocInfo::IsNone(rmode_) && immediate() == 0; }
bool is_int8() const {
- return -128 <= x_ && x_ < 128 && RelocInfo::IsNone(rmode_);
+ return RelocInfo::IsNone(rmode_) && i::is_int8(immediate());
}
bool is_uint8() const {
- return v8::internal::is_uint8(x_) && RelocInfo::IsNone(rmode_);
+ return RelocInfo::IsNone(rmode_) && i::is_uint8(immediate());
}
bool is_int16() const {
- return -32768 <= x_ && x_ < 32768 && RelocInfo::IsNone(rmode_);
+ return RelocInfo::IsNone(rmode_) && i::is_int16(immediate());
}
+
bool is_uint16() const {
- return v8::internal::is_uint16(x_) && RelocInfo::IsNone(rmode_);
+ return RelocInfo::IsNone(rmode_) && i::is_uint16(immediate());
}
private:
inline explicit Immediate(Label* value);
- int x_;
+ union {
+ double heap_number;
+ int immediate;
+ } value_;
+ bool is_heap_number_ = false;
RelocInfo::Mode rmode_;
friend class Operand;
@@ -375,7 +397,7 @@ class Operand BASE_EMBEDDED {
}
static Operand ForRegisterPlusImmediate(Register base, Immediate imm) {
- return Operand(base, imm.x_, imm.rmode_);
+ return Operand(base, imm.value_.immediate, imm.rmode_);
}
// Returns true if this Operand is a wrapper for the specified register.
@@ -493,7 +515,7 @@ class Assembler : public AssemblerBase {
// GetCode emits any pending (non-emitted) code and fills the descriptor
// desc. GetCode() is idempotent; it returns the same result if no other
// Assembler functions are invoked in between GetCode() calls.
- void GetCode(CodeDesc* desc);
+ void GetCode(Isolate* isolate, CodeDesc* desc);
// Read/Modify the code target in the branch/call instruction at pc.
// The isolate argument is unused (and may be nullptr) when skipping flushing.
@@ -1615,6 +1637,12 @@ class Assembler : public AssemblerBase {
UNREACHABLE();
}
+ // Patch the dummy heap number that we emitted at {pc} during code assembly
+ // with the actual heap object (handle).
+ static void set_heap_number(Handle<HeapObject> number, Address pc) {
+ Memory::Object_Handle_at(pc) = number;
+ }
+
protected:
void emit_sse_operand(XMMRegister reg, const Operand& adr);
void emit_sse_operand(XMMRegister dst, XMMRegister src);
« no previous file with comments | « src/deoptimizer.cc ('k') | src/ia32/assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698