| 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 3436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3447 scratch = ToRegister(instr->temp()); | 3447 scratch = ToRegister(instr->temp()); |
| 3448 key = ToRegister(instr->key()); | 3448 key = ToRegister(instr->key()); |
| 3449 } | 3449 } |
| 3450 | 3450 |
| 3451 MemOperand mem_op = | 3451 MemOperand mem_op = |
| 3452 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 3452 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 3453 key_is_constant, constant_key, | 3453 key_is_constant, constant_key, |
| 3454 elements_kind, | 3454 elements_kind, |
| 3455 instr->base_offset()); | 3455 instr->base_offset()); |
| 3456 | 3456 |
| 3457 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || | 3457 if (elements_kind == FLOAT32_ELEMENTS) { |
| 3458 (elements_kind == FLOAT32_ELEMENTS)) { | |
| 3459 DoubleRegister result = ToDoubleRegister(instr->result()); | 3458 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3460 __ Ldr(result.S(), mem_op); | 3459 __ Ldr(result.S(), mem_op); |
| 3461 __ Fcvt(result, result.S()); | 3460 __ Fcvt(result, result.S()); |
| 3462 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || | 3461 } else if (elements_kind == FLOAT64_ELEMENTS) { |
| 3463 (elements_kind == FLOAT64_ELEMENTS)) { | |
| 3464 DoubleRegister result = ToDoubleRegister(instr->result()); | 3462 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3465 __ Ldr(result, mem_op); | 3463 __ Ldr(result, mem_op); |
| 3466 } else { | 3464 } else { |
| 3467 Register result = ToRegister(instr->result()); | 3465 Register result = ToRegister(instr->result()); |
| 3468 | 3466 |
| 3469 switch (elements_kind) { | 3467 switch (elements_kind) { |
| 3470 case EXTERNAL_INT8_ELEMENTS: | |
| 3471 case INT8_ELEMENTS: | 3468 case INT8_ELEMENTS: |
| 3472 __ Ldrsb(result, mem_op); | 3469 __ Ldrsb(result, mem_op); |
| 3473 break; | 3470 break; |
| 3474 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 3475 case EXTERNAL_UINT8_ELEMENTS: | |
| 3476 case UINT8_ELEMENTS: | 3471 case UINT8_ELEMENTS: |
| 3477 case UINT8_CLAMPED_ELEMENTS: | 3472 case UINT8_CLAMPED_ELEMENTS: |
| 3478 __ Ldrb(result, mem_op); | 3473 __ Ldrb(result, mem_op); |
| 3479 break; | 3474 break; |
| 3480 case EXTERNAL_INT16_ELEMENTS: | |
| 3481 case INT16_ELEMENTS: | 3475 case INT16_ELEMENTS: |
| 3482 __ Ldrsh(result, mem_op); | 3476 __ Ldrsh(result, mem_op); |
| 3483 break; | 3477 break; |
| 3484 case EXTERNAL_UINT16_ELEMENTS: | |
| 3485 case UINT16_ELEMENTS: | 3478 case UINT16_ELEMENTS: |
| 3486 __ Ldrh(result, mem_op); | 3479 __ Ldrh(result, mem_op); |
| 3487 break; | 3480 break; |
| 3488 case EXTERNAL_INT32_ELEMENTS: | |
| 3489 case INT32_ELEMENTS: | 3481 case INT32_ELEMENTS: |
| 3490 __ Ldrsw(result, mem_op); | 3482 __ Ldrsw(result, mem_op); |
| 3491 break; | 3483 break; |
| 3492 case EXTERNAL_UINT32_ELEMENTS: | |
| 3493 case UINT32_ELEMENTS: | 3484 case UINT32_ELEMENTS: |
| 3494 __ Ldr(result.W(), mem_op); | 3485 __ Ldr(result.W(), mem_op); |
| 3495 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3486 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
| 3496 // Deopt if value > 0x80000000. | 3487 // Deopt if value > 0x80000000. |
| 3497 __ Tst(result, 0xFFFFFFFF80000000); | 3488 __ Tst(result, 0xFFFFFFFF80000000); |
| 3498 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); | 3489 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); |
| 3499 } | 3490 } |
| 3500 break; | 3491 break; |
| 3501 case FLOAT32_ELEMENTS: | 3492 case FLOAT32_ELEMENTS: |
| 3502 case FLOAT64_ELEMENTS: | 3493 case FLOAT64_ELEMENTS: |
| 3503 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 3504 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 3505 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3494 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 3506 case FAST_HOLEY_ELEMENTS: | 3495 case FAST_HOLEY_ELEMENTS: |
| 3507 case FAST_HOLEY_SMI_ELEMENTS: | 3496 case FAST_HOLEY_SMI_ELEMENTS: |
| 3508 case FAST_DOUBLE_ELEMENTS: | 3497 case FAST_DOUBLE_ELEMENTS: |
| 3509 case FAST_ELEMENTS: | 3498 case FAST_ELEMENTS: |
| 3510 case FAST_SMI_ELEMENTS: | 3499 case FAST_SMI_ELEMENTS: |
| 3511 case DICTIONARY_ELEMENTS: | 3500 case DICTIONARY_ELEMENTS: |
| 3512 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3501 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3513 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3502 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3514 UNREACHABLE(); | 3503 UNREACHABLE(); |
| (...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5169 key = ToRegister(instr->key()); | 5158 key = ToRegister(instr->key()); |
| 5170 scratch = ToRegister(instr->temp()); | 5159 scratch = ToRegister(instr->temp()); |
| 5171 } | 5160 } |
| 5172 | 5161 |
| 5173 MemOperand dst = | 5162 MemOperand dst = |
| 5174 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 5163 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 5175 key_is_constant, constant_key, | 5164 key_is_constant, constant_key, |
| 5176 elements_kind, | 5165 elements_kind, |
| 5177 instr->base_offset()); | 5166 instr->base_offset()); |
| 5178 | 5167 |
| 5179 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || | 5168 if (elements_kind == FLOAT32_ELEMENTS) { |
| 5180 (elements_kind == FLOAT32_ELEMENTS)) { | |
| 5181 DoubleRegister value = ToDoubleRegister(instr->value()); | 5169 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5182 DoubleRegister dbl_scratch = double_scratch(); | 5170 DoubleRegister dbl_scratch = double_scratch(); |
| 5183 __ Fcvt(dbl_scratch.S(), value); | 5171 __ Fcvt(dbl_scratch.S(), value); |
| 5184 __ Str(dbl_scratch.S(), dst); | 5172 __ Str(dbl_scratch.S(), dst); |
| 5185 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || | 5173 } else if (elements_kind == FLOAT64_ELEMENTS) { |
| 5186 (elements_kind == FLOAT64_ELEMENTS)) { | |
| 5187 DoubleRegister value = ToDoubleRegister(instr->value()); | 5174 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5188 __ Str(value, dst); | 5175 __ Str(value, dst); |
| 5189 } else { | 5176 } else { |
| 5190 Register value = ToRegister(instr->value()); | 5177 Register value = ToRegister(instr->value()); |
| 5191 | 5178 |
| 5192 switch (elements_kind) { | 5179 switch (elements_kind) { |
| 5193 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 5194 case EXTERNAL_INT8_ELEMENTS: | |
| 5195 case EXTERNAL_UINT8_ELEMENTS: | |
| 5196 case UINT8_ELEMENTS: | 5180 case UINT8_ELEMENTS: |
| 5197 case UINT8_CLAMPED_ELEMENTS: | 5181 case UINT8_CLAMPED_ELEMENTS: |
| 5198 case INT8_ELEMENTS: | 5182 case INT8_ELEMENTS: |
| 5199 __ Strb(value, dst); | 5183 __ Strb(value, dst); |
| 5200 break; | 5184 break; |
| 5201 case EXTERNAL_INT16_ELEMENTS: | |
| 5202 case EXTERNAL_UINT16_ELEMENTS: | |
| 5203 case INT16_ELEMENTS: | 5185 case INT16_ELEMENTS: |
| 5204 case UINT16_ELEMENTS: | 5186 case UINT16_ELEMENTS: |
| 5205 __ Strh(value, dst); | 5187 __ Strh(value, dst); |
| 5206 break; | 5188 break; |
| 5207 case EXTERNAL_INT32_ELEMENTS: | |
| 5208 case EXTERNAL_UINT32_ELEMENTS: | |
| 5209 case INT32_ELEMENTS: | 5189 case INT32_ELEMENTS: |
| 5210 case UINT32_ELEMENTS: | 5190 case UINT32_ELEMENTS: |
| 5211 __ Str(value.W(), dst); | 5191 __ Str(value.W(), dst); |
| 5212 break; | 5192 break; |
| 5213 case FLOAT32_ELEMENTS: | 5193 case FLOAT32_ELEMENTS: |
| 5214 case FLOAT64_ELEMENTS: | 5194 case FLOAT64_ELEMENTS: |
| 5215 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 5216 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 5217 case FAST_DOUBLE_ELEMENTS: | 5195 case FAST_DOUBLE_ELEMENTS: |
| 5218 case FAST_ELEMENTS: | 5196 case FAST_ELEMENTS: |
| 5219 case FAST_SMI_ELEMENTS: | 5197 case FAST_SMI_ELEMENTS: |
| 5220 case FAST_HOLEY_DOUBLE_ELEMENTS: | 5198 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 5221 case FAST_HOLEY_ELEMENTS: | 5199 case FAST_HOLEY_ELEMENTS: |
| 5222 case FAST_HOLEY_SMI_ELEMENTS: | 5200 case FAST_HOLEY_SMI_ELEMENTS: |
| 5223 case DICTIONARY_ELEMENTS: | 5201 case DICTIONARY_ELEMENTS: |
| 5224 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 5202 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5225 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 5203 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5226 UNREACHABLE(); | 5204 UNREACHABLE(); |
| (...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6172 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6150 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6173 __ Push(scope_info); | 6151 __ Push(scope_info); |
| 6174 __ Push(ToRegister(instr->function())); | 6152 __ Push(ToRegister(instr->function())); |
| 6175 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6153 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6176 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6154 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6177 } | 6155 } |
| 6178 | 6156 |
| 6179 | 6157 |
| 6180 } // namespace internal | 6158 } // namespace internal |
| 6181 } // namespace v8 | 6159 } // namespace v8 |
| OLD | NEW |