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

Unified Diff: runtime/vm/assembler_mips.cc

Issue 21363003: Enables per-function far-branches for ARM and MIPS. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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: runtime/vm/assembler_mips.cc
===================================================================
--- runtime/vm/assembler_mips.cc (revision 25720)
+++ runtime/vm/assembler_mips.cc (working copy)
@@ -6,6 +6,7 @@
#if defined(TARGET_ARCH_MIPS)
#include "vm/assembler.h"
+#include "vm/longjump.h"
#include "vm/runtime_entry.h"
#include "vm/simulator.h"
#include "vm/stack_frame.h"
@@ -48,9 +49,13 @@
}
-static int32_t EncodeBranchOffset(int32_t offset, int32_t instr) {
- ASSERT(Utils::IsAligned(offset, 4));
- ASSERT(Utils::IsInt(18, offset));
+int32_t Assembler::EncodeBranchOffset(int32_t offset, int32_t instr) {
+ if (!CanEncodeBranchOffset(offset)) {
+ ASSERT(!use_far_branches());
+ const Error& error = Error::Handle(LanguageError::New(
+ String::Handle(String::New("Branch offset overflow"))));
+ Isolate::Current()->long_jump_base()->Jump(1, error);
+ }
// Properly preserve only the bits supported in the instruction.
offset >>= 2;
@@ -106,6 +111,7 @@
void Assembler::EmitFarJump(int32_t offset, bool link) {
+ ASSERT(use_far_branches());
const uint16_t low = Utils::Low16Bits(offset);
const uint16_t high = Utils::High16Bits(offset);
buffer_.EmitFixup(new PatchFarJump());
@@ -179,7 +185,7 @@
// Relative destination from an instruction after the branch.
const int32_t dest =
label->Position() - (buffer_.Size() + Instr::kInstrSize);
- if (FLAG_use_far_branches && !CanEncodeBranchOffset(dest)) {
+ if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
EmitFarBranch(b, rs, rt, label->Position());
} else {
const uint16_t dest_off = EncodeBranchOffset(dest, 0);
@@ -187,7 +193,7 @@
}
} else {
const int position = buffer_.Size();
- if (FLAG_use_far_branches) {
+ if (use_far_branches()) {
const uint32_t dest_off = label->position_;
EmitFarBranch(b, rs, rt, dest_off);
} else {
@@ -204,7 +210,7 @@
// Relative destination from an instruction after the branch.
const int32_t dest =
label->Position() - (buffer_.Size() + Instr::kInstrSize);
- if (FLAG_use_far_branches && !CanEncodeBranchOffset(dest)) {
+ if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
EmitFarRegImmBranch(b, rs, label->Position());
} else {
const uint16_t dest_off = EncodeBranchOffset(dest, 0);
@@ -212,7 +218,7 @@
}
} else {
const int position = buffer_.Size();
- if (FLAG_use_far_branches) {
+ if (use_far_branches()) {
const uint32_t dest_off = label->position_;
EmitFarRegImmBranch(b, rs, dest_off);
} else {
@@ -230,7 +236,7 @@
// Relative destination from an instruction after the branch.
const int32_t dest =
label->Position() - (buffer_.Size() + Instr::kInstrSize);
- if (FLAG_use_far_branches && !CanEncodeBranchOffset(dest)) {
+ if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
EmitFarFpuBranch(kind, label->Position());
} else {
const uint16_t dest_off = EncodeBranchOffset(dest, 0);
@@ -241,7 +247,7 @@
}
} else {
const int position = buffer_.Size();
- if (FLAG_use_far_branches) {
+ if (use_far_branches()) {
const uint32_t dest_off = label->position_;
EmitFarFpuBranch(kind, dest_off);
} else {
@@ -279,7 +285,7 @@
int32_t position = label->Position();
int32_t dest = bound_pc - (position + Instr::kInstrSize);
- if (FLAG_use_far_branches && !CanEncodeBranchOffset(dest)) {
+ if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
// Far branches are enabled and we can't encode the branch offset.
// Grab the branch instruction. We'll need to flip it later.
@@ -304,7 +310,7 @@
buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize, encoded_high);
buffer_.Store<int32_t>(position + 3 * Instr::kInstrSize, encoded_low);
label->position_ = DecodeLoadImmediate(low, high);
- } else if (FLAG_use_far_branches && CanEncodeBranchOffset(dest)) {
+ } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
// We assembled a far branch, but we don't need it. Replace with a near
// branch.
« no previous file with comments | « runtime/vm/assembler_mips.h ('k') | runtime/vm/assembler_x64.h » ('j') | runtime/vm/compiler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698