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 |