| Index: src/arm64/lithium-codegen-arm64.cc
|
| diff --git a/src/arm64/lithium-codegen-arm64.cc b/src/arm64/lithium-codegen-arm64.cc
|
| index 0873c959ac5a2d0bd4d9121aa9ec93a463577c48..31e8923252ff07098418c129a54ecdbb33f1bbbe 100644
|
| --- a/src/arm64/lithium-codegen-arm64.cc
|
| +++ b/src/arm64/lithium-codegen-arm64.cc
|
| @@ -1123,6 +1123,12 @@ void LCodeGen::DeoptimizeIfNotRoot(Register rt, Heap::RootListIndex index,
|
| }
|
|
|
|
|
| +void LCodeGen::DeoptimizeIfNotHeapNumber(Register object, LInstruction* instr) {
|
| + __ CompareObjectMap(object, Heap::kHeapNumberMapRootIndex);
|
| + DeoptimizeIf(ne, instr);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DeoptimizeIfMinusZero(DoubleRegister input,
|
| LInstruction* instr) {
|
| __ TestForMinusZero(input);
|
| @@ -1377,11 +1383,11 @@ void LCodeGen::EmitBranchGeneric(InstrType instr,
|
| EmitGoto(left_block);
|
| } else if (left_block == next_block) {
|
| branch.EmitInverted(chunk_->GetAssemblyLabel(right_block));
|
| - } else if (right_block == next_block) {
|
| - branch.Emit(chunk_->GetAssemblyLabel(left_block));
|
| } else {
|
| branch.Emit(chunk_->GetAssemblyLabel(left_block));
|
| - __ B(chunk_->GetAssemblyLabel(right_block));
|
| + if (right_block != next_block) {
|
| + __ B(chunk_->GetAssemblyLabel(right_block));
|
| + }
|
| }
|
| }
|
|
|
| @@ -2299,7 +2305,6 @@ void LCodeGen::DoClampIToUint8(LClampIToUint8* instr) {
|
| void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
| Register input = ToRegister(instr->unclamped());
|
| Register result = ToRegister32(instr->result());
|
| - Register scratch = ToRegister(instr->temp1());
|
| Label done;
|
|
|
| // Both smi and heap number cases are handled.
|
| @@ -2313,8 +2318,7 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
|
|
| // Check for heap number.
|
| Label is_heap_number;
|
| - __ Ldr(scratch, FieldMemOperand(input, HeapObject::kMapOffset));
|
| - __ JumpIfRoot(scratch, Heap::kHeapNumberMapRootIndex, &is_heap_number);
|
| + __ JumpIfHeapNumber(input, &is_heap_number);
|
|
|
| // Check for undefined. Undefined is coverted to zero for clamping conversion.
|
| DeoptimizeIfNotRoot(input, Heap::kUndefinedValueRootIndex, instr);
|
| @@ -2324,7 +2328,7 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
| // Heap number case.
|
| __ Bind(&is_heap_number);
|
| DoubleRegister dbl_scratch = double_scratch();
|
| - DoubleRegister dbl_scratch2 = ToDoubleRegister(instr->temp2());
|
| + DoubleRegister dbl_scratch2 = ToDoubleRegister(instr->temp1());
|
| __ Ldr(dbl_scratch, FieldMemOperand(input, HeapNumber::kValueOffset));
|
| __ ClampDoubleToUint8(result, dbl_scratch, dbl_scratch2);
|
|
|
| @@ -2460,8 +2464,7 @@ void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) {
|
| instr->TrueLabel(chunk()));
|
| } else {
|
| Register value = ToRegister(instr->value());
|
| - __ CheckMap(value, scratch, Heap::kHeapNumberMapRootIndex,
|
| - instr->FalseLabel(chunk()), DO_SMI_CHECK);
|
| + __ JumpIfNotHeapNumber(value, instr->FalseLabel(chunk()), DO_SMI_CHECK);
|
| __ Ldr(scratch, FieldMemOperand(value, HeapNumber::kValueOffset));
|
| __ JumpIfMinusZero(scratch, instr->TrueLabel(chunk()));
|
| }
|
| @@ -3757,8 +3760,7 @@ void LCodeGen::DoDeferredMathAbsTagged(LMathAbsTagged* instr,
|
| Label runtime_allocation;
|
|
|
| // Deoptimize if the input is not a HeapNumber.
|
| - __ Ldr(temp1, FieldMemOperand(input, HeapObject::kMapOffset));
|
| - DeoptimizeIfNotRoot(temp1, Heap::kHeapNumberMapRootIndex, instr);
|
| + DeoptimizeIfNotHeapNumber(input, instr);
|
|
|
| // If the argument is positive, we can return it as-is, without any need to
|
| // allocate a new HeapNumber for the result. We have to do this in integer
|
| @@ -4092,9 +4094,7 @@ void LCodeGen::DoPower(LPower* instr) {
|
| } else if (exponent_type.IsTagged()) {
|
| Label no_deopt;
|
| __ JumpIfSmi(tagged_exponent, &no_deopt);
|
| - DCHECK(!x0.is(tagged_exponent));
|
| - __ Ldr(x0, FieldMemOperand(tagged_exponent, HeapObject::kMapOffset));
|
| - DeoptimizeIfNotRoot(x0, Heap::kHeapNumberMapRootIndex, instr);
|
| + DeoptimizeIfNotHeapNumber(tagged_exponent, instr);
|
| __ Bind(&no_deopt);
|
| MathPowStub stub(isolate(), MathPowStub::TAGGED);
|
| __ CallStub(&stub);
|
| @@ -4661,12 +4661,10 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
|
| Label convert_undefined;
|
|
|
| // Heap number map check.
|
| - __ Ldr(scratch, FieldMemOperand(input, HeapObject::kMapOffset));
|
| if (can_convert_undefined_to_nan) {
|
| - __ JumpIfNotRoot(scratch, Heap::kHeapNumberMapRootIndex,
|
| - &convert_undefined);
|
| + __ JumpIfNotHeapNumber(input, &convert_undefined);
|
| } else {
|
| - DeoptimizeIfNotRoot(scratch, Heap::kHeapNumberMapRootIndex, instr);
|
| + DeoptimizeIfNotHeapNumber(input, instr);
|
| }
|
|
|
| // Load heap number.
|
| @@ -5596,15 +5594,12 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr,
|
|
|
| Label done;
|
|
|
| - // Load heap object map.
|
| - __ Ldr(scratch1, FieldMemOperand(input, HeapObject::kMapOffset));
|
| -
|
| if (instr->truncating()) {
|
| Register output = ToRegister(instr->result());
|
| Label check_bools;
|
|
|
| // If it's not a heap number, jump to undefined check.
|
| - __ JumpIfNotRoot(scratch1, Heap::kHeapNumberMapRootIndex, &check_bools);
|
| + __ JumpIfNotHeapNumber(input, &check_bools);
|
|
|
| // A heap number: load value and convert to int32 using truncating function.
|
| __ TruncateHeapNumberToI(output, input);
|
| @@ -5628,7 +5623,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr,
|
| DoubleRegister dbl_scratch2 = ToDoubleRegister(temp2);
|
|
|
| __ RecordComment("Deferred TaggedToI: not a heap number");
|
| - DeoptimizeIfNotRoot(scratch1, Heap::kHeapNumberMapRootIndex, instr);
|
| + DeoptimizeIfNotHeapNumber(input, instr);
|
|
|
| // A heap number: load value and convert to int32 using non-truncating
|
| // function. If the result is out of range, branch to deoptimize.
|
| @@ -5813,13 +5808,22 @@ void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) {
|
|
|
| Factory* factory = isolate()->factory();
|
| if (String::Equals(type_name, factory->number_string())) {
|
| - DCHECK(instr->temp1() != NULL);
|
| - Register map = ToRegister(instr->temp1());
|
| -
|
| __ JumpIfSmi(value, true_label);
|
| - __ Ldr(map, FieldMemOperand(value, HeapObject::kMapOffset));
|
| - __ CompareRoot(map, Heap::kHeapNumberMapRootIndex);
|
| - EmitBranch(instr, eq);
|
| +
|
| + int true_block = instr->TrueDestination(chunk_);
|
| + int false_block = instr->FalseDestination(chunk_);
|
| + int next_block = GetNextEmittedBlock();
|
| +
|
| + if (true_block == false_block) {
|
| + EmitGoto(true_block);
|
| + } else if (true_block == next_block) {
|
| + __ JumpIfNotHeapNumber(value, chunk_->GetAssemblyLabel(false_block));
|
| + } else {
|
| + __ JumpIfHeapNumber(value, chunk_->GetAssemblyLabel(true_block));
|
| + if (false_block != next_block) {
|
| + __ B(chunk_->GetAssemblyLabel(false_block));
|
| + }
|
| + }
|
|
|
| } else if (String::Equals(type_name, factory->string_string())) {
|
| DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL));
|
|
|