| Index: runtime/vm/locations.h
|
| diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
|
| index cabb8dbda12a8b5c01da1d51aa4d9cbe84202408..cf6a60b10157c51a340246754bc4eef64b6dd669 100644
|
| --- a/runtime/vm/locations.h
|
| +++ b/runtime/vm/locations.h
|
| @@ -331,11 +331,15 @@ class Location : public ValueObject {
|
| }
|
|
|
| intptr_t stack_index() const {
|
| - ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot());
|
| + ASSERT(HasStackIndex());
|
| // Decode stack index manually to preserve sign.
|
| return payload() - kStackIndexBias;
|
| }
|
|
|
| + bool HasStackIndex() const {
|
| + return IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot();
|
| + }
|
| +
|
| // Return a memory operand for stack slot locations.
|
| Address ToStackSlotAddress() const;
|
|
|
| @@ -365,6 +369,8 @@ class Location : public ValueObject {
|
| return KindField::decode(value_);
|
| }
|
|
|
| + Location Copy() const;
|
| +
|
| private:
|
| explicit Location(uword value) : value_(value) { }
|
|
|
| @@ -428,15 +434,20 @@ class PairLocation : public ZoneAllocated {
|
|
|
| class RegisterSet : public ValueObject {
|
| public:
|
| - RegisterSet() : cpu_registers_(0), fpu_registers_(0) {
|
| + RegisterSet() : cpu_registers_(0), untagged_cpu_registers_(0),
|
| + fpu_registers_(0) {
|
| ASSERT(kNumberOfCpuRegisters <= (kWordSize * kBitsPerByte));
|
| ASSERT(kNumberOfFpuRegisters <= (kWordSize * kBitsPerByte));
|
| }
|
|
|
|
|
| - void Add(Location loc) {
|
| + void Add(Location loc, Representation rep = kTagged) {
|
| if (loc.IsRegister()) {
|
| cpu_registers_ |= (1 << loc.reg());
|
| + if (rep != kTagged) {
|
| + // CPU register contains an untagged value.
|
| + MarkUntagged(loc);
|
| + }
|
| } else if (loc.IsFpuRegister()) {
|
| fpu_registers_ |= (1 << loc.fpu_reg());
|
| }
|
| @@ -450,6 +461,32 @@ class RegisterSet : public ValueObject {
|
| }
|
| }
|
|
|
| + void DebugPrint() {
|
| + for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
|
| + Register r = static_cast<Register>(i);
|
| + if (ContainsRegister(r)) {
|
| + OS::Print("%s %s\n", Assembler::RegisterName(r),
|
| + IsTagged(r) ? "tagged" : "untagged");
|
| + }
|
| + }
|
| +
|
| + for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) {
|
| + FpuRegister r = static_cast<FpuRegister>(i);
|
| + if (ContainsFpuRegister(r)) {
|
| + OS::Print("%s\n", Assembler::FpuRegisterName(r));
|
| + }
|
| + }
|
| + }
|
| +
|
| + void MarkUntagged(Location loc) {
|
| + ASSERT(loc.IsRegister());
|
| + untagged_cpu_registers_ |= (1 << loc.reg());
|
| + }
|
| +
|
| + bool IsTagged(Register reg) const {
|
| + return (untagged_cpu_registers_ & (1 << reg)) == 0;
|
| + }
|
| +
|
| bool ContainsRegister(Register reg) const {
|
| return (cpu_registers_ & (1 << reg)) != 0;
|
| }
|
| @@ -468,6 +505,7 @@ class RegisterSet : public ValueObject {
|
|
|
| private:
|
| intptr_t cpu_registers_;
|
| + intptr_t untagged_cpu_registers_;
|
| intptr_t fpu_registers_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(RegisterSet);
|
| @@ -561,6 +599,10 @@ class LocationSummary : public ZoneAllocated {
|
| return contains_call_ != kNoCall;
|
| }
|
|
|
| + bool HasCallOnSlowPath() {
|
| + return can_call() && !always_calls();
|
| + }
|
| +
|
| void PrintTo(BufferFormatter* f) const;
|
|
|
| static LocationSummary* Make(intptr_t input_count,
|
|
|