| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
| 8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 3440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3451 scratch = ToRegister(instr->temp()); | 3451 scratch = ToRegister(instr->temp()); |
| 3452 key = ToRegister(instr->key()); | 3452 key = ToRegister(instr->key()); |
| 3453 } | 3453 } |
| 3454 | 3454 |
| 3455 MemOperand mem_op = | 3455 MemOperand mem_op = |
| 3456 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 3456 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 3457 key_is_constant, constant_key, | 3457 key_is_constant, constant_key, |
| 3458 elements_kind, | 3458 elements_kind, |
| 3459 instr->base_offset()); | 3459 instr->base_offset()); |
| 3460 | 3460 |
| 3461 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || | 3461 if (elements_kind == FLOAT32_ELEMENTS) { |
| 3462 (elements_kind == FLOAT32_ELEMENTS)) { | |
| 3463 DoubleRegister result = ToDoubleRegister(instr->result()); | 3462 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3464 __ Ldr(result.S(), mem_op); | 3463 __ Ldr(result.S(), mem_op); |
| 3465 __ Fcvt(result, result.S()); | 3464 __ Fcvt(result, result.S()); |
| 3466 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || | 3465 } else if (elements_kind == FLOAT64_ELEMENTS) { |
| 3467 (elements_kind == FLOAT64_ELEMENTS)) { | |
| 3468 DoubleRegister result = ToDoubleRegister(instr->result()); | 3466 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3469 __ Ldr(result, mem_op); | 3467 __ Ldr(result, mem_op); |
| 3470 } else { | 3468 } else { |
| 3471 Register result = ToRegister(instr->result()); | 3469 Register result = ToRegister(instr->result()); |
| 3472 | 3470 |
| 3473 switch (elements_kind) { | 3471 switch (elements_kind) { |
| 3474 case EXTERNAL_INT8_ELEMENTS: | |
| 3475 case INT8_ELEMENTS: | 3472 case INT8_ELEMENTS: |
| 3476 __ Ldrsb(result, mem_op); | 3473 __ Ldrsb(result, mem_op); |
| 3477 break; | 3474 break; |
| 3478 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 3479 case EXTERNAL_UINT8_ELEMENTS: | |
| 3480 case UINT8_ELEMENTS: | 3475 case UINT8_ELEMENTS: |
| 3481 case UINT8_CLAMPED_ELEMENTS: | 3476 case UINT8_CLAMPED_ELEMENTS: |
| 3482 __ Ldrb(result, mem_op); | 3477 __ Ldrb(result, mem_op); |
| 3483 break; | 3478 break; |
| 3484 case EXTERNAL_INT16_ELEMENTS: | |
| 3485 case INT16_ELEMENTS: | 3479 case INT16_ELEMENTS: |
| 3486 __ Ldrsh(result, mem_op); | 3480 __ Ldrsh(result, mem_op); |
| 3487 break; | 3481 break; |
| 3488 case EXTERNAL_UINT16_ELEMENTS: | |
| 3489 case UINT16_ELEMENTS: | 3482 case UINT16_ELEMENTS: |
| 3490 __ Ldrh(result, mem_op); | 3483 __ Ldrh(result, mem_op); |
| 3491 break; | 3484 break; |
| 3492 case EXTERNAL_INT32_ELEMENTS: | |
| 3493 case INT32_ELEMENTS: | 3485 case INT32_ELEMENTS: |
| 3494 __ Ldrsw(result, mem_op); | 3486 __ Ldrsw(result, mem_op); |
| 3495 break; | 3487 break; |
| 3496 case EXTERNAL_UINT32_ELEMENTS: | |
| 3497 case UINT32_ELEMENTS: | 3488 case UINT32_ELEMENTS: |
| 3498 __ Ldr(result.W(), mem_op); | 3489 __ Ldr(result.W(), mem_op); |
| 3499 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3490 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
| 3500 // Deopt if value > 0x80000000. | 3491 // Deopt if value > 0x80000000. |
| 3501 __ Tst(result, 0xFFFFFFFF80000000); | 3492 __ Tst(result, 0xFFFFFFFF80000000); |
| 3502 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); | 3493 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); |
| 3503 } | 3494 } |
| 3504 break; | 3495 break; |
| 3505 case FLOAT32_ELEMENTS: | 3496 case FLOAT32_ELEMENTS: |
| 3506 case FLOAT64_ELEMENTS: | 3497 case FLOAT64_ELEMENTS: |
| 3507 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 3508 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 3509 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3498 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 3510 case FAST_HOLEY_ELEMENTS: | 3499 case FAST_HOLEY_ELEMENTS: |
| 3511 case FAST_HOLEY_SMI_ELEMENTS: | 3500 case FAST_HOLEY_SMI_ELEMENTS: |
| 3512 case FAST_DOUBLE_ELEMENTS: | 3501 case FAST_DOUBLE_ELEMENTS: |
| 3513 case FAST_ELEMENTS: | 3502 case FAST_ELEMENTS: |
| 3514 case FAST_SMI_ELEMENTS: | 3503 case FAST_SMI_ELEMENTS: |
| 3515 case DICTIONARY_ELEMENTS: | 3504 case DICTIONARY_ELEMENTS: |
| 3516 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3505 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3517 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3506 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3518 UNREACHABLE(); | 3507 UNREACHABLE(); |
| (...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5173 key = ToRegister(instr->key()); | 5162 key = ToRegister(instr->key()); |
| 5174 scratch = ToRegister(instr->temp()); | 5163 scratch = ToRegister(instr->temp()); |
| 5175 } | 5164 } |
| 5176 | 5165 |
| 5177 MemOperand dst = | 5166 MemOperand dst = |
| 5178 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 5167 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 5179 key_is_constant, constant_key, | 5168 key_is_constant, constant_key, |
| 5180 elements_kind, | 5169 elements_kind, |
| 5181 instr->base_offset()); | 5170 instr->base_offset()); |
| 5182 | 5171 |
| 5183 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || | 5172 if (elements_kind == FLOAT32_ELEMENTS) { |
| 5184 (elements_kind == FLOAT32_ELEMENTS)) { | |
| 5185 DoubleRegister value = ToDoubleRegister(instr->value()); | 5173 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5186 DoubleRegister dbl_scratch = double_scratch(); | 5174 DoubleRegister dbl_scratch = double_scratch(); |
| 5187 __ Fcvt(dbl_scratch.S(), value); | 5175 __ Fcvt(dbl_scratch.S(), value); |
| 5188 __ Str(dbl_scratch.S(), dst); | 5176 __ Str(dbl_scratch.S(), dst); |
| 5189 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || | 5177 } else if (elements_kind == FLOAT64_ELEMENTS) { |
| 5190 (elements_kind == FLOAT64_ELEMENTS)) { | |
| 5191 DoubleRegister value = ToDoubleRegister(instr->value()); | 5178 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5192 __ Str(value, dst); | 5179 __ Str(value, dst); |
| 5193 } else { | 5180 } else { |
| 5194 Register value = ToRegister(instr->value()); | 5181 Register value = ToRegister(instr->value()); |
| 5195 | 5182 |
| 5196 switch (elements_kind) { | 5183 switch (elements_kind) { |
| 5197 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 5198 case EXTERNAL_INT8_ELEMENTS: | |
| 5199 case EXTERNAL_UINT8_ELEMENTS: | |
| 5200 case UINT8_ELEMENTS: | 5184 case UINT8_ELEMENTS: |
| 5201 case UINT8_CLAMPED_ELEMENTS: | 5185 case UINT8_CLAMPED_ELEMENTS: |
| 5202 case INT8_ELEMENTS: | 5186 case INT8_ELEMENTS: |
| 5203 __ Strb(value, dst); | 5187 __ Strb(value, dst); |
| 5204 break; | 5188 break; |
| 5205 case EXTERNAL_INT16_ELEMENTS: | |
| 5206 case EXTERNAL_UINT16_ELEMENTS: | |
| 5207 case INT16_ELEMENTS: | 5189 case INT16_ELEMENTS: |
| 5208 case UINT16_ELEMENTS: | 5190 case UINT16_ELEMENTS: |
| 5209 __ Strh(value, dst); | 5191 __ Strh(value, dst); |
| 5210 break; | 5192 break; |
| 5211 case EXTERNAL_INT32_ELEMENTS: | |
| 5212 case EXTERNAL_UINT32_ELEMENTS: | |
| 5213 case INT32_ELEMENTS: | 5193 case INT32_ELEMENTS: |
| 5214 case UINT32_ELEMENTS: | 5194 case UINT32_ELEMENTS: |
| 5215 __ Str(value.W(), dst); | 5195 __ Str(value.W(), dst); |
| 5216 break; | 5196 break; |
| 5217 case FLOAT32_ELEMENTS: | 5197 case FLOAT32_ELEMENTS: |
| 5218 case FLOAT64_ELEMENTS: | 5198 case FLOAT64_ELEMENTS: |
| 5219 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 5220 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 5221 case FAST_DOUBLE_ELEMENTS: | 5199 case FAST_DOUBLE_ELEMENTS: |
| 5222 case FAST_ELEMENTS: | 5200 case FAST_ELEMENTS: |
| 5223 case FAST_SMI_ELEMENTS: | 5201 case FAST_SMI_ELEMENTS: |
| 5224 case FAST_HOLEY_DOUBLE_ELEMENTS: | 5202 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 5225 case FAST_HOLEY_ELEMENTS: | 5203 case FAST_HOLEY_ELEMENTS: |
| 5226 case FAST_HOLEY_SMI_ELEMENTS: | 5204 case FAST_HOLEY_SMI_ELEMENTS: |
| 5227 case DICTIONARY_ELEMENTS: | 5205 case DICTIONARY_ELEMENTS: |
| 5228 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 5206 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5229 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 5207 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5230 UNREACHABLE(); | 5208 UNREACHABLE(); |
| (...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6184 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6162 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6185 __ Push(scope_info); | 6163 __ Push(scope_info); |
| 6186 __ Push(ToRegister(instr->function())); | 6164 __ Push(ToRegister(instr->function())); |
| 6187 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6165 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6188 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6166 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6189 } | 6167 } |
| 6190 | 6168 |
| 6191 | 6169 |
| 6192 } // namespace internal | 6170 } // namespace internal |
| 6193 } // namespace v8 | 6171 } // namespace v8 |
| OLD | NEW |