| Index: runtime/vm/assembler_mips.h
|
| ===================================================================
|
| --- runtime/vm/assembler_mips.h (revision 22131)
|
| +++ runtime/vm/assembler_mips.h (working copy)
|
| @@ -709,70 +709,82 @@
|
| bne(rd, CMPRES, l);
|
| }
|
|
|
| - void BranchGreater(Register rd, int32_t value, Label* l) {
|
| - if (Utils::IsInt(kImmBits, -value)) {
|
| - addiu(CMPRES, rd, Immediate(-value));
|
| - bgtz(CMPRES, l);
|
| - } else {
|
| - LoadImmediate(CMPRES, value);
|
| - subu(CMPRES, rd, CMPRES);
|
| - bgtz(CMPRES, l);
|
| - }
|
| + void BranchSignedGreater(Register rd, Register rs, Label* l) {
|
| + slt(CMPRES, rs, rd); // CMPRES = rd > rs ? 1 : 0.
|
| + bne(CMPRES, ZR, l);
|
| }
|
|
|
| - void BranchGreater(Register rd, Register rs, Label* l) {
|
| - subu(CMPRES, rd, rs);
|
| - bgtz(CMPRES, l);
|
| + void BranchSignedGreater(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchSignedGreater(rd, CMPRES, l);
|
| }
|
|
|
| - void BranchGreaterEqual(Register rd, int32_t value, Label* l) {
|
| - if (Utils::IsInt(kImmBits, -value)) {
|
| - addiu(CMPRES, rd, Immediate(-value));
|
| - bgez(CMPRES, l);
|
| - } else {
|
| - LoadImmediate(CMPRES, value);
|
| - subu(CMPRES, rd, CMPRES);
|
| - bgez(CMPRES, l);
|
| - }
|
| + void BranchUnsignedGreater(Register rd, Register rs, Label* l) {
|
| + sltu(CMPRES, rs, rd);
|
| + bne(CMPRES, ZR, l);
|
| }
|
|
|
| - void BranchGreaterEqual(Register rd, Register rs, Label* l) {
|
| - subu(CMPRES, rd, rs);
|
| - bgez(CMPRES, l);
|
| + void BranchUnsignedGreater(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchUnsignedGreater(rd, CMPRES, l);
|
| }
|
|
|
| - void BranchLess(Register rd, int32_t value, Label* l) {
|
| - if (Utils::IsInt(kImmBits, -value)) {
|
| - addiu(CMPRES, rd, Immediate(-value));
|
| - bltz(CMPRES, l);
|
| - } else {
|
| - LoadImmediate(CMPRES, value);
|
| - subu(CMPRES, rd, CMPRES);
|
| - bltz(CMPRES, l);
|
| - }
|
| + void BranchSignedGreaterEqual(Register rd, Register rs, Label* l) {
|
| + slt(CMPRES, rd, rs); // CMPRES = rd < rs ? 1 : 0.
|
| + beq(CMPRES, ZR, l); // If CMPRES = 0, then rd >= rs.
|
| }
|
|
|
| - void BranchLess(Register rd, Register rs, Label* l) {
|
| - subu(CMPRES, rd, rs);
|
| - bltz(CMPRES, l);
|
| + void BranchSignedGreaterEqual(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchSignedGreaterEqual(rd, CMPRES, l);
|
| }
|
|
|
| - void BranchLessEqual(Register rd, int32_t value, Label* l) {
|
| - if (Utils::IsInt(kImmBits, -value)) {
|
| - addiu(CMPRES, rd, Immediate(-value));
|
| - blez(CMPRES, l);
|
| - } else {
|
| - LoadImmediate(CMPRES, value);
|
| - subu(CMPRES, rd, CMPRES);
|
| - blez(CMPRES, l);
|
| - }
|
| + void BranchUnsignedGreaterEqual(Register rd, Register rs, Label* l) {
|
| + sltu(CMPRES, rd, rs); // CMPRES = rd < rs ? 1 : 0.
|
| + beq(CMPRES, ZR, l);
|
| }
|
|
|
| - void BranchLessEqual(Register rd, Register rs, Label* l) {
|
| - subu(CMPRES, rd, rs);
|
| - blez(CMPRES, l);
|
| + void BranchUnsignedGreaterEqual(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchUnsignedGreaterEqual(rd, CMPRES, l);
|
| }
|
|
|
| + void BranchSignedLess(Register rd, Register rs, Label* l) {
|
| + BranchSignedGreater(rs, rd, l);
|
| + }
|
| +
|
| + void BranchSignedLess(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchSignedGreater(CMPRES, rd, l);
|
| + }
|
| +
|
| + void BranchUnsignedLess(Register rd, Register rs, Label* l) {
|
| + BranchUnsignedGreater(rs, rd, l);
|
| + }
|
| +
|
| + void BranchUnsignedLess(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchUnsignedGreater(CMPRES, rd, l);
|
| + }
|
| +
|
| + void BranchSignedLessEqual(Register rd, Register rs, Label* l) {
|
| + BranchSignedGreaterEqual(rs, rd, l);
|
| + }
|
| +
|
| + void BranchSignedLessEqual(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchSignedGreaterEqual(CMPRES, rd, l);
|
| + }
|
| +
|
| + void BranchUnsignedLessEqual(Register rd, Register rs, Label* l) {
|
| + BranchUnsignedGreaterEqual(rs, rd, l);
|
| + }
|
| +
|
| + void BranchUnsignedLessEqual(Register rd, int32_t value, Label* l) {
|
| + LoadImmediate(CMPRES, value);
|
| + BranchUnsignedGreaterEqual(CMPRES, rd, l);
|
| + }
|
| +
|
| void Push(Register rt) {
|
| addiu(SP, SP, Immediate(-kWordSize));
|
| sw(rt, Address(SP));
|
|
|