Chromium Code Reviews| Index: runtime/vm/intermediate_language_arm64.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_arm64.cc (revision 40437) |
| +++ runtime/vm/intermediate_language_arm64.cc (working copy) |
| @@ -179,7 +179,7 @@ |
| if (is_power_of_two_kind) { |
| const intptr_t shift = |
| Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value)); |
| - __ Lsl(result, result, shift + kSmiTagSize); |
| + __ LslImmediate(result, result, shift + kSmiTagSize); |
| } else { |
| __ sub(result, result, Operand(1)); |
| const int64_t val = |
| @@ -848,7 +848,7 @@ |
| result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP); |
| __ AddImmediate( |
| result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP); |
| - __ Asr(TMP, char_code, kSmiTagShift); // Untag to use scaled adress mode. |
| + __ SmiUntag(TMP, char_code); // Untag to use scaled adress mode. |
| __ ldr(result, Address(result, TMP, UXTX, Address::Scaled)); |
| } |
| @@ -2547,12 +2547,12 @@ |
| ASSERT((0 < value) && (value < kCountLimit)); |
| if (shift_left->can_overflow()) { |
| // Check for overflow (preserve left). |
| - __ Lsl(TMP, left, value); |
| + __ LslImmediate(TMP, left, value); |
| __ cmp(left, Operand(TMP, ASR, value)); |
| __ b(deopt, NE); // Overflow. |
| } |
| // Shift for result now we know there is no overflow. |
| - __ Lsl(result, left, value); |
| + __ LslImmediate(result, left, value); |
| if (FLAG_throw_on_javascript_int_overflow) { |
| EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); |
| } |
| @@ -2733,12 +2733,12 @@ |
| const intptr_t shift_count = |
| Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize; |
| ASSERT(kSmiTagSize == 1); |
| - __ Asr(TMP, left, 63); |
| + __ AsrImmediate(TMP, left, 63); |
| ASSERT(shift_count > 1); // 1, -1 case handled above. |
| const Register temp = TMP2; |
| __ add(temp, left, Operand(TMP, LSR, 64 - shift_count)); |
| ASSERT(shift_count > 0); |
| - __ Asr(result, temp, shift_count); |
| + __ AsrImmediate(result, temp, shift_count); |
| if (value < 0) { |
| __ sub(result, ZR, Operand(result)); |
| } |
| @@ -2761,7 +2761,8 @@ |
| // Asr operation masks the count to 6 bits. |
| const intptr_t kCountLimit = 0x3F; |
| intptr_t value = Smi::Cast(constant).Value(); |
| - __ Asr(result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit)); |
| + __ AsrImmediate( |
| + result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit)); |
| __ SmiTag(result); |
| break; |
| } |
| @@ -2999,7 +3000,7 @@ |
| if (value_cid == kDoubleCid) { |
| __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP); |
| } else if (value_cid == kSmiCid) { |
| - __ Asr(TMP, value, kSmiTagSize); // Untag input before conversion. |
| + __ SmiUntag(TMP, value); // Untag input before conversion. |
| __ scvtfd(result, TMP); |
| } else { |
| Label* deopt = compiler->AddDeoptStub(deopt_id_, |
| @@ -3019,7 +3020,7 @@ |
| __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP); |
| __ b(&done); |
| __ Bind(&is_smi); |
| - __ Asr(TMP, value, kSmiTagSize); // Copy and untag. |
| + __ SmiUntag(TMP, value); // Copy and untag. |
| __ scvtfd(result, TMP); |
| __ Bind(&done); |
| } |
| @@ -3374,18 +3375,18 @@ |
| // X lane. |
| __ vmovrs(out, value, 0); |
| - __ Lsr(out, out, 31); |
| + __ LsrImmediate(out, out, 31); |
| // Y lane. |
| __ vmovrs(temp, value, 1); |
| - __ Lsr(temp, temp, 31); |
| + __ LsrImmediate(temp, temp, 31); |
| __ orr(out, out, Operand(temp, LSL, 1)); |
| // Z lane. |
| __ vmovrs(temp, value, 2); |
| - __ Lsr(temp, temp, 31); |
| + __ LsrImmediate(temp, temp, 31); |
| __ orr(out, out, Operand(temp, LSL, 2)); |
| // W lane. |
| __ vmovrs(temp, value, 3); |
| - __ Lsr(temp, temp, 31); |
| + __ LsrImmediate(temp, temp, 31); |
| __ orr(out, out, Operand(temp, LSL, 3)); |
| // Tag. |
| __ SmiTag(out); |
| @@ -3885,10 +3886,10 @@ |
| // Bits of X lane. |
| __ vmovrd(out, value, 0); |
| - __ Lsr(out, out, 63); |
| + __ LsrImmediate(out, out, 63); |
| // Bits of Y lane. |
| __ vmovrd(TMP, value, 1); |
| - __ Lsr(TMP, TMP, 63); |
| + __ LsrImmediate(TMP, TMP, 63); |
| __ orr(out, out, Operand(TMP, LSL, 1)); |
| // Tag. |
| __ SmiTag(out); |
| @@ -4927,7 +4928,7 @@ |
| ASSERT(cids_.length() > 2); |
| Register mask_reg = locs()->temp(1).reg(); |
| __ LoadImmediate(mask_reg, 1, PP); |
| - __ Lsl(mask_reg, mask_reg, temp); |
| + __ lslv(mask_reg, mask_reg, temp); |
|
zra
2014/09/18 16:07:52
This was the bug.
|
| __ TestImmediate(mask_reg, mask, PP); |
| __ b(deopt, EQ); |
| } |
| @@ -5196,12 +5197,12 @@ |
| ASSERT(kSmiTagSize == 1); |
| // TODO(vegorov) implement and use UBFM/SBFM for this. |
| - __ Lsl(out, value, 32); |
| + __ LslImmediate(out, value, 32); |
| if (from_representation() == kUnboxedInt32) { |
| - __ Asr(out, out, 32 - kSmiTagSize); |
| + __ AsrImmediate(out, out, 32 - kSmiTagSize); |
| } else { |
| ASSERT(from_representation() == kUnboxedUint32); |
| - __ Lsr(out, out, 32 - kSmiTagSize); |
| + __ LsrImmediate(out, out, 32 - kSmiTagSize); |
| } |
| } |
| @@ -5235,8 +5236,8 @@ |
| // TODO(vegorov) if we ensure that we never use kDoubleWord size |
| // with it then we could avoid this. |
| // TODO(vegorov) implement and use UBFM for zero extension. |
| - __ Lsl(out, value, 32); |
| - __ Lsr(out, out, 32); |
| + __ LslImmediate(out, value, 32); |
| + __ LsrImmediate(out, out, 32); |
| } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) { |
| // Representations are bitwise equivalent. |
| // TODO(vegorov) if we ensure that we never use kDoubleWord size |
| @@ -5244,8 +5245,8 @@ |
| // TODO(vegorov) implement and use SBFM for sign extension. |
| const Register value = locs()->in(0).reg(); |
| const Register out = locs()->out(0).reg(); |
| - __ Lsl(out, value, 32); |
| - __ Asr(out, out, 32); |
| + __ LslImmediate(out, value, 32); |
| + __ AsrImmediate(out, out, 32); |
| if (CanDeoptimize()) { |
| Label* deopt = |
| compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger); |