Chromium Code Reviews| Index: runtime/vm/assembler_mips.h |
| =================================================================== |
| --- runtime/vm/assembler_mips.h (revision 20565) |
| +++ 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,17 @@ |
| // set to non-zero otherwise. |
| void CompareObject(Register rd, Register rn, const Object& object); |
| + // The PC is written to rd, which is followed by a single instruction, |
| + // so the PC at the instruction following GetPC is |
| + // rd + (2 * Instr::kInstrSize). |
| + void GetPC(Register rd); |
|
regis
2013/03/29 00:23:32
I think it may be clearer to inline this where you
|
| + |
| + // 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. |