| Index: runtime/vm/intrinsifier_arm64.cc
|
| diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
|
| index 3c5f4f6c341544c753153f0fa936edda62308192..b9438a715c2066b6e5dcaa654f9adebfc2fd748d 100644
|
| --- a/runtime/vm/intrinsifier_arm64.cc
|
| +++ b/runtime/vm/intrinsifier_arm64.cc
|
| @@ -28,17 +28,14 @@ namespace dart {
|
|
|
| #define __ assembler->
|
|
|
| -
|
| intptr_t Intrinsifier::ParameterSlotFromSp() {
|
| return -1;
|
| }
|
|
|
| -
|
| static bool IsABIPreservedRegister(Register reg) {
|
| return ((1 << reg) & kAbiPreservedCpuRegs) != 0;
|
| }
|
|
|
| -
|
| void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
|
| ASSERT(IsABIPreservedRegister(CODE_REG));
|
| ASSERT(!IsABIPreservedRegister(ARGS_DESC_REG));
|
| @@ -54,14 +51,12 @@ void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
|
| assembler->mov(CALLEE_SAVED_TEMP2, ARGS_DESC_REG);
|
| }
|
|
|
| -
|
| void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
|
| assembler->Comment("IntrinsicCallEpilogue");
|
| assembler->mov(LR, CALLEE_SAVED_TEMP);
|
| assembler->mov(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
|
| }
|
|
|
| -
|
| // Intrinsify only for Smi value and index. Non-smi values need a store buffer
|
| // update. Array length is always a Smi.
|
| void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
|
| @@ -92,7 +87,6 @@ void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| // Allocate a GrowableObjectArray using the backing array specified.
|
| // On stack: type argument (+1), data (+0).
|
| void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
|
| @@ -126,7 +120,6 @@ void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| // Add an element to growable array if it doesn't need to grow, otherwise
|
| // call into regular code.
|
| // On stack: growable array (+1), value (+0).
|
| @@ -160,7 +153,6 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| static int GetScaleFactor(intptr_t size) {
|
| switch (size) {
|
| case 1:
|
| @@ -178,7 +170,6 @@ static int GetScaleFactor(intptr_t size) {
|
| return -1;
|
| }
|
|
|
| -
|
| #define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_shift) \
|
| Label fall_through; \
|
| const intptr_t kArrayLengthStackOffset = 0 * kWordSize; \
|
| @@ -262,7 +253,6 @@ static int GetScaleFactor(intptr_t size) {
|
| __ ret(); \
|
| __ Bind(&fall_through);
|
|
|
| -
|
| #define TYPED_DATA_ALLOCATOR(clazz) \
|
| void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) { \
|
| intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \
|
| @@ -273,7 +263,6 @@ static int GetScaleFactor(intptr_t size) {
|
| CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
|
| #undef TYPED_DATA_ALLOCATOR
|
|
|
| -
|
| // Loads args from stack into R0 and R1
|
| // Tests if they are smis, jumps to label not_smi if not.
|
| static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
|
| @@ -284,7 +273,6 @@ static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
|
| __ b(not_smi, NE);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through); // Checks two smis.
|
| @@ -294,12 +282,10 @@ void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_add(Assembler* assembler) {
|
| Integer_addFromInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| @@ -309,7 +295,6 @@ void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_sub(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| @@ -319,7 +304,6 @@ void Intrinsifier::Integer_sub(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
|
|
| @@ -336,12 +320,10 @@ void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_mul(Assembler* assembler) {
|
| Integer_mulFromInteger(assembler);
|
| }
|
|
|
| -
|
| // Optimizations:
|
| // - result is 0 if:
|
| // - left is 0
|
| @@ -390,7 +372,6 @@ static void EmitRemainderOperation(Assembler* assembler) {
|
| __ msub(result, right, tmp, left); // result <- left - right * tmp
|
| }
|
|
|
| -
|
| // Implementation:
|
| // res = left % right;
|
| // if (res < 0) {
|
| @@ -433,7 +414,6 @@ void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
|
| // Check to see if we have integer division
|
| Label fall_through;
|
| @@ -456,7 +436,6 @@ void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_negate(Assembler* assembler) {
|
| Label fall_through;
|
| __ ldr(R0, Address(SP, +0 * kWordSize)); // Grab first argument.
|
| @@ -468,7 +447,6 @@ void Intrinsifier::Integer_negate(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through); // Checks two smis.
|
| @@ -477,12 +455,10 @@ void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
|
| Integer_bitAndFromInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through); // Checks two smis.
|
| @@ -491,12 +467,10 @@ void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitOr(Assembler* assembler) {
|
| Integer_bitOrFromInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
|
|
| @@ -506,12 +480,10 @@ void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_bitXor(Assembler* assembler) {
|
| Integer_bitXorFromInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_shl(Assembler* assembler) {
|
| ASSERT(kSmiTagShift == 1);
|
| ASSERT(kSmiTag == 0);
|
| @@ -539,7 +511,6 @@ void Intrinsifier::Integer_shl(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| static void CompareIntegers(Assembler* assembler, Condition true_condition) {
|
| Label fall_through, true_label;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| @@ -552,32 +523,26 @@ static void CompareIntegers(Assembler* assembler, Condition true_condition) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
|
| CompareIntegers(assembler, LT);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_lessThan(Assembler* assembler) {
|
| Integer_greaterThanFromInt(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
|
| CompareIntegers(assembler, GT);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
|
| CompareIntegers(assembler, LE);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
|
| CompareIntegers(assembler, GE);
|
| }
|
|
|
| -
|
| // This is called for Smi, Mint and Bigint receivers. The right argument
|
| // can be Smi, Mint, Bigint or double.
|
| void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
|
| @@ -630,12 +595,10 @@ void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_equal(Assembler* assembler) {
|
| Integer_equalToInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Integer_sar(Assembler* assembler) {
|
| Label fall_through;
|
|
|
| @@ -658,7 +621,6 @@ void Intrinsifier::Integer_sar(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ mvn(R0, R0);
|
| @@ -666,7 +628,6 @@ void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Smi_bitLength(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ SmiUntag(R0);
|
| @@ -679,12 +640,10 @@ void Intrinsifier::Smi_bitLength(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Smi_bitAndFromSmi(Assembler* assembler) {
|
| Integer_bitAndFromInteger(assembler);
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_lsh(Assembler* assembler) {
|
| // static void _lsh(Uint32List x_digits, int x_used, int n,
|
| // Uint32List r_digits)
|
| @@ -703,8 +662,9 @@ void Intrinsifier::Bigint_lsh(Assembler* assembler) {
|
| // R7 = &x_digits[2*R2]
|
| __ add(R7, R6, Operand(R2, LSL, 3));
|
| // R8 = &r_digits[2*1]
|
| - __ add(R8, R4, Operand(TypedData::data_offset() - kHeapObjectTag +
|
| - 2 * Bigint::kBytesPerDigit));
|
| + __ add(R8, R4,
|
| + Operand(TypedData::data_offset() - kHeapObjectTag +
|
| + 2 * Bigint::kBytesPerDigit));
|
| // R8 = &r_digits[2*(R2 + n ~/ (2*_DIGIT_BITS) + 1)]
|
| __ add(R0, R0, Operand(R2));
|
| __ add(R8, R8, Operand(R0, LSL, 3));
|
| @@ -728,7 +688,6 @@ void Intrinsifier::Bigint_lsh(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_rsh(Assembler* assembler) {
|
| // static void _lsh(Uint32List x_digits, int x_used, int n,
|
| // Uint32List r_digits)
|
| @@ -776,7 +735,6 @@ void Intrinsifier::Bigint_rsh(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_absAdd(Assembler* assembler) {
|
| // static void _absAdd(Uint32List digits, int used,
|
| // Uint32List a_digits, int a_used,
|
| @@ -842,7 +800,6 @@ void Intrinsifier::Bigint_absAdd(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_absSub(Assembler* assembler) {
|
| // static void _absSub(Uint32List digits, int used,
|
| // Uint32List a_digits, int a_used,
|
| @@ -902,7 +859,6 @@ void Intrinsifier::Bigint_absSub(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
|
| // Pseudo code:
|
| // static int _mulAdd(Uint32List x_digits, int xi,
|
| @@ -1013,7 +969,6 @@ void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_sqrAdd(Assembler* assembler) {
|
| // Pseudo code:
|
| // static int _sqrAdd(Uint32List x_digits, int i,
|
| @@ -1128,7 +1083,6 @@ void Intrinsifier::Bigint_sqrAdd(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
|
| // There is no 128-bit by 64-bit division instruction on arm64, so we use two
|
| // 64-bit by 32-bit divisions and two 64-bit by 64-bit multiplications to
|
| @@ -1302,7 +1256,6 @@ void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Montgomery_mulMod(Assembler* assembler) {
|
| // Pseudo code:
|
| // static int _mulMod(Uint32List args, Uint32List digits, int i) {
|
| @@ -1337,7 +1290,6 @@ void Intrinsifier::Montgomery_mulMod(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Check if the last argument is a double, jump to label 'is_smi' if smi
|
| // (easy to convert to double), otherwise jump to label 'not_double_smi',
|
| // Returns the last argument in R0.
|
| @@ -1352,7 +1304,6 @@ static void TestLastArgumentIsDouble(Assembler* assembler,
|
| // Fall through with Double in R0.
|
| }
|
|
|
| -
|
| // Both arguments on stack, arg0 (left) is a double, arg1 (right) is of unknown
|
| // type. Return true or false object in the register R0. Any NaN argument
|
| // returns false. Any non-double arg1 causes control flow to fall through to the
|
| @@ -1385,32 +1336,26 @@ static void CompareDoubles(Assembler* assembler, Condition true_condition) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_greaterThan(Assembler* assembler) {
|
| CompareDoubles(assembler, HI);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
|
| CompareDoubles(assembler, CS);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_lessThan(Assembler* assembler) {
|
| CompareDoubles(assembler, CC);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_equal(Assembler* assembler) {
|
| CompareDoubles(assembler, EQ);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
|
| CompareDoubles(assembler, LS);
|
| }
|
|
|
| -
|
| // Expects left argument to be double (receiver). Right argument is unknown.
|
| // Both arguments are on stack.
|
| static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| @@ -1452,27 +1397,22 @@ static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_add(Assembler* assembler) {
|
| DoubleArithmeticOperations(assembler, Token::kADD);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_mul(Assembler* assembler) {
|
| DoubleArithmeticOperations(assembler, Token::kMUL);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_sub(Assembler* assembler) {
|
| DoubleArithmeticOperations(assembler, Token::kSUB);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_div(Assembler* assembler) {
|
| DoubleArithmeticOperations(assembler, Token::kDIV);
|
| }
|
|
|
| -
|
| // Left is double right is integer (Bigint, Mint or Smi)
|
| void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| @@ -1494,7 +1434,6 @@ void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
|
|
| @@ -1512,7 +1451,6 @@ void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ LoadDFieldFromOffset(V0, R0, Double::value_offset());
|
| @@ -1523,7 +1461,6 @@ void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_getIsInfinite(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ LoadFieldFromOffset(R0, R0, Double::value_offset());
|
| @@ -1537,7 +1474,6 @@ void Intrinsifier::Double_getIsInfinite(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
|
| const Register false_reg = R0;
|
| const Register true_reg = R2;
|
| @@ -1567,7 +1503,6 @@ void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::DoubleToInteger(Assembler* assembler) {
|
| Label fall_through;
|
|
|
| @@ -1589,7 +1524,6 @@ void Intrinsifier::DoubleToInteger(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::MathSqrt(Assembler* assembler) {
|
| Label fall_through, is_smi, double_op;
|
| TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
|
| @@ -1609,7 +1543,6 @@ void Intrinsifier::MathSqrt(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| // var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
|
| // _state[kSTATE_LO] = state & _MASK_32;
|
| // _state[kSTATE_HI] = state >> 32;
|
| @@ -1653,7 +1586,6 @@ void Intrinsifier::Random_nextState(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::ObjectEquals(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ ldr(R1, Address(SP, 1 * kWordSize));
|
| @@ -1664,7 +1596,6 @@ void Intrinsifier::ObjectEquals(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| static void RangeCheck(Assembler* assembler,
|
| Register val,
|
| Register tmp,
|
| @@ -1677,11 +1608,9 @@ static void RangeCheck(Assembler* assembler,
|
| __ b(target, cc);
|
| }
|
|
|
| -
|
| const Condition kIfNotInRange = HI;
|
| const Condition kIfInRange = LS;
|
|
|
| -
|
| static void JumpIfInteger(Assembler* assembler,
|
| Register cid,
|
| Register tmp,
|
| @@ -1689,7 +1618,6 @@ static void JumpIfInteger(Assembler* assembler,
|
| RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfInRange, target);
|
| }
|
|
|
| -
|
| static void JumpIfNotInteger(Assembler* assembler,
|
| Register cid,
|
| Register tmp,
|
| @@ -1697,7 +1625,6 @@ static void JumpIfNotInteger(Assembler* assembler,
|
| RangeCheck(assembler, cid, tmp, kSmiCid, kBigintCid, kIfNotInRange, target);
|
| }
|
|
|
| -
|
| static void JumpIfString(Assembler* assembler,
|
| Register cid,
|
| Register tmp,
|
| @@ -1706,7 +1633,6 @@ static void JumpIfString(Assembler* assembler,
|
| kIfInRange, target);
|
| }
|
|
|
| -
|
| static void JumpIfNotString(Assembler* assembler,
|
| Register cid,
|
| Register tmp,
|
| @@ -1715,7 +1641,6 @@ static void JumpIfNotString(Assembler* assembler,
|
| kIfNotInRange, target);
|
| }
|
|
|
| -
|
| // Return type quickly for simple types (not parameterized and not signature).
|
| void Intrinsifier::ObjectRuntimeType(Assembler* assembler) {
|
| Label fall_through, use_canonical_type, not_double, not_integer;
|
| @@ -1764,7 +1689,6 @@ void Intrinsifier::ObjectRuntimeType(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) {
|
| Label fall_through, different_cids, equal, not_equal, not_integer;
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| @@ -1819,7 +1743,6 @@ void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::String_getHashCode(Assembler* assembler) {
|
| Label fall_through;
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| @@ -1831,7 +1754,6 @@ void Intrinsifier::String_getHashCode(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::Object_getHash(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ ldr(R0, FieldAddress(R0, String::hash_offset()), kUnsignedWord);
|
| @@ -1839,7 +1761,6 @@ void Intrinsifier::Object_getHash(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Object_setHash(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 1 * kWordSize)); // Object.
|
| __ ldr(R1, Address(SP, 0 * kWordSize)); // Value.
|
| @@ -1848,7 +1769,6 @@ void Intrinsifier::Object_setHash(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void GenerateSubstringMatchesSpecialization(Assembler* assembler,
|
| intptr_t receiver_cid,
|
| intptr_t other_cid,
|
| @@ -1915,7 +1835,6 @@ void GenerateSubstringMatchesSpecialization(Assembler* assembler,
|
| __ b(return_true);
|
| }
|
|
|
| -
|
| // bool _substringMatches(int start, String other)
|
| // This intrinsic handles a OneByteString or TwoByteString receiver with a
|
| // OneByteString other.
|
| @@ -1957,7 +1876,6 @@ void Intrinsifier::StringBaseSubstringMatches(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
|
| Label fall_through, try_two_byte_string;
|
|
|
| @@ -1998,7 +1916,6 @@ void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
|
| __ ldr(R0, Address(SP, 0 * kWordSize));
|
| __ ldr(R0, FieldAddress(R0, String::length_offset()));
|
| @@ -2009,7 +1926,6 @@ void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
|
| Label compute_hash;
|
| __ ldr(R1, Address(SP, 0 * kWordSize)); // OneByteString object.
|
| @@ -2069,7 +1985,6 @@ void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| // Allocates one-byte string of length 'end - start'. The content is not
|
| // initialized.
|
| // 'length-reg' (R2) contains tagged length.
|
| @@ -2146,7 +2061,6 @@ static void TryAllocateOnebyteString(Assembler* assembler,
|
| __ b(failure);
|
| }
|
|
|
| -
|
| // Arg0: OneByteString (receiver).
|
| // Arg1: Start index as Smi.
|
| // Arg2: End index as Smi.
|
| @@ -2206,7 +2120,6 @@ void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
|
| __ ldr(R2, Address(SP, 0 * kWordSize)); // Value.
|
| __ ldr(R1, Address(SP, 1 * kWordSize)); // Index.
|
| @@ -2218,7 +2131,6 @@ void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
|
| Label fall_through, ok;
|
|
|
| @@ -2231,7 +2143,6 @@ void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| // TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
|
| static void StringEquality(Assembler* assembler, intptr_t string_cid) {
|
| Label fall_through, is_true, is_false, loop;
|
| @@ -2296,17 +2207,14 @@ static void StringEquality(Assembler* assembler, intptr_t string_cid) {
|
| __ Bind(&fall_through);
|
| }
|
|
|
| -
|
| void Intrinsifier::OneByteString_equality(Assembler* assembler) {
|
| StringEquality(assembler, kOneByteStringCid);
|
| }
|
|
|
| -
|
| void Intrinsifier::TwoByteString_equality(Assembler* assembler) {
|
| StringEquality(assembler, kTwoByteStringCid);
|
| }
|
|
|
| -
|
| void Intrinsifier::IntrinsifyRegExpExecuteMatch(Assembler* assembler,
|
| bool sticky) {
|
| if (FLAG_interpret_irregexp) return;
|
| @@ -2340,7 +2248,6 @@ void Intrinsifier::IntrinsifyRegExpExecuteMatch(Assembler* assembler,
|
| __ br(R1);
|
| }
|
|
|
| -
|
| // On stack: user tag (+0).
|
| void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) {
|
| // R1: Isolate.
|
| @@ -2358,21 +2265,18 @@ void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
|
| __ LoadIsolate(R0);
|
| __ ldr(R0, Address(R0, Isolate::default_tag_offset()));
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
|
| __ LoadIsolate(R0);
|
| __ ldr(R0, Address(R0, Isolate::current_tag_offset()));
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
|
| if (!FLAG_support_timeline) {
|
| __ LoadObject(R0, Bool::False());
|
| @@ -2390,14 +2294,12 @@ void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::ClearAsyncThreadStackTrace(Assembler* assembler) {
|
| __ LoadObject(R0, Object::null_object());
|
| __ str(R0, Address(THR, Thread::async_stack_trace_offset()));
|
| __ ret();
|
| }
|
|
|
| -
|
| void Intrinsifier::SetAsyncThreadStackTrace(Assembler* assembler) {
|
| __ ldr(R0, Address(THR, Thread::async_stack_trace_offset()));
|
| __ LoadObject(R0, Object::null_object());
|
|
|