| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef RUNTIME_VM_ASSEMBLER_MIPS_H_ | 5 #ifndef RUNTIME_VM_ASSEMBLER_MIPS_H_ |
| 6 #define RUNTIME_VM_ASSEMBLER_MIPS_H_ | 6 #define RUNTIME_VM_ASSEMBLER_MIPS_H_ |
| 7 | 7 |
| 8 #ifndef RUNTIME_VM_ASSEMBLER_H_ | 8 #ifndef RUNTIME_VM_ASSEMBLER_H_ |
| 9 #error Do not include assembler_mips.h directly; use assembler.h instead. | 9 #error Do not include assembler_mips.h directly; use assembler.h instead. |
| 10 #endif | 10 #endif |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 kImmPos = kRelOpPos + kRelOpSize, | 155 kImmPos = kRelOpPos + kRelOpSize, |
| 156 kImmSize = 16, | 156 kImmSize = 16, |
| 157 }; | 157 }; |
| 158 | 158 |
| 159 class LeftBits : public BitField<uword, Register, kLeftPos, kLeftSize> {}; | 159 class LeftBits : public BitField<uword, Register, kLeftPos, kLeftSize> {}; |
| 160 class RightBits : public BitField<uword, Register, kRightPos, kRightSize> {}; | 160 class RightBits : public BitField<uword, Register, kRightPos, kRightSize> {}; |
| 161 class RelOpBits | 161 class RelOpBits |
| 162 : public BitField<uword, RelationOperator, kRelOpPos, kRelOpSize> {}; | 162 : public BitField<uword, RelationOperator, kRelOpPos, kRelOpSize> {}; |
| 163 class ImmBits : public BitField<uword, uint16_t, kImmPos, kImmSize> {}; | 163 class ImmBits : public BitField<uword, uint16_t, kImmPos, kImmSize> {}; |
| 164 | 164 |
| 165 Register left() const { return LeftBits::decode(bits_); } | 165 Register left() const { |
| 166 Register right() const { return RightBits::decode(bits_); } | 166 ASSERT(IsValid()); |
| 167 return LeftBits::decode(bits_); |
| 168 } |
| 169 |
| 170 Register right() const { |
| 171 ASSERT(IsValid()); |
| 172 return RightBits::decode(bits_); |
| 173 } |
| 167 RelationOperator rel_op() const { return RelOpBits::decode(bits_); } | 174 RelationOperator rel_op() const { return RelOpBits::decode(bits_); } |
| 168 int16_t imm() const { return static_cast<int16_t>(ImmBits::decode(bits_)); } | 175 int16_t imm() const { |
| 176 ASSERT(IsValid()); |
| 177 return static_cast<int16_t>(ImmBits::decode(bits_)); |
| 178 } |
| 169 | 179 |
| 170 static bool IsValidImm(int32_t value) { | 180 static bool IsValidImm(int32_t value) { |
| 171 // We want both value and value + 1 to fit in an int16_t. | 181 // We want both value and value + 1 to fit in an int16_t. |
| 172 return (-0x08000 <= value) && (value < 0x7fff); | 182 return (-0x08000 <= value) && (value < 0x7fff); |
| 173 } | 183 } |
| 174 | 184 |
| 175 void set_rel_op(RelationOperator value) { | 185 void set_rel_op(RelationOperator value) { |
| 176 ASSERT(IsValidRelOp(value)); | 186 ASSERT(IsValidRelOp(value)); |
| 177 bits_ = RelOpBits::update(value, bits_); | 187 bits_ = RelOpBits::update(value, bits_); |
| 178 } | 188 } |
| 179 | 189 |
| 190 bool IsValid() const { return rel_op() != INVALID_RELATION; } |
| 191 |
| 180 // Uninitialized condition. | 192 // Uninitialized condition. |
| 181 Condition() : ValueObject(), bits_(0) {} | 193 Condition() : ValueObject(), bits_(RelOpBits::update(INVALID_RELATION, 0)) {} |
| 182 | 194 |
| 183 // Copy constructor. | 195 // Copy constructor. |
| 184 Condition(const Condition& other) : ValueObject(), bits_(other.bits_) {} | 196 Condition(const Condition& other) : ValueObject(), bits_(other.bits_) {} |
| 185 | 197 |
| 186 // Copy assignment operator. | 198 // Copy assignment operator. |
| 187 Condition& operator=(const Condition& other) { | 199 Condition& operator=(const Condition& other) { |
| 188 bits_ = other.bits_; | 200 bits_ = other.bits_; |
| 189 return *this; | 201 return *this; |
| 190 } | 202 } |
| 191 | 203 |
| 192 Condition(Register left, | 204 Condition(Register left, |
| 193 Register right, | 205 Register right, |
| 194 RelationOperator rel_op, | 206 RelationOperator rel_op, |
| 195 int16_t imm = 0) { | 207 int16_t imm = 0) { |
| 196 // At most one constant, ZR or immediate. | 208 // At most one constant, ZR or immediate. |
| 197 ASSERT(!(((left == ZR) || (left == IMM)) && | 209 ASSERT(!(((left == ZR) || (left == IMM)) && |
| 198 ((right == ZR) || (right == IMM)))); | 210 ((right == ZR) || (right == IMM)))); |
| 199 // Non-zero immediate value is only allowed for IMM. | 211 // Non-zero immediate value is only allowed for IMM. |
| 200 ASSERT((imm != 0) == ((left == IMM) || (right == IMM))); | 212 ASSERT((imm != 0) == ((left == IMM) || (right == IMM))); |
| 201 set_left(left); | 213 set_left(left); |
| 202 set_right(right); | 214 set_right(right); |
| 203 set_rel_op(rel_op); | 215 if (rel_op == INVALID_RELATION) { |
| 216 SetToInvalidState(); |
| 217 } else { |
| 218 set_rel_op(rel_op); |
| 219 } |
| 204 set_imm(imm); | 220 set_imm(imm); |
| 205 } | 221 } |
| 206 | 222 |
| 207 private: | 223 private: |
| 224 void SetToInvalidState() { |
| 225 bits_ = RelOpBits::update(INVALID_RELATION, bits_); |
| 226 } |
| 227 |
| 208 static bool IsValidRelOp(RelationOperator value) { | 228 static bool IsValidRelOp(RelationOperator value) { |
| 209 return (AL <= value) && (value <= ULE); | 229 return (AL <= value) && (value <= ULE); |
| 210 } | 230 } |
| 211 | 231 |
| 212 static bool IsValidRegister(Register value) { | 232 static bool IsValidRegister(Register value) { |
| 213 return (ZR <= value) && (value <= IMM) && (value != AT); | 233 return (ZR <= value) && (value <= IMM) && (value != AT); |
| 214 } | 234 } |
| 215 | 235 |
| 216 void set_left(Register value) { | 236 void set_left(Register value) { |
| 217 ASSERT(IsValidRegister(value)); | 237 ASSERT(IsValidRegister(value)); |
| (...skipping 1475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 Register value, | 1713 Register value, |
| 1694 Label* no_update); | 1714 Label* no_update); |
| 1695 | 1715 |
| 1696 DISALLOW_ALLOCATION(); | 1716 DISALLOW_ALLOCATION(); |
| 1697 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1717 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1698 }; | 1718 }; |
| 1699 | 1719 |
| 1700 } // namespace dart | 1720 } // namespace dart |
| 1701 | 1721 |
| 1702 #endif // RUNTIME_VM_ASSEMBLER_MIPS_H_ | 1722 #endif // RUNTIME_VM_ASSEMBLER_MIPS_H_ |
| OLD | NEW |