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