| Index: src/a64/lithium-codegen-a64.cc
|
| diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc
|
| index 531a8dd2547c1a95475fb3e56bb3c52efd89c2cd..759d9e7e0d4803affd64d599f007ba0328437328 100644
|
| --- a/src/a64/lithium-codegen-a64.cc
|
| +++ b/src/a64/lithium-codegen-a64.cc
|
| @@ -789,7 +789,7 @@ void LCodeGen::FinishCode(Handle<Code> code) {
|
| }
|
|
|
|
|
| -void LCodeGen::Abort(const char* reason) {
|
| +void LCodeGen::Abort(BailoutReason reason) {
|
| info()->set_bailout_reason(reason);
|
| status_ = ABORTED;
|
| }
|
| @@ -900,7 +900,7 @@ void LCodeGen::Deoptimize(LEnvironment* environment,
|
| Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
|
|
|
| if (entry == NULL) {
|
| - Abort("bailout was not prepared");
|
| + Abort(kBailoutWasNotPrepared);
|
| return;
|
| }
|
|
|
| @@ -1071,14 +1071,14 @@ Operand LCodeGen::ToOperand(LOperand* op) {
|
| ASSERT(constant->HasInteger32Value());
|
| return Operand(constant->Integer32Value());
|
| } else if (r.IsDouble()) {
|
| - Abort("ToOperand unsupported double immediate.");
|
| + Abort(kToOperandUnsupportedDoubleImmediate);
|
| }
|
| ASSERT(r.IsTagged());
|
| return Operand(constant->handle());
|
| } else if (op->IsRegister()) {
|
| return Operand(ToRegister(op));
|
| } else if (op->IsDoubleRegister()) {
|
| - Abort("ToOperand IsDoubleRegister unimplemented");
|
| + Abort(kToOperandIsDoubleRegisterUnimplemented);
|
| return Operand(0);
|
| }
|
| // Stack slots not implemented, use ToMemOperand instead.
|
| @@ -1112,7 +1112,9 @@ Operand LCodeGen::ToOperand32(LOperand* op, IntegerSignedness signedness) {
|
| : static_cast<uint32_t>(constant->Integer32Value()));
|
| } else {
|
| // Other constants not implemented.
|
| - Abort("ToOperand32 unsupported immediate.");
|
| + // TODO(all): Add this error code to objects.h.
|
| + // Abort(kToOperand32UnsupportedImmediate);
|
| + Abort(kUnknown);
|
| }
|
| }
|
| // Other cases are not implemented.
|
| @@ -1346,10 +1348,12 @@ void LCodeGen::DoAllocate(LAllocate* instr) {
|
| flags = static_cast<AllocationFlags>(flags | DOUBLE_ALIGNMENT);
|
| }
|
|
|
| - if (instr->hydrogen()->CanAllocateInOldPointerSpace()) {
|
| - ASSERT(!instr->hydrogen()->CanAllocateInOldDataSpace());
|
| + if (instr->hydrogen()->IsOldPointerSpaceAllocation()) {
|
| + ASSERT(!instr->hydrogen()->IsOldDataSpaceAllocation());
|
| + ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
|
| flags = static_cast<AllocationFlags>(flags | PRETENURE_OLD_POINTER_SPACE);
|
| - } else if (instr->hydrogen()->CanAllocateInOldDataSpace()) {
|
| + } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) {
|
| + ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
|
| flags = static_cast<AllocationFlags>(flags | PRETENURE_OLD_DATA_SPACE);
|
| }
|
|
|
| @@ -1404,10 +1408,12 @@ void LCodeGen::DoDeferredAllocate(LAllocate* instr) {
|
| __ SmiTag(size);
|
| __ Push(size);
|
| }
|
| - if (instr->hydrogen()->CanAllocateInOldPointerSpace()) {
|
| - ASSERT(!instr->hydrogen()->CanAllocateInOldDataSpace());
|
| + if (instr->hydrogen()->IsOldPointerSpaceAllocation()) {
|
| + ASSERT(!instr->hydrogen()->IsOldDataSpaceAllocation());
|
| + ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
|
| CallRuntimeFromDeferred(Runtime::kAllocateInOldPointerSpace, 1, instr);
|
| - } else if (instr->hydrogen()->CanAllocateInOldDataSpace()) {
|
| + } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) {
|
| + ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
|
| CallRuntimeFromDeferred(Runtime::kAllocateInOldDataSpace, 1, instr);
|
| } else {
|
| CallRuntimeFromDeferred(Runtime::kAllocateInNewSpace, 1, instr);
|
| @@ -1602,7 +1608,9 @@ void LCodeGen::DoBitNotI(LBitNotI* instr) {
|
|
|
| void LCodeGen::ApplyCheckIf(Condition cc, LBoundsCheck* check) {
|
| if (FLAG_debug_code && check->hydrogen()->skip_check()) {
|
| - __ Assert(InvertCondition(cc), "eliminated bounds check failed");
|
| + // TODO(all): Add this error code to objects.h.
|
| + // __ Assert(InvertCondition(cc), kEliminatedBoundsCheckFailed);
|
| + __ Assert(InvertCondition(cc), kUnknown);
|
| } else {
|
| DeoptimizeIf(cc, check->environment());
|
| }
|
| @@ -1802,7 +1810,9 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
|
| Label is_not_smi;
|
| // Try to confirm that function_reg (x1) is a tagged pointer.
|
| __ JumpIfNotSmi(function_reg, &is_not_smi);
|
| - __ Abort("In CallKnownFunction, a function object is expected in x1.");
|
| + // TODO(all): Add this error code to objects.h.
|
| + // __ Abort(kExpectedFunctionObject);
|
| + __ Abort(kUnknown);
|
| __ Bind(&is_not_smi);
|
| }
|
|
|
| @@ -2288,6 +2298,11 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoConstantE(LConstantE* instr) {
|
| + __ Mov(ToRegister(instr->result()), Operand(instr->value()));
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoConstantI(LConstantI* instr) {
|
| __ Mov(ToRegister(instr->result()), instr->value());
|
| }
|
| @@ -3099,20 +3114,6 @@ void LCodeGen::DoLabel(LLabel* label) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoLinkObjectInList(LLinkObjectInList* instr) {
|
| - Register object = ToRegister(instr->object());
|
| - Register temp = ToRegister(instr->temp());
|
| - ExternalReference sites_list_address = instr->GetReference(isolate());
|
| -
|
| - __ Mov(temp, Operand(sites_list_address));
|
| - __ Ldr(temp, MemOperand(temp));
|
| - __ Str(temp, FieldMemOperand(object,
|
| - instr->hydrogen()->store_field().offset()));
|
| - __ Mov(temp, Operand(sites_list_address));
|
| - __ Str(object, MemOperand(temp));
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
|
| Register context = ToRegister(instr->context());
|
| Register result = ToRegister(instr->result());
|
| @@ -3254,7 +3255,7 @@ void LCodeGen::DoLoadKeyedExternal(LLoadKeyedExternal* instr) {
|
| ASSERT(instr->temp() == NULL);
|
| constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
|
| if (constant_key & 0xf0000000) {
|
| - Abort("Array index constant value too big.");
|
| + Abort(kArrayIndexConstantValueTooBig);
|
| }
|
| } else {
|
| scratch = ToRegister(instr->temp());
|
| @@ -3344,7 +3345,7 @@ void LCodeGen::DoLoadKeyedFixedDouble(LLoadKeyedFixedDouble* instr) {
|
|
|
| int constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
|
| if (constant_key & 0xf0000000) {
|
| - Abort("Array index constant value too big.");
|
| + Abort(kArrayIndexConstantValueTooBig);
|
| }
|
| offset = FixedDoubleArray::OffsetOfElementAt(constant_key +
|
| instr->additional_index());
|
| @@ -3420,6 +3421,12 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
| int offset = access.offset();
|
| Register object = ToRegister(instr->object());
|
|
|
| + if (access.IsExternalMemory()) {
|
| + Register result = ToRegister(instr->result());
|
| + __ Ldr(result, MemOperand(object, offset));
|
| + return;
|
| + }
|
| +
|
| if (instr->hydrogen()->representation().IsDouble()) {
|
| FPRegister result = ToDoubleRegister(instr->result());
|
| __ Ldr(result, FieldMemOperand(object, offset));
|
| @@ -4359,7 +4366,9 @@ void LCodeGen::DoDeferredNumberTagU(LInstruction* instr,
|
| __ Mov(scratch1, Operand(new_space_allocation_top));
|
| __ Ldr(scratch1, MemOperand(scratch1));
|
| __ Cmp(dst, scratch1);
|
| - __ Check(eq, "Register dst does not contain allocation top.");
|
| + // TODO(all): Add this error code to objects.h.
|
| + // __ Check(eq, kRegisterDstDoesNotContainAllocationTop);
|
| + __ Check(eq, kUnknown);
|
| }
|
|
|
| {
|
| @@ -4514,7 +4523,9 @@ void LCodeGen::DoParameter(LParameter* instr) {
|
| void LCodeGen::DoPushArgument(LPushArgument* instr) {
|
| LOperand* argument = instr->value();
|
| if (argument->IsDoubleRegister() || argument->IsDoubleStackSlot()) {
|
| - Abort("DoPushArgument not implemented for double types.");
|
| + // TODO(all): Add this error code to objects.h.
|
| + // Abort(kDoPushArgumentNotImplementedForDoubleTypes);
|
| + Abort(kUnknown);
|
| } else {
|
| __ Push(ToRegister(argument));
|
| }
|
| @@ -4579,11 +4590,11 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
|
|
|
| if (encoding == String::ONE_BYTE_ENCODING) {
|
| __ Cmp(temp, kSeqStringTag | kOneByteStringTag);
|
| - __ Check(eq, "Unexpected string type");
|
| + __ Check(eq, kUnexpectedStringType);
|
| } else {
|
| ASSERT(encoding == String::TWO_BYTE_ENCODING);
|
| __ Cmp(temp, kSeqStringTag | kTwoByteStringTag);
|
| - __ Check(eq, "Unexpected string type");
|
| + __ Check(eq, kUnexpectedStringType);
|
| }
|
| }
|
|
|
| @@ -4836,7 +4847,7 @@ void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) {
|
| ASSERT(instr->temp() == NULL);
|
| constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
|
| if (constant_key & 0xf0000000) {
|
| - Abort("Array index constant value too big.");
|
| + Abort(kArrayIndexConstantValueTooBig);
|
| }
|
| } else {
|
| key = ToRegister(instr->key());
|
| @@ -4895,7 +4906,7 @@ void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
| if (instr->key()->IsConstantOperand()) {
|
| int constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
|
| if (constant_key & 0xf0000000) {
|
| - Abort("Array index constant value too big.");
|
| + Abort(kArrayIndexConstantValueTooBig);
|
| }
|
| offset = FixedDoubleArray::OffsetOfElementAt(constant_key +
|
| instr->additional_index());
|
| @@ -4977,6 +4988,12 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| HObjectAccess access = instr->hydrogen()->access();
|
| int offset = access.offset();
|
|
|
| + if (access.IsExternalMemory()) {
|
| + Register value = ToRegister(instr->value());
|
| + __ Str(value, MemOperand(object, offset));
|
| + return;
|
| + }
|
| +
|
| Handle<Map> transition = instr->transition();
|
|
|
| if (FLAG_track_heap_object_fields && representation.IsHeapObject()) {
|
| @@ -5175,13 +5192,6 @@ void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoStringLength(LStringLength* instr) {
|
| - Register string = ToRegister(instr->string());
|
| - Register result = ToRegister(instr->result());
|
| - __ Ldr(result, FieldMemOperand(string, String::kLengthOffset));
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoSubI(LSubI* instr) {
|
| bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
|
| Register result = ToRegister32(instr->result());
|
| @@ -5351,7 +5361,7 @@ void LCodeGen::DoThrow(LThrow* instr) {
|
| CallRuntime(Runtime::kThrow, 1, instr);
|
|
|
| if (FLAG_debug_code) {
|
| - __ Abort("Unreachable code in Throw.");
|
| + __ Unreachable();
|
| }
|
| }
|
|
|
|
|