| Index: runtime/vm/intrinsifier_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intrinsifier_ia32.cc (revision 26635)
|
| +++ runtime/vm/intrinsifier_ia32.cc (working copy)
|
| @@ -28,7 +28,7 @@
|
|
|
| #define __ assembler->
|
|
|
| -bool Intrinsifier::ObjectArray_Allocate(Assembler* assembler) {
|
| +void Intrinsifier::ObjectArray_Allocate(Assembler* assembler) {
|
| // This snippet of inlined code uses the following registers:
|
| // EAX, EBX, EDI
|
| // and the newly allocated object is returned in EAX.
|
| @@ -132,24 +132,22 @@
|
| __ ret(); // returns the newly allocated object in EAX.
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Array_getLength(Assembler* assembler) {
|
| +void Intrinsifier::Array_getLength(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| -bool Intrinsifier::ImmutableArray_getLength(Assembler* assembler) {
|
| +void Intrinsifier::ImmutableArray_getLength(Assembler* assembler) {
|
| return Array_getLength(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Array_getIndexed(Assembler* assembler) {
|
| +void Intrinsifier::Array_getIndexed(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index.
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Array.
|
| @@ -164,11 +162,10 @@
|
| __ movl(EAX, FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()));
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) {
|
| +void Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) {
|
| return Array_getIndexed(assembler);
|
| }
|
|
|
| @@ -188,7 +185,7 @@
|
|
|
| // Intrinsify only for Smi value and index. Non-smi values need a store buffer
|
| // update. Array length is always a Smi.
|
| -bool Intrinsifier::Array_setIndexed(Assembler* assembler) {
|
| +void Intrinsifier::Array_setIndexed(Assembler* assembler) {
|
| Label fall_through;
|
| if (FLAG_enable_type_checks) {
|
| const intptr_t type_args_field_offset =
|
| @@ -243,13 +240,12 @@
|
| // Caller is responsible of preserving the value if necessary.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Allocate a GrowableObjectArray using the backing array specified.
|
| // On stack: type argument (+2), data (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
|
| // This snippet of inlined code uses the following registers:
|
| // EAX, EBX
|
| // and the newly allocated object is returned in EAX.
|
| @@ -311,34 +307,31 @@
|
| __ ret(); // returns the newly allocated object in EAX.
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Get length of growable object array.
|
| // On stack: growable array (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_getLength(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_getLength(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| // Get capacity of growable object array.
|
| // On stack: growable array (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::data_offset()));
|
| __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| // Access growable object array at specified index.
|
| // On stack: growable array (+2), index (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index.
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // GrowableArray.
|
| @@ -355,15 +348,14 @@
|
| __ movl(EAX, FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()));
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Set value into growable object array at specified index.
|
| // On stack: growable array (+3), index (+2), value (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) {
|
| if (FLAG_enable_type_checks) {
|
| - return false;
|
| + return;
|
| }
|
| Label fall_through;
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize)); // Index.
|
| @@ -383,14 +375,13 @@
|
| EDI);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Set length of growable object array. The length cannot
|
| // be greater than the length of the data container.
|
| // On stack: growable array (+2), length (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_setLength(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_setLength(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Growable array.
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Length value.
|
| @@ -399,15 +390,14 @@
|
| __ movl(FieldAddress(EAX, GrowableObjectArray::length_offset()), EBX);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Set data of growable object array.
|
| // On stack: growable array (+2), data (+1), return-address (+0).
|
| -bool Intrinsifier::GrowableArray_setData(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_setData(Assembler* assembler) {
|
| if (FLAG_enable_type_checks) {
|
| - return false;
|
| + return;
|
| }
|
| Label fall_through;
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Data.
|
| @@ -422,16 +412,16 @@
|
| EBX);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // 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).
|
| -bool Intrinsifier::GrowableArray_add(Assembler* assembler) {
|
| +void Intrinsifier::GrowableArray_add(Assembler* assembler) {
|
| // In checked mode we need to type-check the incoming argument.
|
| - if (FLAG_enable_type_checks) return false;
|
| + if (FLAG_enable_type_checks) return;
|
| +
|
| Label fall_through;
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Array.
|
| __ movl(EBX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
|
| @@ -455,7 +445,6 @@
|
| __ movl(EAX, raw_null);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| @@ -554,11 +543,10 @@
|
|
|
|
|
| // Gets the length of a TypedData.
|
| -bool Intrinsifier::TypedData_getLength(Assembler* assembler) {
|
| +void Intrinsifier::TypedData_getLength(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ movl(EAX, FieldAddress(EAX, TypedData::length_offset()));
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| @@ -576,19 +564,17 @@
|
|
|
|
|
| #define TYPED_DATA_ALLOCATOR(clazz) \
|
| -bool Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) { \
|
| +void Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) { \
|
| intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \
|
| intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid); \
|
| ScaleFactor scale = GetScaleFactor(size); \
|
| TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
|
| - return false; \
|
| } \
|
| -bool Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) { \
|
| +void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) { \
|
| intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid); \
|
| intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid); \
|
| ScaleFactor scale = GetScaleFactor(size); \
|
| TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, scale); \
|
| - return false; \
|
| }
|
| CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
|
| #undef TYPED_DATA_ALLOCATOR
|
| @@ -605,7 +591,7 @@
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ addl(EAX, Address(ESP, + 2 * kWordSize));
|
| @@ -613,16 +599,15 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_add(Assembler* assembler) {
|
| +void Intrinsifier::Integer_add(Assembler* assembler) {
|
| return Integer_addFromInteger(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ subl(EAX, Address(ESP, + 2 * kWordSize));
|
| @@ -630,11 +615,10 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_sub(Assembler* assembler) {
|
| +void Intrinsifier::Integer_sub(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ movl(EBX, EAX);
|
| @@ -644,12 +628,11 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
|
|
| -bool Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| ASSERT(kSmiTag == 0); // Adjust code below if not the case.
|
| @@ -659,11 +642,10 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_mul(Assembler* assembler) {
|
| +void Intrinsifier::Integer_mul(Assembler* assembler) {
|
| return Integer_mulFromInteger(assembler);
|
| }
|
|
|
| @@ -715,7 +697,7 @@
|
| // res = res + right;
|
| // }
|
| // }
|
| -bool Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
|
| Label fall_through, subtract;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize));
|
| @@ -746,11 +728,10 @@
|
| __ ret();
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_remainder(Assembler* assembler) {
|
| +void Intrinsifier::Integer_remainder(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| // EAX: right argument (divisor)
|
| @@ -768,11 +749,10 @@
|
| __ ret();
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_truncDivide(Assembler* assembler) {
|
| +void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| // EAX: right argument (divisor)
|
| @@ -793,11 +773,10 @@
|
| __ SmiTag(EAX);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_negate(Assembler* assembler) {
|
| +void Intrinsifier::Integer_negate(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ testl(EAX, Immediate(kSmiTagMask));
|
| @@ -807,11 +786,10 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize));
|
| @@ -819,16 +797,15 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitAnd(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
|
| return Integer_bitAndFromInteger(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize));
|
| @@ -836,16 +813,15 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitOr(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitOr(Assembler* assembler) {
|
| return Integer_bitOrFromInteger(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize));
|
| @@ -853,16 +829,15 @@
|
| // Result is in EAX.
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_bitXor(Assembler* assembler) {
|
| +void Intrinsifier::Integer_bitXor(Assembler* assembler) {
|
| return Integer_bitXorFromInteger(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_shl(Assembler* assembler) {
|
| +void Intrinsifier::Integer_shl(Assembler* assembler) {
|
| ASSERT(kSmiTagShift == 1);
|
| ASSERT(kSmiTag == 0);
|
| Label fall_through, overflow;
|
| @@ -909,7 +884,6 @@
|
| __ movl(FieldAddress(EAX, Mint::value_offset() + kWordSize), EDI);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| @@ -937,7 +911,7 @@
|
| }
|
|
|
|
|
| -static bool CompareIntegers(Assembler* assembler, Condition true_condition) {
|
| +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);
|
| // EAX contains the right argument.
|
| @@ -993,39 +967,38 @@
|
| __ Bind(&drop_two_fall_through);
|
| __ Drop(2);
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
|
|
| -bool Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
|
| +void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
|
| return CompareIntegers(assembler, LESS);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_lessThan(Assembler* assembler) {
|
| +void Intrinsifier::Integer_lessThan(Assembler* assembler) {
|
| return Integer_greaterThanFromInt(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_greaterThan(Assembler* assembler) {
|
| +void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
|
| return CompareIntegers(assembler, GREATER);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
|
| +void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
|
| return CompareIntegers(assembler, LESS_EQUAL);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
|
| +void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
|
| return CompareIntegers(assembler, GREATER_EQUAL);
|
| }
|
|
|
|
|
| // This is called for Smi, Mint and Bigint receivers. The right argument
|
| // can be Smi, Mint, Bigint or double.
|
| -bool Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
|
| +void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
|
| Label fall_through, true_label, check_for_mint;
|
| // For integer receiver '===' check first.
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| @@ -1071,16 +1044,15 @@
|
| // TODO(srdjan): Implement Mint == Mint comparison.
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_equal(Assembler* assembler) {
|
| +void Intrinsifier::Integer_equal(Assembler* assembler) {
|
| return Integer_equalToInteger(assembler);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Integer_sar(Assembler* assembler) {
|
| +void Intrinsifier::Integer_sar(Assembler* assembler) {
|
| Label fall_through, shift_count_ok;
|
| TestBothArgumentsSmis(assembler, &fall_through);
|
| // Can destroy ECX since we are not falling through.
|
| @@ -1103,17 +1075,15 @@
|
| __ SmiTag(EAX);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Argument is Smi (receiver).
|
| -bool Intrinsifier::Smi_bitNegate(Assembler* assembler) {
|
| +void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // Index.
|
| __ notl(EAX);
|
| __ andl(EAX, Immediate(~kSmiTagMask)); // Remove inverted smi-tag.
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| @@ -1136,7 +1106,7 @@
|
| // 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
|
| // slow case (compiled method body).
|
| -static bool CompareDoubles(Assembler* assembler, Condition true_condition) {
|
| +static void CompareDoubles(Assembler* assembler, Condition true_condition) {
|
| Label fall_through, is_false, is_true, is_smi, double_op;
|
| TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
|
| // Both arguments are double, right operand is in EAX.
|
| @@ -1159,43 +1129,42 @@
|
| __ cvtsi2sd(XMM1, EAX);
|
| __ jmp(&double_op);
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // arg0 is Double, arg1 is unknown.
|
| -bool Intrinsifier::Double_greaterThan(Assembler* assembler) {
|
| +void Intrinsifier::Double_greaterThan(Assembler* assembler) {
|
| return CompareDoubles(assembler, ABOVE);
|
| }
|
|
|
|
|
| // arg0 is Double, arg1 is unknown.
|
| -bool Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
|
| +void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
|
| return CompareDoubles(assembler, ABOVE_EQUAL);
|
| }
|
|
|
|
|
| // arg0 is Double, arg1 is unknown.
|
| -bool Intrinsifier::Double_lessThan(Assembler* assembler) {
|
| +void Intrinsifier::Double_lessThan(Assembler* assembler) {
|
| return CompareDoubles(assembler, BELOW);
|
| }
|
|
|
|
|
| // arg0 is Double, arg1 is unknown.
|
| -bool Intrinsifier::Double_equal(Assembler* assembler) {
|
| +void Intrinsifier::Double_equal(Assembler* assembler) {
|
| return CompareDoubles(assembler, EQUAL);
|
| }
|
|
|
|
|
| // arg0 is Double, arg1 is unknown.
|
| -bool Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
|
| +void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
|
| return CompareDoubles(assembler, BELOW_EQUAL);
|
| }
|
|
|
|
|
| // Expects left argument to be double (receiver). Right argument is unknown.
|
| // Both arguments are on stack.
|
| -static bool DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| +static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| Label fall_through;
|
| TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
|
| // Both arguments are double, right operand is in EAX.
|
| @@ -1218,32 +1187,31 @@
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_add(Assembler* assembler) {
|
| +void Intrinsifier::Double_add(Assembler* assembler) {
|
| return DoubleArithmeticOperations(assembler, Token::kADD);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_mul(Assembler* assembler) {
|
| +void Intrinsifier::Double_mul(Assembler* assembler) {
|
| return DoubleArithmeticOperations(assembler, Token::kMUL);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_sub(Assembler* assembler) {
|
| +void Intrinsifier::Double_sub(Assembler* assembler) {
|
| return DoubleArithmeticOperations(assembler, Token::kSUB);
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_div(Assembler* assembler) {
|
| +void Intrinsifier::Double_div(Assembler* assembler) {
|
| return DoubleArithmeticOperations(assembler, Token::kDIV);
|
| }
|
|
|
|
|
| // Left is double right is integer (Bigint, Mint or Smi)
|
| -bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| // Only Smi-s allowed.
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| @@ -1264,11 +1232,10 @@
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_fromInteger(Assembler* assembler) {
|
| +void Intrinsifier::Double_fromInteger(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EAX, Address(ESP, +1 * kWordSize));
|
| __ testl(EAX, Immediate(kSmiTagMask));
|
| @@ -1285,11 +1252,10 @@
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_getIsNaN(Assembler* assembler) {
|
| +void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
|
| Label is_true;
|
| __ movl(EAX, Address(ESP, +1 * kWordSize));
|
| __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
|
| @@ -1300,11 +1266,10 @@
|
| __ Bind(&is_true);
|
| __ LoadObject(EAX, Bool::True());
|
| __ ret();
|
| - return true; // Method is complete, no slow case.
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
|
| +void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
|
| Label is_false, is_true, is_zero;
|
| __ movl(EAX, Address(ESP, +1 * kWordSize));
|
| __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
|
| @@ -1325,11 +1290,10 @@
|
| __ testl(EAX, Immediate(1));
|
| __ j(NOT_ZERO, &is_true, Assembler::kNearJump);
|
| __ jmp(&is_false, Assembler::kNearJump);
|
| - return true; // Method is complete, no slow case.
|
| }
|
|
|
|
|
| -bool Intrinsifier::Double_toInt(Assembler* assembler) {
|
| +void Intrinsifier::Double_toInt(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, +1 * kWordSize));
|
| __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
|
| __ cvttsd2si(EAX, XMM0);
|
| @@ -1341,12 +1305,11 @@
|
| __ SmiTag(EAX);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| // Argument type is not known
|
| -bool Intrinsifier::Math_sqrt(Assembler* assembler) {
|
| +void Intrinsifier::Math_sqrt(Assembler* assembler) {
|
| Label fall_through, is_smi, double_op;
|
| TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
|
| // Argument is double and is in EAX.
|
| @@ -1366,7 +1329,6 @@
|
| __ cvtsi2sd(XMM1, EAX);
|
| __ jmp(&double_op);
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| @@ -1414,22 +1376,20 @@
|
| }
|
|
|
|
|
| -bool Intrinsifier::Math_sin(Assembler* assembler) {
|
| +void Intrinsifier::Math_sin(Assembler* assembler) {
|
| EmitTrigonometric(assembler, kSine);
|
| - return false; // Compile method for slow case.
|
| }
|
|
|
|
|
| -bool Intrinsifier::Math_cos(Assembler* assembler) {
|
| +void Intrinsifier::Math_cos(Assembler* assembler) {
|
| EmitTrigonometric(assembler, kCosine);
|
| - return false; // Compile method for slow case.
|
| }
|
|
|
|
|
| // var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
|
| // _state[kSTATE_LO] = state & _MASK_32;
|
| // _state[kSTATE_HI] = state >> 32;
|
| -bool Intrinsifier::Random_nextState(Assembler* assembler) {
|
| +void Intrinsifier::Random_nextState(Assembler* assembler) {
|
| const Library& math_lib = Library::Handle(Library::MathLibrary());
|
| ASSERT(!math_lib.IsNull());
|
| const Class& random_class = Class::Handle(
|
| @@ -1468,12 +1428,11 @@
|
| __ movl(addr_1, EDX);
|
| __ movl(addr_0, EAX);
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| // Identity comparison.
|
| -bool Intrinsifier::Object_equal(Assembler* assembler) {
|
| +void Intrinsifier::Object_equal(Assembler* assembler) {
|
| Label is_true;
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize));
|
| __ cmpl(EAX, Address(ESP, + 2 * kWordSize));
|
| @@ -1483,11 +1442,10 @@
|
| __ Bind(&is_true);
|
| __ LoadObject(EAX, Bool::True());
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| -bool Intrinsifier::String_getHashCode(Assembler* assembler) {
|
| +void Intrinsifier::String_getHashCode(Assembler* assembler) {
|
| Label fall_through;
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // String object.
|
| __ movl(EAX, FieldAddress(EAX, String::hash_offset()));
|
| @@ -1496,19 +1454,17 @@
|
| __ ret();
|
| __ Bind(&fall_through);
|
| // Hash not yet computed.
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::String_getLength(Assembler* assembler) {
|
| +void Intrinsifier::String_getLength(Assembler* assembler) {
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // String object.
|
| __ movl(EAX, FieldAddress(EAX, String::length_offset()));
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| -bool Intrinsifier::String_codeUnitAt(Assembler* assembler) {
|
| +void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
|
| Label fall_through, try_two_byte_string;
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index.
|
| __ movl(EAX, Address(ESP, + 2 * kWordSize)); // String.
|
| @@ -1534,11 +1490,10 @@
|
| __ ret();
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::String_getIsEmpty(Assembler* assembler) {
|
| +void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
|
| Label is_true;
|
| // Get length.
|
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); // String object.
|
| @@ -1550,11 +1505,10 @@
|
| __ Bind(&is_true);
|
| __ LoadObject(EAX, Bool::True());
|
| __ ret();
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
|
| +void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
|
| Label compute_hash;
|
| __ movl(EBX, Address(ESP, + 1 * kWordSize)); // OneByteString object.
|
| __ movl(EAX, FieldAddress(EBX, String::hash_offset()));
|
| @@ -1620,7 +1574,6 @@
|
| __ SmiTag(EAX);
|
| __ movl(FieldAddress(EBX, String::hash_offset()), EAX);
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| @@ -1704,7 +1657,7 @@
|
| // Arg1: Start index as Smi.
|
| // Arg2: End index as Smi.
|
| // The indexes must be valid.
|
| -bool Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
|
| +void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
|
| const intptr_t kStringOffset = 3 * kWordSize;
|
| const intptr_t kStartIndexOffset = 2 * kWordSize;
|
| const intptr_t kEndIndexOffset = 1 * kWordSize;
|
| @@ -1741,11 +1694,10 @@
|
| __ j(LESS, &loop, Assembler::kNearJump);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
|
|
| -bool Intrinsifier::OneByteString_setAt(Assembler* assembler) {
|
| +void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
|
| __ movl(ECX, Address(ESP, + 1 * kWordSize)); // Value.
|
| __ movl(EBX, Address(ESP, + 2 * kWordSize)); // Index.
|
| __ movl(EAX, Address(ESP, + 3 * kWordSize)); // OneByteString.
|
| @@ -1753,11 +1705,10 @@
|
| __ SmiUntag(ECX);
|
| __ movb(FieldAddress(EAX, EBX, TIMES_1, OneByteString::data_offset()), CL);
|
| __ ret();
|
| - return true;
|
| }
|
|
|
|
|
| -bool Intrinsifier::OneByteString_allocate(Assembler* assembler) {
|
| +void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
|
| __ movl(EDI, Address(ESP, + 1 * kWordSize)); // Length.
|
| Label fall_through, ok;
|
| TryAllocateOnebyteString(assembler, &ok, &fall_through, EDI);
|
| @@ -1767,7 +1718,6 @@
|
| __ ret();
|
|
|
| __ Bind(&fall_through);
|
| - return false;
|
| }
|
|
|
| #undef __
|
|
|