Index: runtime/vm/intrinsifier_ia32.cc |
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc |
index d739d35adc0a427721892f144b4377d582dbc446..24cb10f438064e9a9063a5d9686f5eab02cf50d2 100644 |
--- a/runtime/vm/intrinsifier_ia32.cc |
+++ b/runtime/vm/intrinsifier_ia32.cc |
@@ -36,12 +36,10 @@ namespace dart { |
#define __ assembler-> |
- |
intptr_t Intrinsifier::ParameterSlotFromSp() { |
return 0; |
} |
- |
void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) { |
COMPILE_ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG); |
@@ -49,13 +47,11 @@ void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) { |
assembler->movl(CALLEE_SAVED_TEMP, ARGS_DESC_REG); |
} |
- |
void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) { |
assembler->Comment("IntrinsicCallEpilogue"); |
assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP); |
} |
- |
static intptr_t ComputeObjectArrayTypeArgumentsOffset() { |
const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
const Class& cls = |
@@ -67,7 +63,6 @@ static intptr_t ComputeObjectArrayTypeArgumentsOffset() { |
return field_offset; |
} |
- |
// 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) { |
@@ -123,7 +118,6 @@ void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
// Allocate a GrowableObjectArray using the backing array specified. |
// On stack: type argument (+2), data (+1), return-address (+0). |
void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) { |
@@ -158,7 +152,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 (+2), value (+1), return-address (+0). |
@@ -188,7 +181,6 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
#define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_factor) \ |
Label fall_through; \ |
const intptr_t kArrayLengthStackOffset = 1 * kWordSize; \ |
@@ -284,7 +276,6 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) { |
__ ret(); \ |
__ Bind(&fall_through); |
- |
static ScaleFactor GetScaleFactor(intptr_t size) { |
switch (size) { |
case 1: |
@@ -302,7 +293,6 @@ static ScaleFactor GetScaleFactor(intptr_t size) { |
return static_cast<ScaleFactor>(0); |
} |
- |
#define TYPED_DATA_ALLOCATOR(clazz) \ |
void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) { \ |
intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \ |
@@ -313,7 +303,6 @@ static ScaleFactor GetScaleFactor(intptr_t size) { |
CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR) |
#undef TYPED_DATA_ALLOCATOR |
- |
// Tests if two top most arguments are smis, jumps to label not_smi if not. |
// Topmost argument is in EAX. |
static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) { |
@@ -324,7 +313,6 @@ static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) { |
__ j(NOT_ZERO, not_smi, Assembler::kNearJump); |
} |
- |
void Intrinsifier::Integer_addFromInteger(Assembler* assembler) { |
Label fall_through; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -335,12 +323,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); |
@@ -351,7 +337,6 @@ void Intrinsifier::Integer_subFromInteger(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_sub(Assembler* assembler) { |
Label fall_through; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -364,7 +349,6 @@ void Intrinsifier::Integer_sub(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) { |
Label fall_through; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -377,12 +361,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 |
@@ -422,7 +404,6 @@ static void EmitRemainderOperation(Assembler* assembler) { |
__ idivl(EBX); |
} |
- |
// Implementation: |
// res = left % right; |
// if (res < 0) { |
@@ -465,7 +446,6 @@ void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_truncDivide(Assembler* assembler) { |
Label fall_through; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -489,7 +469,6 @@ void Intrinsifier::Integer_truncDivide(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_negate(Assembler* assembler) { |
Label fall_through; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
@@ -502,7 +481,6 @@ void Intrinsifier::Integer_negate(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) { |
Label fall_through; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -513,12 +491,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); |
@@ -529,12 +505,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; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -545,12 +519,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); |
@@ -599,7 +571,6 @@ void Intrinsifier::Integer_shl(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
static void Push64SmiOrMint(Assembler* assembler, |
Register reg, |
Register tmp, |
@@ -623,7 +594,6 @@ static void Push64SmiOrMint(Assembler* assembler, |
__ Bind(&done); |
} |
- |
static void CompareIntegers(Assembler* assembler, Condition true_condition) { |
Label try_mint_smi, is_true, is_false, drop_two_fall_through, fall_through; |
TestBothArgumentsSmis(assembler, &try_mint_smi); |
@@ -682,32 +652,26 @@ static void CompareIntegers(Assembler* assembler, Condition true_condition) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) { |
CompareIntegers(assembler, LESS); |
} |
- |
void Intrinsifier::Integer_lessThan(Assembler* assembler) { |
Integer_greaterThanFromInt(assembler); |
} |
- |
void Intrinsifier::Integer_greaterThan(Assembler* assembler) { |
CompareIntegers(assembler, GREATER); |
} |
- |
void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) { |
CompareIntegers(assembler, LESS_EQUAL); |
} |
- |
void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) { |
CompareIntegers(assembler, GREATER_EQUAL); |
} |
- |
// 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) { |
@@ -758,12 +722,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, shift_count_ok; |
TestBothArgumentsSmis(assembler, &fall_through); |
@@ -789,7 +751,6 @@ void Intrinsifier::Integer_sar(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
// Argument is Smi (receiver). |
void Intrinsifier::Smi_bitNegate(Assembler* assembler) { |
__ movl(EAX, Address(ESP, +1 * kWordSize)); // Receiver. |
@@ -798,7 +759,6 @@ void Intrinsifier::Smi_bitNegate(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Smi_bitLength(Assembler* assembler) { |
ASSERT(kSmiTagShift == 1); |
__ movl(EAX, Address(ESP, +1 * kWordSize)); // Receiver. |
@@ -814,12 +774,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) |
@@ -864,7 +822,6 @@ void Intrinsifier::Bigint_lsh(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Bigint_rsh(Assembler* assembler) { |
// static void _rsh(Uint32List x_digits, int x_used, int n, |
// Uint32List r_digits) |
@@ -910,7 +867,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, |
@@ -970,7 +926,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, |
@@ -1026,7 +981,6 @@ void Intrinsifier::Bigint_absSub(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Bigint_mulAdd(Assembler* assembler) { |
// Pseudo code: |
// static int _mulAdd(Uint32List x_digits, int xi, |
@@ -1146,7 +1100,6 @@ void Intrinsifier::Bigint_mulAdd(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Bigint_sqrAdd(Assembler* assembler) { |
// Pseudo code: |
// static int _sqrAdd(Uint32List x_digits, int i, |
@@ -1279,7 +1232,6 @@ void Intrinsifier::Bigint_sqrAdd(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Bigint_estQuotientDigit(Assembler* assembler) { |
// Pseudo code: |
// static int _estQuotientDigit(Uint32List args, Uint32List digits, int i) { |
@@ -1336,7 +1288,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) { |
@@ -1371,7 +1322,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 EAX. |
@@ -1386,7 +1336,6 @@ static void TestLastArgumentIsDouble(Assembler* assembler, |
// Fall through if double. |
} |
- |
// Both arguments on stack, arg0 (left) is a double, arg1 (right) is of unknown |
// type. Return true or false object in the register EAX. Any NaN argument |
// returns false. Any non-double arg1 causes control flow to fall through to the |
@@ -1416,37 +1365,31 @@ static void CompareDoubles(Assembler* assembler, Condition true_condition) { |
__ Bind(&fall_through); |
} |
- |
// arg0 is Double, arg1 is unknown. |
void Intrinsifier::Double_greaterThan(Assembler* assembler) { |
CompareDoubles(assembler, ABOVE); |
} |
- |
// arg0 is Double, arg1 is unknown. |
void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) { |
CompareDoubles(assembler, ABOVE_EQUAL); |
} |
- |
// arg0 is Double, arg1 is unknown. |
void Intrinsifier::Double_lessThan(Assembler* assembler) { |
CompareDoubles(assembler, BELOW); |
} |
- |
// arg0 is Double, arg1 is unknown. |
void Intrinsifier::Double_equal(Assembler* assembler) { |
CompareDoubles(assembler, EQUAL); |
} |
- |
// arg0 is Double, arg1 is unknown. |
void Intrinsifier::Double_lessEqualThan(Assembler* assembler) { |
CompareDoubles(assembler, BELOW_EQUAL); |
} |
- |
// Expects left argument to be double (receiver). Right argument is unknown. |
// Both arguments are on stack. |
static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) { |
@@ -1487,27 +1430,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; |
@@ -1531,7 +1469,6 @@ void Intrinsifier::Double_mulFromInteger(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::DoubleFromInteger(Assembler* assembler) { |
Label fall_through; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
@@ -1550,7 +1487,6 @@ void Intrinsifier::DoubleFromInteger(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::Double_getIsNaN(Assembler* assembler) { |
Label is_true; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
@@ -1564,7 +1500,6 @@ void Intrinsifier::Double_getIsNaN(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Double_getIsInfinite(Assembler* assembler) { |
Label not_inf; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
@@ -1588,7 +1523,6 @@ void Intrinsifier::Double_getIsInfinite(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::Double_getIsNegative(Assembler* assembler) { |
Label is_false, is_true, is_zero; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
@@ -1612,7 +1546,6 @@ void Intrinsifier::Double_getIsNegative(Assembler* assembler) { |
__ jmp(&is_false, Assembler::kNearJump); |
} |
- |
void Intrinsifier::DoubleToInteger(Assembler* assembler) { |
__ movl(EAX, Address(ESP, +1 * kWordSize)); |
__ movsd(XMM0, FieldAddress(EAX, Double::value_offset())); |
@@ -1627,7 +1560,6 @@ void Intrinsifier::DoubleToInteger(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
// Argument type is not known |
void Intrinsifier::MathSqrt(Assembler* assembler) { |
Label fall_through, is_smi, double_op; |
@@ -1650,7 +1582,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; |
@@ -1696,7 +1627,6 @@ void Intrinsifier::Random_nextState(Assembler* assembler) { |
__ ret(); |
} |
- |
// Identity comparison. |
void Intrinsifier::ObjectEquals(Assembler* assembler) { |
Label is_true; |
@@ -1710,7 +1640,6 @@ void Intrinsifier::ObjectEquals(Assembler* assembler) { |
__ ret(); |
} |
- |
static void RangeCheck(Assembler* assembler, |
Register reg, |
intptr_t low, |
@@ -1722,35 +1651,29 @@ static void RangeCheck(Assembler* assembler, |
__ j(cc, target); |
} |
- |
const Condition kIfNotInRange = ABOVE; |
const Condition kIfInRange = BELOW_EQUAL; |
- |
static void JumpIfInteger(Assembler* assembler, Register cid, Label* target) { |
RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfInRange, target); |
} |
- |
static void JumpIfNotInteger(Assembler* assembler, |
Register cid, |
Label* target) { |
RangeCheck(assembler, cid, kSmiCid, kBigintCid, kIfNotInRange, target); |
} |
- |
static void JumpIfString(Assembler* assembler, Register cid, Label* target) { |
RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid, |
kIfInRange, target); |
} |
- |
static void JumpIfNotString(Assembler* assembler, Register cid, Label* target) { |
RangeCheck(assembler, cid, kOneByteStringCid, kExternalTwoByteStringCid, |
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; |
@@ -1807,7 +1730,6 @@ void Intrinsifier::ObjectRuntimeType(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) { |
Label fall_through, different_cids, equal, not_equal, not_integer; |
@@ -1871,7 +1793,6 @@ void Intrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::String_getHashCode(Assembler* assembler) { |
Label fall_through; |
__ movl(EAX, Address(ESP, +1 * kWordSize)); // String object. |
@@ -1883,23 +1804,19 @@ void Intrinsifier::String_getHashCode(Assembler* assembler) { |
// Hash not yet computed. |
} |
- |
// bool _substringMatches(int start, String other) |
void Intrinsifier::StringBaseSubstringMatches(Assembler* assembler) { |
// For precompilation, not implemented on IA32. |
} |
- |
void Intrinsifier::Object_getHash(Assembler* assembler) { |
UNREACHABLE(); |
} |
- |
void Intrinsifier::Object_setHash(Assembler* assembler) { |
UNREACHABLE(); |
} |
- |
void Intrinsifier::StringBaseCharAt(Assembler* assembler) { |
Label fall_through, try_two_byte_string; |
__ movl(EBX, Address(ESP, +1 * kWordSize)); // Index. |
@@ -1938,7 +1855,6 @@ void Intrinsifier::StringBaseCharAt(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) { |
Label is_true; |
// Get length. |
@@ -1953,7 +1869,6 @@ void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) { |
Label compute_hash; |
__ movl(EBX, Address(ESP, +1 * kWordSize)); // OneByteString object. |
@@ -2022,7 +1937,6 @@ void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) { |
__ ret(); |
} |
- |
// Allocates one-byte string of length 'end - start'. The content is not |
// initialized. 'length-reg' contains tagged length. |
// Returns new string as tagged pointer in EAX. |
@@ -2102,7 +2016,6 @@ static void TryAllocateOnebyteString(Assembler* assembler, |
__ jmp(failure); |
} |
- |
// Arg0: OneByteString (receiver) |
// Arg1: Start index as Smi. |
// Arg2: End index as Smi. |
@@ -2151,7 +2064,6 @@ void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) { |
__ Bind(&fall_through); |
} |
- |
void Intrinsifier::OneByteStringSetAt(Assembler* assembler) { |
__ movl(ECX, Address(ESP, +1 * kWordSize)); // Value. |
__ movl(EBX, Address(ESP, +2 * kWordSize)); // Index. |
@@ -2162,7 +2074,6 @@ void Intrinsifier::OneByteStringSetAt(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::OneByteString_allocate(Assembler* assembler) { |
__ movl(EDI, Address(ESP, +1 * kWordSize)); // Length. |
Label fall_through, ok; |
@@ -2175,7 +2086,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; |
@@ -2232,17 +2142,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; |
@@ -2262,8 +2169,9 @@ void Intrinsifier::IntrinsifyRegExpExecuteMatch(Assembler* assembler, |
__ movl(EDI, Address(ESP, kStringParamOffset)); |
__ LoadClassId(EDI, EDI); |
__ SubImmediate(EDI, Immediate(kOneByteStringCid)); |
- __ movl(EAX, FieldAddress(EBX, EDI, TIMES_4, RegExp::function_offset( |
- kOneByteStringCid, sticky))); |
+ __ movl(EAX, |
+ FieldAddress(EBX, EDI, TIMES_4, |
+ RegExp::function_offset(kOneByteStringCid, sticky))); |
// Registers are now set up for the lazy compile stub. It expects the function |
// in EAX, the argument descriptor in EDX, and IC-Data in ECX. |
@@ -2274,7 +2182,6 @@ void Intrinsifier::IntrinsifyRegExpExecuteMatch(Assembler* assembler, |
__ jmp(EDI); |
} |
- |
// On stack: user tag (+1), return-address (+0). |
void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) { |
// RDI: Isolate. |
@@ -2292,21 +2199,18 @@ void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::UserTag_defaultTag(Assembler* assembler) { |
__ LoadIsolate(EAX); |
__ movl(EAX, Address(EAX, Isolate::default_tag_offset())); |
__ ret(); |
} |
- |
void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) { |
__ LoadIsolate(EAX); |
__ movl(EAX, Address(EAX, Isolate::current_tag_offset())); |
__ ret(); |
} |
- |
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) { |
if (!FLAG_support_timeline) { |
__ LoadObject(EAX, Bool::False()); |
@@ -2329,14 +2233,12 @@ void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) { |
__ ret(); |
} |
- |
void Intrinsifier::ClearAsyncThreadStackTrace(Assembler* assembler) { |
__ LoadObject(EAX, Object::null_object()); |
__ movl(Address(THR, Thread::async_stack_trace_offset()), EAX); |
__ ret(); |
} |
- |
void Intrinsifier::SetAsyncThreadStackTrace(Assembler* assembler) { |
__ movl(Address(THR, Thread::async_stack_trace_offset()), EAX); |
__ LoadObject(EAX, Object::null_object()); |