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

Unified Diff: dart/runtime/vm/intermediate_language_arm.cc

Issue 754763003: Version 1.8.3 (Closed) Base URL: http://dart.googlecode.com/svn/branches/1.8/
Patch Set: Created 6 years 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
« no previous file with comments | « dart/runtime/vm/intermediate_language.cc ('k') | dart/runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/runtime/vm/intermediate_language_arm.cc
===================================================================
--- dart/runtime/vm/intermediate_language_arm.cc (revision 42037)
+++ dart/runtime/vm/intermediate_language_arm.cc (working copy)
@@ -554,16 +554,16 @@
Token::Kind kind) {
ASSERT(Token::IsEqualityOperator(kind));
PairLocation* left_pair = locs->in(0).AsPairLocation();
- Register left1 = left_pair->At(0).reg();
- Register left2 = left_pair->At(1).reg();
+ Register left_lo = left_pair->At(0).reg();
+ Register left_hi = left_pair->At(1).reg();
PairLocation* right_pair = locs->in(1).AsPairLocation();
- Register right1 = right_pair->At(0).reg();
- Register right2 = right_pair->At(1).reg();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
// Compare lower.
- __ cmp(left1, Operand(right1));
+ __ cmp(left_lo, Operand(right_lo));
// Compare upper if lower is equal.
- __ cmp(left2, Operand(right2), EQ);
+ __ cmp(left_hi, Operand(right_hi), EQ);
return TokenKindToMintCondition(kind);
}
@@ -572,11 +572,11 @@
LocationSummary* locs,
Token::Kind kind) {
PairLocation* left_pair = locs->in(0).AsPairLocation();
- Register left1 = left_pair->At(0).reg();
- Register left2 = left_pair->At(1).reg();
+ Register left_lo = left_pair->At(0).reg();
+ Register left_hi = left_pair->At(1).reg();
PairLocation* right_pair = locs->in(1).AsPairLocation();
- Register right1 = right_pair->At(0).reg();
- Register right2 = right_pair->At(1).reg();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
Register out = locs->temp(0).reg();
@@ -600,15 +600,15 @@
hi_true_cond = hi_false_cond = lo_false_cond = VS;
}
- Label is_true, is_false, done;
+ Label done;
// Compare upper halves first.
- __ cmp(left2, Operand(right2));
+ __ cmp(left_hi, Operand(right_hi));
__ LoadImmediate(out, 0, hi_false_cond);
__ LoadImmediate(out, 1, hi_true_cond);
// If higher words aren't equal, skip comparing lower words.
__ b(&done, NE);
- __ cmp(left1, Operand(right1));
+ __ cmp(left_lo, Operand(right_lo));
__ LoadImmediate(out, 1);
__ LoadImmediate(out, 0, lo_false_cond);
__ Bind(&done);
@@ -829,7 +829,7 @@
Location::RequiresRegister()));
locs->set_in(1, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
- locs->set_temp(0, Location::RequiresRegister());
+ locs->set_temp(0, Location::RequiresRegister()); // TODO(regis): Improve.
locs->set_out(0, Location::RequiresRegister());
return locs;
}
@@ -903,7 +903,7 @@
if (operation_cid() == kSmiCid) {
EmitBranchOnCondition(compiler, true_condition, labels);
} else if (operation_cid() == kMintCid) {
- const Register result = locs()->temp(0).reg();
+ const Register result = locs()->temp(0).reg(); // TODO(regis): Improve.
__ CompareImmediate(result, 1);
__ b(labels.true_label, EQ);
__ b(labels.false_label, NE);
@@ -3786,7 +3786,7 @@
LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
- bool opt) const {
+ bool opt) const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
LocationSummary* summary = new(isolate) LocationSummary(
@@ -6207,8 +6207,13 @@
// Check for overflow.
if (can_overflow()) {
// Compare high word from input with shifted high word from output.
- if (shift > 31) {
- __ cmp(left_hi, Operand(out_hi));
+ // If shift > 32, also compare low word from input with high word from
+ // output shifted back shift - 32.
+ if (shift > 32) {
+ __ cmp(left_lo, Operand(out_hi, ASR, shift - 32));
+ __ cmp(left_hi, Operand(out_hi, ASR, 31), EQ);
+ } else if (shift == 32) {
+ __ cmp(left_hi, Operand(out_hi, ASR, 31));
} else {
__ cmp(left_hi, Operand(out_hi, ASR, shift));
}
@@ -6233,35 +6238,33 @@
__ b(deopt, HI);
}
- __ mov(out_lo, Operand(left_lo));
- __ mov(out_hi, Operand(left_hi));
-
switch (op_kind()) {
case Token::kSHR: {
- __ cmp(shift, Operand(32));
-
- __ mov(out_lo, Operand(out_hi), HI);
- __ Asr(out_hi, out_hi, Operand(31), HI);
- __ sub(shift, shift, Operand(32), HI);
-
- __ rsb(IP, shift, Operand(32));
- __ mov(IP, Operand(out_hi, LSL, IP));
- __ orr(out_lo, IP, Operand(out_lo, LSR, shift));
- __ Asr(out_hi, out_hi, shift);
+ __ rsbs(IP, shift, Operand(32));
+ __ sub(IP, shift, Operand(32), MI);
+ __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
+ __ mov(out_lo, Operand(left_lo, LSR, shift), PL);
+ __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
+ __ mov(out_hi, Operand(left_hi, ASR, shift));
break;
}
case Token::kSHL: {
__ rsbs(IP, shift, Operand(32));
__ sub(IP, shift, Operand(32), MI);
- __ mov(out_hi, Operand(out_lo, LSL, IP), MI);
- __ mov(out_hi, Operand(out_hi, LSL, shift), PL);
- __ orr(out_hi, out_hi, Operand(out_lo, LSR, IP), PL);
- __ mov(out_lo, Operand(out_lo, LSL, shift));
+ __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
+ __ mov(out_hi, Operand(left_hi, LSL, shift), PL);
+ __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
+ __ mov(out_lo, Operand(left_lo, LSL, shift));
// Check for overflow.
if (can_overflow()) {
+ // If shift > 32, compare low word from input with high word from
+ // output shifted back shift - 32.
+ __ mov(IP, Operand(out_hi, ASR, IP), MI);
+ __ mov(IP, Operand(left_lo), PL); // No test if shift <= 32.
+ __ cmp(left_lo, Operand(IP));
// Compare high word from input with shifted high word from output.
- __ cmp(left_hi, Operand(out_hi, ASR, shift));
+ __ cmp(left_hi, Operand(out_hi, ASR, shift), EQ);
// Overflow if they aren't equal.
__ b(deopt, NE);
}
« no previous file with comments | « dart/runtime/vm/intermediate_language.cc ('k') | dart/runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698