Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1253)

Unified Diff: src/mips/assembler-mips.h

Issue 1396133002: MIPS: r6 compact branch optimization. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased, gcc build fixed, ra alignment failure fixed. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/mips/assembler-mips.h
diff --git a/src/mips/assembler-mips.h b/src/mips/assembler-mips.h
index 7f5b96714d864c62e33413247f6c1654b61934ff..04b91466dbfcf521914cdada2e497dde1c838765 100644
--- a/src/mips/assembler-mips.h
+++ b/src/mips/assembler-mips.h
@@ -415,20 +415,25 @@ class Assembler : public AssemblerBase {
// Returns the branch offset to the given label from the current code
// position. Links the label to the current position if it is still unbound.
// Manages the jump elimination optimization if the second parameter is true.
- int32_t branch_offset(Label* L, bool jump_elimination_allowed);
- int32_t branch_offset_compact(Label* L, bool jump_elimination_allowed);
- int32_t branch_offset21(Label* L, bool jump_elimination_allowed);
- int32_t branch_offset21_compact(Label* L, bool jump_elimination_allowed);
+ int32_t branch_offset_helper(Label* L, bool jump_elimination_allowed,
+ int bits);
+ int32_t branch_offset(Label* L, bool jump_elimination_allowed) {
+ return branch_offset_helper(L, jump_elimination_allowed, 16);
ivica.bogosavljevic 2015/10/15 11:49:08 It would be nice to have these three functions inl
balazs.kilvady 2015/10/30 21:11:14 Done.
+ }
+ int32_t branch_offset21(Label* L, bool jump_elimination_allowed) {
+ return branch_offset_helper(L, jump_elimination_allowed, 21);
+ }
+ int32_t branch_offset26(Label* L, bool jump_elimination_allowed) {
+ return branch_offset_helper(L, jump_elimination_allowed, 26);
+ }
int32_t shifted_branch_offset(Label* L, bool jump_elimination_allowed) {
- int32_t o = branch_offset(L, jump_elimination_allowed);
- DCHECK((o & 3) == 0); // Assert the offset is aligned.
- return o >> 2;
+ return branch_offset(L, jump_elimination_allowed) >> 2;
+ }
+ int32_t shifted_branch_offset21(Label* L, bool jump_elimination_allowed) {
+ return branch_offset21(L, jump_elimination_allowed) >> 2;
}
- int32_t shifted_branch_offset_compact(Label* L,
- bool jump_elimination_allowed) {
- int32_t o = branch_offset_compact(L, jump_elimination_allowed);
- DCHECK((o & 3) == 0); // Assert the offset is aligned.
- return o >> 2;
+ int32_t shifted_branch_offset26(Label* L, bool jump_elimination_allowed) {
+ return branch_offset26(L, jump_elimination_allowed) >> 2;
}
uint32_t jump_address(Label* L);
@@ -571,35 +576,35 @@ class Assembler : public AssemblerBase {
// --------Branch-and-jump-instructions----------
// We don't use likely variant of instructions.
void b(int16_t offset);
- void b(Label* L) { b(branch_offset(L, false)>>2); }
+ void b(Label* L) { b(shifted_branch_offset(L, false)); }
ivica.bogosavljevic 2015/10/15 11:49:08 Mark inline small functions
balazs.kilvady 2015/10/30 21:11:14 Done.
void bal(int16_t offset);
- void bal(Label* L) { bal(branch_offset(L, false)>>2); }
+ void bal(Label* L) { bal(shifted_branch_offset(L, false)); }
void bc(int32_t offset);
- void bc(Label* L) { bc(branch_offset(L, false) >> 2); }
+ void bc(Label* L) { bc(shifted_branch_offset26(L, false)); }
void balc(int32_t offset);
- void balc(Label* L) { balc(branch_offset(L, false) >> 2); }
+ void balc(Label* L) { balc(shifted_branch_offset26(L, false)); }
void beq(Register rs, Register rt, int16_t offset);
void beq(Register rs, Register rt, Label* L) {
- beq(rs, rt, branch_offset(L, false) >> 2);
+ beq(rs, rt, shifted_branch_offset(L, false));
}
void bgez(Register rs, int16_t offset);
void bgezc(Register rt, int16_t offset);
void bgezc(Register rt, Label* L) {
- bgezc(rt, branch_offset_compact(L, false)>>2);
+ bgezc(rt, shifted_branch_offset(L, false));
}
void bgeuc(Register rs, Register rt, int16_t offset);
void bgeuc(Register rs, Register rt, Label* L) {
- bgeuc(rs, rt, branch_offset_compact(L, false)>>2);
+ bgeuc(rs, rt, shifted_branch_offset(L, false));
}
void bgec(Register rs, Register rt, int16_t offset);
void bgec(Register rs, Register rt, Label* L) {
- bgec(rs, rt, branch_offset_compact(L, false)>>2);
+ bgec(rs, rt, shifted_branch_offset(L, false));
}
void bgezal(Register rs, int16_t offset);
void bgezalc(Register rt, int16_t offset);
void bgezalc(Register rt, Label* L) {
- bgezalc(rt, branch_offset_compact(L, false)>>2);
+ bgezalc(rt, shifted_branch_offset(L, false));
}
void bgezall(Register rs, int16_t offset);
void bgezall(Register rs, Label* L) {
@@ -608,74 +613,74 @@ class Assembler : public AssemblerBase {
void bgtz(Register rs, int16_t offset);
void bgtzc(Register rt, int16_t offset);
void bgtzc(Register rt, Label* L) {
- bgtzc(rt, branch_offset_compact(L, false)>>2);
+ bgtzc(rt, shifted_branch_offset(L, false));
}
void blez(Register rs, int16_t offset);
void blezc(Register rt, int16_t offset);
void blezc(Register rt, Label* L) {
- blezc(rt, branch_offset_compact(L, false)>>2);
+ blezc(rt, shifted_branch_offset(L, false));
}
void bltz(Register rs, int16_t offset);
void bltzc(Register rt, int16_t offset);
void bltzc(Register rt, Label* L) {
- bltzc(rt, branch_offset_compact(L, false)>>2);
+ bltzc(rt, shifted_branch_offset(L, false));
}
void bltuc(Register rs, Register rt, int16_t offset);
void bltuc(Register rs, Register rt, Label* L) {
- bltuc(rs, rt, branch_offset_compact(L, false)>>2);
+ bltuc(rs, rt, shifted_branch_offset(L, false));
}
void bltc(Register rs, Register rt, int16_t offset);
void bltc(Register rs, Register rt, Label* L) {
- bltc(rs, rt, branch_offset_compact(L, false)>>2);
+ bltc(rs, rt, shifted_branch_offset(L, false));
}
void bltzal(Register rs, int16_t offset);
void blezalc(Register rt, int16_t offset);
void blezalc(Register rt, Label* L) {
- blezalc(rt, branch_offset_compact(L, false)>>2);
+ blezalc(rt, shifted_branch_offset(L, false));
}
void bltzalc(Register rt, int16_t offset);
void bltzalc(Register rt, Label* L) {
- bltzalc(rt, branch_offset_compact(L, false)>>2);
+ bltzalc(rt, shifted_branch_offset(L, false));
}
void bgtzalc(Register rt, int16_t offset);
void bgtzalc(Register rt, Label* L) {
- bgtzalc(rt, branch_offset_compact(L, false)>>2);
+ bgtzalc(rt, shifted_branch_offset(L, false));
}
void beqzalc(Register rt, int16_t offset);
void beqzalc(Register rt, Label* L) {
- beqzalc(rt, branch_offset_compact(L, false)>>2);
+ beqzalc(rt, shifted_branch_offset(L, false));
}
void beqc(Register rs, Register rt, int16_t offset);
void beqc(Register rs, Register rt, Label* L) {
- beqc(rs, rt, branch_offset_compact(L, false)>>2);
+ beqc(rs, rt, shifted_branch_offset(L, false));
}
void beqzc(Register rs, int32_t offset);
void beqzc(Register rs, Label* L) {
- beqzc(rs, branch_offset21_compact(L, false)>>2);
+ beqzc(rs, shifted_branch_offset21(L, false));
}
void bnezalc(Register rt, int16_t offset);
void bnezalc(Register rt, Label* L) {
- bnezalc(rt, branch_offset_compact(L, false)>>2);
+ bnezalc(rt, shifted_branch_offset(L, false));
}
void bnec(Register rs, Register rt, int16_t offset);
void bnec(Register rs, Register rt, Label* L) {
- bnec(rs, rt, branch_offset_compact(L, false)>>2);
+ bnec(rs, rt, shifted_branch_offset(L, false));
}
void bnezc(Register rt, int32_t offset);
void bnezc(Register rt, Label* L) {
- bnezc(rt, branch_offset21_compact(L, false)>>2);
+ bnezc(rt, shifted_branch_offset21(L, false));
}
void bne(Register rs, Register rt, int16_t offset);
void bne(Register rs, Register rt, Label* L) {
- bne(rs, rt, branch_offset(L, false)>>2);
+ bne(rs, rt, shifted_branch_offset(L, false));
}
void bovc(Register rs, Register rt, int16_t offset);
void bovc(Register rs, Register rt, Label* L) {
- bovc(rs, rt, branch_offset_compact(L, false)>>2);
+ bovc(rs, rt, shifted_branch_offset(L, false));
}
void bnvc(Register rs, Register rt, int16_t offset);
void bnvc(Register rs, Register rt, Label* L) {
- bnvc(rs, rt, branch_offset_compact(L, false)>>2);
+ bnvc(rs, rt, shifted_branch_offset(L, false));
}
// Never use the int16_t b(l)cond version with a branch offset
@@ -921,11 +926,11 @@ class Assembler : public AssemblerBase {
void bc1eqz(int16_t offset, FPURegister ft);
void bc1eqz(Label* L, FPURegister ft) {
- bc1eqz(branch_offset(L, false)>>2, ft);
+ bc1eqz(shifted_branch_offset(L, false), ft);
}
void bc1nez(int16_t offset, FPURegister ft);
void bc1nez(Label* L, FPURegister ft) {
- bc1nez(branch_offset(L, false)>>2, ft);
+ bc1nez(shifted_branch_offset(L, false), ft);
}
// Conditions and branches for non MIPSr6.
@@ -935,9 +940,13 @@ class Assembler : public AssemblerBase {
void c_d(FPUCondition cond, FPURegister ft, FPURegister fs, uint16_t cc = 0);
void bc1f(int16_t offset, uint16_t cc = 0);
- void bc1f(Label* L, uint16_t cc = 0) { bc1f(branch_offset(L, false)>>2, cc); }
+ void bc1f(Label* L, uint16_t cc = 0) {
+ bc1f(shifted_branch_offset(L, false), cc);
+ }
void bc1t(int16_t offset, uint16_t cc = 0);
- void bc1t(Label* L, uint16_t cc = 0) { bc1t(branch_offset(L, false)>>2, cc); }
+ void bc1t(Label* L, uint16_t cc = 0) {
+ bc1t(shifted_branch_offset(L, false), cc);
+ }
void fcmp(FPURegister src1, const double src2, FPUCondition cond);
// Check the code size generated from label to here.
@@ -1056,8 +1065,14 @@ class Assembler : public AssemblerBase {
// Check if an instruction is a branch of some kind.
static bool IsBranch(Instr instr);
+ static bool IsBc(Instr instr);
+ static bool IsBzc(Instr instr);
static bool IsBeq(Instr instr);
static bool IsBne(Instr instr);
+ static bool IsBeqzc(Instr instr);
+ static bool IsBnezc(Instr instr);
+ static bool IsBeqc(Instr instr);
+ static bool IsBnec(Instr instr);
static bool IsJump(Instr instr);
static bool IsJ(Instr instr);
@@ -1179,6 +1194,8 @@ class Assembler : public AssemblerBase {
return block_buffer_growth_;
}
+ bool IsPrevInstrCompactBranch() { return prev_instr_compact_branch_; }
+
private:
inline static void set_target_internal_reference_encoded_at(Address pc,
Address target);
@@ -1365,12 +1382,17 @@ class Assembler : public AssemblerBase {
bool trampoline_emitted_;
static const int kTrampolineSlotsSize = 4 * kInstrSize;
static const int kMaxBranchOffset = (1 << (18 - 1)) - 1;
+ static const int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1;
static const int kInvalidSlotPos = -1;
// Internal reference positions, required for unbounded internal reference
// labels.
std::set<int> internal_reference_positions_;
+ void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; }
ivica.bogosavljevic 2015/10/15 11:49:08 The names of the functions EmittedCompactBranchIns
balazs.kilvady 2015/10/30 21:11:14 I don't agree, please discuss it with Paul.
+ void ClearCompactBranchState() { prev_instr_compact_branch_ = false; }
+ bool prev_instr_compact_branch_ = false;
+
Trampoline trampoline_;
bool internal_trampoline_exception_;

Powered by Google App Engine
This is Rietveld 408576698