mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 11:31:57 +00:00
[VM] Consolidate architecture-specific Label classes
R=vegorov@google.com Change-Id: I3f3342282ac21b06e675b21981168f2a6750b6bd Reviewed-on: https://dart-review.googlesource.com/39524 Commit-Queue: Erik Corry <erikcorry@google.com> Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
This commit is contained in:
parent
cc6b4219a5
commit
362e7c7883
|
@ -24,6 +24,80 @@ class AssemblerFixup;
|
|||
class AssemblerBuffer;
|
||||
class MemoryRegion;
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0), unresolved_(0) {
|
||||
#ifdef DEBUG
|
||||
for (int i = 0; i < kMaxUnresolvedBranches; i++) {
|
||||
unresolved_near_positions_[i] = -1;
|
||||
}
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
ASSERT(!HasNear());
|
||||
}
|
||||
|
||||
// Returns the position for bound and linked labels. Cannot be used
|
||||
// for unused labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(!IsUnused());
|
||||
return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t LinkPosition() const {
|
||||
ASSERT(IsLinked());
|
||||
return position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t NearPosition() {
|
||||
ASSERT(HasNear());
|
||||
return unresolved_near_positions_[--unresolved_];
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return position_ == 0 && unresolved_ == 0; }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
bool HasNear() const { return unresolved_ != 0; }
|
||||
|
||||
private:
|
||||
#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_IA32)
|
||||
static const int kMaxUnresolvedBranches = 20;
|
||||
#else
|
||||
static const int kMaxUnresolvedBranches = 1; // Unused on non-Intel.
|
||||
#endif
|
||||
|
||||
intptr_t position_;
|
||||
intptr_t unresolved_;
|
||||
intptr_t unresolved_near_positions_[kMaxUnresolvedBranches];
|
||||
|
||||
void Reinitialize() { position_ = 0; }
|
||||
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(!HasNear());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
void NearLinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(unresolved_ < kMaxUnresolvedBranches);
|
||||
unresolved_near_positions_[unresolved_++] = position;
|
||||
}
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
// External labels keep a function pointer to allow them
|
||||
// to be called from code generated by the assembler.
|
||||
class ExternalLabel : public ValueObject {
|
||||
|
|
|
@ -64,47 +64,6 @@ enum {
|
|||
B27 = 1 << 27,
|
||||
};
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0) {}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
}
|
||||
|
||||
// Returns the position for bound and linked labels. Cannot be used
|
||||
// for unused labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(!IsUnused());
|
||||
return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return position_ == 0; }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
|
||||
private:
|
||||
intptr_t position_;
|
||||
|
||||
void Reinitialize() { position_ = 0; }
|
||||
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
class ArmEncode : public AllStatic {
|
||||
public:
|
||||
static inline uint32_t Rd(Register rd) {
|
||||
|
|
|
@ -41,47 +41,6 @@ class Immediate : public ValueObject {
|
|||
friend class Assembler;
|
||||
};
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0) {}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
}
|
||||
|
||||
// Returns the position for bound and linked labels. Cannot be used
|
||||
// for unused labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(!IsUnused());
|
||||
return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return position_ == 0; }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
|
||||
private:
|
||||
intptr_t position_;
|
||||
|
||||
void Reinitialize() { position_ = 0; }
|
||||
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
class Arm64Encode : public AllStatic {
|
||||
public:
|
||||
static inline uint32_t Rd(Register rd) {
|
||||
|
|
|
@ -25,47 +25,6 @@ class Address : public ValueObject {
|
|||
Address();
|
||||
};
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0) {}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
}
|
||||
|
||||
// Returns the position for bound and linked labels. Cannot be used
|
||||
// for unused labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(!IsUnused());
|
||||
return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return position_ == 0; }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
|
||||
private:
|
||||
intptr_t position_;
|
||||
|
||||
void Reinitialize() { position_ = 0; }
|
||||
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
class Assembler : public ValueObject {
|
||||
public:
|
||||
explicit Assembler(bool use_far_branches = false) : buffer_(), comments_() {}
|
||||
|
|
|
@ -221,74 +221,6 @@ class FieldAddress : public Address {
|
|||
}
|
||||
};
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0), unresolved_(0) {
|
||||
#ifdef DEBUG
|
||||
for (int i = 0; i < kMaxUnresolvedBranches; i++) {
|
||||
unresolved_near_positions_[i] = -1;
|
||||
}
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
ASSERT(!HasNear());
|
||||
}
|
||||
|
||||
// Returns the position for bound labels. Cannot be used for unused or linked
|
||||
// labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(IsBound());
|
||||
return -position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t LinkPosition() const {
|
||||
ASSERT(IsLinked());
|
||||
return position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t NearPosition() {
|
||||
ASSERT(HasNear());
|
||||
return unresolved_near_positions_[--unresolved_];
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return (position_ == 0) && (unresolved_ == 0); }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
bool HasNear() const { return unresolved_ != 0; }
|
||||
|
||||
private:
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(!HasNear());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
void NearLinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(unresolved_ < kMaxUnresolvedBranches);
|
||||
unresolved_near_positions_[unresolved_++] = position;
|
||||
}
|
||||
|
||||
static const int kMaxUnresolvedBranches = 20;
|
||||
|
||||
intptr_t position_;
|
||||
intptr_t unresolved_;
|
||||
intptr_t unresolved_near_positions_[kMaxUnresolvedBranches];
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
class Assembler : public ValueObject {
|
||||
public:
|
||||
explicit Assembler(bool use_far_branches = false)
|
||||
|
|
|
@ -275,74 +275,6 @@ class FieldAddress : public Address {
|
|||
}
|
||||
};
|
||||
|
||||
class Label : public ValueObject {
|
||||
public:
|
||||
Label() : position_(0), unresolved_(0) {
|
||||
#ifdef DEBUG
|
||||
for (int i = 0; i < kMaxUnresolvedBranches; i++) {
|
||||
unresolved_near_positions_[i] = -1;
|
||||
}
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
~Label() {
|
||||
// Assert if label is being destroyed with unresolved branches pending.
|
||||
ASSERT(!IsLinked());
|
||||
ASSERT(!HasNear());
|
||||
}
|
||||
|
||||
// Returns the position for bound labels. Cannot be used for unused or linked
|
||||
// labels.
|
||||
intptr_t Position() const {
|
||||
ASSERT(IsBound());
|
||||
return -position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t LinkPosition() const {
|
||||
ASSERT(IsLinked());
|
||||
return position_ - kWordSize;
|
||||
}
|
||||
|
||||
intptr_t NearPosition() {
|
||||
ASSERT(HasNear());
|
||||
return unresolved_near_positions_[--unresolved_];
|
||||
}
|
||||
|
||||
bool IsBound() const { return position_ < 0; }
|
||||
bool IsUnused() const { return (position_ == 0) && (unresolved_ == 0); }
|
||||
bool IsLinked() const { return position_ > 0; }
|
||||
bool HasNear() const { return unresolved_ != 0; }
|
||||
|
||||
private:
|
||||
void BindTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(!HasNear());
|
||||
position_ = -position - kWordSize;
|
||||
ASSERT(IsBound());
|
||||
}
|
||||
|
||||
void LinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
position_ = position + kWordSize;
|
||||
ASSERT(IsLinked());
|
||||
}
|
||||
|
||||
void NearLinkTo(intptr_t position) {
|
||||
ASSERT(!IsBound());
|
||||
ASSERT(unresolved_ < kMaxUnresolvedBranches);
|
||||
unresolved_near_positions_[unresolved_++] = position;
|
||||
}
|
||||
|
||||
static const int kMaxUnresolvedBranches = 20;
|
||||
|
||||
intptr_t position_;
|
||||
intptr_t unresolved_;
|
||||
intptr_t unresolved_near_positions_[kMaxUnresolvedBranches];
|
||||
|
||||
friend class Assembler;
|
||||
DISALLOW_COPY_AND_ASSIGN(Label);
|
||||
};
|
||||
|
||||
class Assembler : public ValueObject {
|
||||
public:
|
||||
explicit Assembler(bool use_far_branches = false);
|
||||
|
|
Loading…
Reference in a new issue