Index: runtime/vm/assembler_mips.h |
=================================================================== |
--- runtime/vm/assembler_mips.h (revision 20729) |
+++ runtime/vm/assembler_mips.h (working copy) |
@@ -162,18 +162,10 @@ |
buffer_.FinalizeInstructions(region); |
} |
- // Set up a Dart frame on entry with a frame pointer and PC information to |
- // enable easy access to the RawInstruction object of code corresponding |
- // to this frame. |
- void EnterDartFrame(intptr_t frame_size) { |
- UNIMPLEMENTED(); |
- } |
- |
// Set up a stub frame so that the stack traversal code can easily identify |
// a stub frame. |
- void EnterStubFrame() { |
- UNIMPLEMENTED(); |
- } |
+ void EnterStubFrame(); |
+ void LeaveStubFrame(); |
// Instruction pattern from entrypoint is used in dart frame prologs |
// to set up the frame and save a PC which can be used to figure out the |
@@ -250,6 +242,12 @@ |
beq(R0, R0, l); |
} |
+ void bal(Label *l) { |
+ ASSERT(!in_delay_slot_); |
+ EmitRegImmBranch(BGEZAL, R0, l); |
+ EmitBranchDelayNop(); |
+ } |
+ |
// Branch if equal. |
void beq(Register rs, Register rt, Label* l) { |
ASSERT(!in_delay_slot_); |
@@ -546,6 +544,18 @@ |
jr(TMP); |
} |
+ // If the signed value in rs is less than value, rd is 1, and 0 otherwise. |
+ void LessThanSImmediate(Register rd, Register rs, int32_t value) { |
+ LoadImmediate(TMP, value); |
+ slt(rd, rs, TMP); |
+ } |
+ |
+ // If the unsigned value in rs is less than value, rd is 1, and 0 otherwise. |
+ void LessThanUImmediate(Register rd, Register rs, uint32_t value) { |
+ LoadImmediate(TMP, value); |
+ sltu(rd, rs, TMP); |
+ } |
+ |
void Drop(intptr_t stack_elements) { |
ASSERT(stack_elements >= 0); |
if (stack_elements > 0) { |
@@ -578,6 +588,14 @@ |
jr(RA); |
} |
+ void SmiTag(Register reg) { |
+ sll(reg, reg, kSmiTagSize); |
+ } |
+ |
+ void SmiUntag(Register reg) { |
+ sra(reg, reg, kSmiTagSize); |
+ } |
+ |
void LoadWordFromPoolOffset(Register rd, int32_t offset); |
void LoadObject(Register rd, const Object& object); |
void PushObject(const Object& object); |
@@ -586,6 +604,12 @@ |
// set to non-zero otherwise. |
void CompareObject(Register rd, Register rn, const Object& object); |
+ // Set up a Dart frame on entry with a frame pointer and PC information to |
+ // enable easy access to the RawInstruction object of code corresponding |
+ // to this frame. |
+ void EnterDartFrame(intptr_t frame_size); |
+ void LeaveDartFrame(); |
+ |
private: |
AssemblerBuffer buffer_; |
GrowableObjectArray& object_pool_; // Objects and patchable jump targets. |