Chromium Code Reviews| Index: runtime/vm/assembler_mips.h |
| =================================================================== |
| --- runtime/vm/assembler_mips.h (revision 19704) |
| +++ runtime/vm/assembler_mips.h (working copy) |
| @@ -220,6 +220,56 @@ |
| } |
| // CPU instructions. |
| + void addi(Register rt, Register rs, const Immediate& imm) { |
| + ASSERT(Utils::IsUint(16, imm.value())); |
| + uint16_t imm_value = static_cast<uint16_t>(imm.value()); |
| + EmitIType(ADDI, rs, rt, imm_value); |
| + } |
| + |
| + void addiu(Register rt, Register rs, const Immediate& imm) { |
| + ASSERT(Utils::IsUint(16, imm.value())); |
| + uint16_t imm_value = static_cast<uint16_t>(imm.value()); |
| + EmitIType(ADDIU, rs, rt, imm_value); |
| + } |
| + |
| + void addu(Register rd, Register rs, Register rt) { |
| + EmitRType(SPECIAL, rs, rt, rd, 0, ADDU); |
| + } |
| + |
| + void and_(Register rd, Register rs, Register rt) { |
| + EmitRType(SPECIAL, rs, rt, rd, 0, AND); |
| + } |
| + |
| + void andi(Register rt, Register rs, const Immediate& imm) { |
| + ASSERT(Utils::IsUint(16, imm.value())); |
| + uint16_t imm_value = static_cast<uint16_t>(imm.value()); |
| + EmitIType(ANDI, rs, rt, imm_value); |
| + } |
| + |
| + void clo(Register rd, Register rs) { |
| + EmitRType(SPECIAL2, rs, rd, rd, 0, CLO); |
| + } |
| + |
| + void clz(Register rd, Register rs) { |
| + EmitRType(SPECIAL2, rs, rd, rd, 0, CLZ); |
| + } |
| + |
| + void div(Register rs, Register rt) { |
| + EmitRType(SPECIAL, rs, rt, R0, 0, DIV); |
| + } |
| + |
| + void divu(Register rs, Register rt) { |
| + EmitRType(SPECIAL, rs, rt, R0, 0, DIVU); |
| + } |
| + |
| + void mfhi(Register rd) { |
| + EmitRType(SPECIAL, R0, R0, rd, 0, MFHI); |
| + } |
| + |
| + void mflo(Register rd) { |
| + EmitRType(SPECIAL, R0, R0, rd, 0, MFLO); |
| + } |
| + |
| void ori(Register rt, Register rs, const Immediate& imm) { |
| ASSERT(Utils::IsUint(16, imm.value())); |
| uint16_t imm_value = static_cast<uint16_t>(imm.value()); |
| @@ -233,6 +283,17 @@ |
| delay_slot_available_ = true; |
| } |
| + void sll(Register rd, Register rt, int sa) { |
| + EmitRType(SPECIAL, R0, rt, rd, sa, SLL); |
| + } |
| + |
| + // Macros. |
| + void LoadImmediate(Register rd, int32_t value) { |
| + addi(rd, R0, Immediate((value >> 16) & 0xffff)); |
| + sll(rd, rd, 16); |
|
regis
2013/03/08 21:09:03
The 2 instructions above can be replaced by a sing
|
| + ori(rd, rd, Immediate(value & 0xffff)); |
| + } |
| + |
| private: |
| AssemblerBuffer buffer_; |
| GrowableObjectArray& object_pool_; // Objects and patchable jump targets. |
| @@ -278,6 +339,16 @@ |
| imm); |
| } |
| + void EmitRegImmType(Opcode opcode, |
| + Register rs, |
| + RtRegImm code, |
| + uint16_t imm) { |
| + Emit(opcode << kOpcodeShift | |
| + rs << kRsShift | |
| + code << kRtShift | |
| + imm); |
| + } |
| + |
| void EmitJType(Opcode opcode, Label* label) { |
| UNIMPLEMENTED(); |
| } |