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 |