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 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
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 3095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3106 __ movsxlq(key_reg, key_reg); | 3106 __ movsxlq(key_reg, key_reg); |
3107 } | 3107 } |
3108 } | 3108 } |
3109 Operand operand(BuildFastArrayOperand( | 3109 Operand operand(BuildFastArrayOperand( |
3110 instr->elements(), | 3110 instr->elements(), |
3111 key, | 3111 key, |
3112 instr->hydrogen()->key()->representation(), | 3112 instr->hydrogen()->key()->representation(), |
3113 elements_kind, | 3113 elements_kind, |
3114 instr->base_offset())); | 3114 instr->base_offset())); |
3115 | 3115 |
3116 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3116 if (elements_kind == FLOAT32_ELEMENTS) { |
3117 elements_kind == FLOAT32_ELEMENTS) { | |
3118 XMMRegister result(ToDoubleRegister(instr->result())); | 3117 XMMRegister result(ToDoubleRegister(instr->result())); |
3119 __ movss(result, operand); | 3118 __ movss(result, operand); |
3120 __ cvtss2sd(result, result); | 3119 __ cvtss2sd(result, result); |
3121 } else if (elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | 3120 } else if (elements_kind == FLOAT64_ELEMENTS) { |
3122 elements_kind == FLOAT64_ELEMENTS) { | |
3123 __ movsd(ToDoubleRegister(instr->result()), operand); | 3121 __ movsd(ToDoubleRegister(instr->result()), operand); |
3124 } else { | 3122 } else { |
3125 Register result(ToRegister(instr->result())); | 3123 Register result(ToRegister(instr->result())); |
3126 switch (elements_kind) { | 3124 switch (elements_kind) { |
3127 case EXTERNAL_INT8_ELEMENTS: | |
3128 case INT8_ELEMENTS: | 3125 case INT8_ELEMENTS: |
3129 __ movsxbl(result, operand); | 3126 __ movsxbl(result, operand); |
3130 break; | 3127 break; |
3131 case EXTERNAL_UINT8_ELEMENTS: | |
3132 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
3133 case UINT8_ELEMENTS: | 3128 case UINT8_ELEMENTS: |
3134 case UINT8_CLAMPED_ELEMENTS: | 3129 case UINT8_CLAMPED_ELEMENTS: |
3135 __ movzxbl(result, operand); | 3130 __ movzxbl(result, operand); |
3136 break; | 3131 break; |
3137 case EXTERNAL_INT16_ELEMENTS: | |
3138 case INT16_ELEMENTS: | 3132 case INT16_ELEMENTS: |
3139 __ movsxwl(result, operand); | 3133 __ movsxwl(result, operand); |
3140 break; | 3134 break; |
3141 case EXTERNAL_UINT16_ELEMENTS: | |
3142 case UINT16_ELEMENTS: | 3135 case UINT16_ELEMENTS: |
3143 __ movzxwl(result, operand); | 3136 __ movzxwl(result, operand); |
3144 break; | 3137 break; |
3145 case EXTERNAL_INT32_ELEMENTS: | |
3146 case INT32_ELEMENTS: | 3138 case INT32_ELEMENTS: |
3147 __ movl(result, operand); | 3139 __ movl(result, operand); |
3148 break; | 3140 break; |
3149 case EXTERNAL_UINT32_ELEMENTS: | |
3150 case UINT32_ELEMENTS: | 3141 case UINT32_ELEMENTS: |
3151 __ movl(result, operand); | 3142 __ movl(result, operand); |
3152 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3143 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
3153 __ testl(result, result); | 3144 __ testl(result, result); |
3154 DeoptimizeIf(negative, instr, Deoptimizer::kNegativeValue); | 3145 DeoptimizeIf(negative, instr, Deoptimizer::kNegativeValue); |
3155 } | 3146 } |
3156 break; | 3147 break; |
3157 case EXTERNAL_FLOAT32_ELEMENTS: | |
3158 case EXTERNAL_FLOAT64_ELEMENTS: | |
3159 case FLOAT32_ELEMENTS: | 3148 case FLOAT32_ELEMENTS: |
3160 case FLOAT64_ELEMENTS: | 3149 case FLOAT64_ELEMENTS: |
3161 case FAST_ELEMENTS: | 3150 case FAST_ELEMENTS: |
3162 case FAST_SMI_ELEMENTS: | 3151 case FAST_SMI_ELEMENTS: |
3163 case FAST_DOUBLE_ELEMENTS: | 3152 case FAST_DOUBLE_ELEMENTS: |
3164 case FAST_HOLEY_ELEMENTS: | 3153 case FAST_HOLEY_ELEMENTS: |
3165 case FAST_HOLEY_SMI_ELEMENTS: | 3154 case FAST_HOLEY_SMI_ELEMENTS: |
3166 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3155 case FAST_HOLEY_DOUBLE_ELEMENTS: |
3167 case DICTIONARY_ELEMENTS: | 3156 case DICTIONARY_ELEMENTS: |
3168 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3157 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3267 Smi::FromInt(Isolate::kArrayProtectorValid)); | 3256 Smi::FromInt(Isolate::kArrayProtectorValid)); |
3268 DeoptimizeIf(not_equal, instr, Deoptimizer::kHole); | 3257 DeoptimizeIf(not_equal, instr, Deoptimizer::kHole); |
3269 } | 3258 } |
3270 __ Move(result, isolate()->factory()->undefined_value()); | 3259 __ Move(result, isolate()->factory()->undefined_value()); |
3271 __ bind(&done); | 3260 __ bind(&done); |
3272 } | 3261 } |
3273 } | 3262 } |
3274 | 3263 |
3275 | 3264 |
3276 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { | 3265 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { |
3277 if (instr->is_typed_elements()) { | 3266 if (instr->is_fixed_typed_array()) { |
3278 DoLoadKeyedExternalArray(instr); | 3267 DoLoadKeyedExternalArray(instr); |
3279 } else if (instr->hydrogen()->representation().IsDouble()) { | 3268 } else if (instr->hydrogen()->representation().IsDouble()) { |
3280 DoLoadKeyedFixedDoubleArray(instr); | 3269 DoLoadKeyedFixedDoubleArray(instr); |
3281 } else { | 3270 } else { |
3282 DoLoadKeyedFixedArray(instr); | 3271 DoLoadKeyedFixedArray(instr); |
3283 } | 3272 } |
3284 } | 3273 } |
3285 | 3274 |
3286 | 3275 |
3287 Operand LCodeGen::BuildFastArrayOperand( | 3276 Operand LCodeGen::BuildFastArrayOperand( |
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4362 __ movsxlq(key_reg, key_reg); | 4351 __ movsxlq(key_reg, key_reg); |
4363 } | 4352 } |
4364 } | 4353 } |
4365 Operand operand(BuildFastArrayOperand( | 4354 Operand operand(BuildFastArrayOperand( |
4366 instr->elements(), | 4355 instr->elements(), |
4367 key, | 4356 key, |
4368 instr->hydrogen()->key()->representation(), | 4357 instr->hydrogen()->key()->representation(), |
4369 elements_kind, | 4358 elements_kind, |
4370 instr->base_offset())); | 4359 instr->base_offset())); |
4371 | 4360 |
4372 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4361 if (elements_kind == FLOAT32_ELEMENTS) { |
4373 elements_kind == FLOAT32_ELEMENTS) { | |
4374 XMMRegister value(ToDoubleRegister(instr->value())); | 4362 XMMRegister value(ToDoubleRegister(instr->value())); |
4375 __ cvtsd2ss(value, value); | 4363 __ cvtsd2ss(value, value); |
4376 __ movss(operand, value); | 4364 __ movss(operand, value); |
4377 } else if (elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | 4365 } else if (elements_kind == FLOAT64_ELEMENTS) { |
4378 elements_kind == FLOAT64_ELEMENTS) { | |
4379 __ movsd(operand, ToDoubleRegister(instr->value())); | 4366 __ movsd(operand, ToDoubleRegister(instr->value())); |
4380 } else { | 4367 } else { |
4381 Register value(ToRegister(instr->value())); | 4368 Register value(ToRegister(instr->value())); |
4382 switch (elements_kind) { | 4369 switch (elements_kind) { |
4383 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
4384 case EXTERNAL_INT8_ELEMENTS: | |
4385 case EXTERNAL_UINT8_ELEMENTS: | |
4386 case INT8_ELEMENTS: | 4370 case INT8_ELEMENTS: |
4387 case UINT8_ELEMENTS: | 4371 case UINT8_ELEMENTS: |
4388 case UINT8_CLAMPED_ELEMENTS: | 4372 case UINT8_CLAMPED_ELEMENTS: |
4389 __ movb(operand, value); | 4373 __ movb(operand, value); |
4390 break; | 4374 break; |
4391 case EXTERNAL_INT16_ELEMENTS: | |
4392 case EXTERNAL_UINT16_ELEMENTS: | |
4393 case INT16_ELEMENTS: | 4375 case INT16_ELEMENTS: |
4394 case UINT16_ELEMENTS: | 4376 case UINT16_ELEMENTS: |
4395 __ movw(operand, value); | 4377 __ movw(operand, value); |
4396 break; | 4378 break; |
4397 case EXTERNAL_INT32_ELEMENTS: | |
4398 case EXTERNAL_UINT32_ELEMENTS: | |
4399 case INT32_ELEMENTS: | 4379 case INT32_ELEMENTS: |
4400 case UINT32_ELEMENTS: | 4380 case UINT32_ELEMENTS: |
4401 __ movl(operand, value); | 4381 __ movl(operand, value); |
4402 break; | 4382 break; |
4403 case EXTERNAL_FLOAT32_ELEMENTS: | |
4404 case EXTERNAL_FLOAT64_ELEMENTS: | |
4405 case FLOAT32_ELEMENTS: | 4383 case FLOAT32_ELEMENTS: |
4406 case FLOAT64_ELEMENTS: | 4384 case FLOAT64_ELEMENTS: |
4407 case FAST_ELEMENTS: | 4385 case FAST_ELEMENTS: |
4408 case FAST_SMI_ELEMENTS: | 4386 case FAST_SMI_ELEMENTS: |
4409 case FAST_DOUBLE_ELEMENTS: | 4387 case FAST_DOUBLE_ELEMENTS: |
4410 case FAST_HOLEY_ELEMENTS: | 4388 case FAST_HOLEY_ELEMENTS: |
4411 case FAST_HOLEY_SMI_ELEMENTS: | 4389 case FAST_HOLEY_SMI_ELEMENTS: |
4412 case FAST_HOLEY_DOUBLE_ELEMENTS: | 4390 case FAST_HOLEY_DOUBLE_ELEMENTS: |
4413 case DICTIONARY_ELEMENTS: | 4391 case DICTIONARY_ELEMENTS: |
4414 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 4392 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4518 value, | 4496 value, |
4519 kSaveFPRegs, | 4497 kSaveFPRegs, |
4520 EMIT_REMEMBERED_SET, | 4498 EMIT_REMEMBERED_SET, |
4521 check_needed, | 4499 check_needed, |
4522 hinstr->PointersToHereCheckForValue()); | 4500 hinstr->PointersToHereCheckForValue()); |
4523 } | 4501 } |
4524 } | 4502 } |
4525 | 4503 |
4526 | 4504 |
4527 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4505 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
4528 if (instr->is_typed_elements()) { | 4506 if (instr->is_fixed_typed_array()) { |
4529 DoStoreKeyedExternalArray(instr); | 4507 DoStoreKeyedExternalArray(instr); |
4530 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4508 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
4531 DoStoreKeyedFixedDoubleArray(instr); | 4509 DoStoreKeyedFixedDoubleArray(instr); |
4532 } else { | 4510 } else { |
4533 DoStoreKeyedFixedArray(instr); | 4511 DoStoreKeyedFixedArray(instr); |
4534 } | 4512 } |
4535 } | 4513 } |
4536 | 4514 |
4537 | 4515 |
4538 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4516 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
(...skipping 1524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6063 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6041 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6064 } | 6042 } |
6065 | 6043 |
6066 | 6044 |
6067 #undef __ | 6045 #undef __ |
6068 | 6046 |
6069 } // namespace internal | 6047 } // namespace internal |
6070 } // namespace v8 | 6048 } // namespace v8 |
6071 | 6049 |
6072 #endif // V8_TARGET_ARCH_X64 | 6050 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |