| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 3908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3919 const QRegister result = locs()->out(0).fpu_reg(); | 3919 const QRegister result = locs()->out(0).fpu_reg(); |
| 3920 const DRegister dresult0 = EvenDRegisterOf(result); | 3920 const DRegister dresult0 = EvenDRegisterOf(result); |
| 3921 const DRegister dresult1 = OddDRegisterOf(result); | 3921 const DRegister dresult1 = OddDRegisterOf(result); |
| 3922 const SRegister sresult0 = EvenSRegisterOf(dresult0); | 3922 const SRegister sresult0 = EvenSRegisterOf(dresult0); |
| 3923 const SRegister sresult1 = OddSRegisterOf(dresult0); | 3923 const SRegister sresult1 = OddSRegisterOf(dresult0); |
| 3924 const SRegister sresult2 = EvenSRegisterOf(dresult1); | 3924 const SRegister sresult2 = EvenSRegisterOf(dresult1); |
| 3925 const SRegister sresult3 = OddSRegisterOf(dresult1); | 3925 const SRegister sresult3 = OddSRegisterOf(dresult1); |
| 3926 | 3926 |
| 3927 const DRegister dvalue0 = EvenDRegisterOf(value); | 3927 const DRegister dvalue0 = EvenDRegisterOf(value); |
| 3928 const DRegister dvalue1 = OddDRegisterOf(value); | 3928 const DRegister dvalue1 = OddDRegisterOf(value); |
| 3929 const SRegister svalue0 = EvenSRegisterOf(dvalue0); |
| 3930 const SRegister svalue1 = OddSRegisterOf(dvalue0); |
| 3931 const SRegister svalue2 = EvenSRegisterOf(dvalue1); |
| 3932 const SRegister svalue3 = OddSRegisterOf(dvalue1); |
| 3929 | 3933 |
| 3930 const DRegister dtemp0 = DTMP; | 3934 const DRegister dtemp0 = DTMP; |
| 3931 const DRegister dtemp1 = OddDRegisterOf(QTMP); | 3935 const DRegister dtemp1 = OddDRegisterOf(QTMP); |
| 3932 | 3936 |
| 3933 // For some cases the vdup instruction requires fewer | 3937 // For some cases the vdup instruction requires fewer |
| 3934 // instructions. For arbitrary shuffles, use vtbl. | 3938 // instructions. For arbitrary shuffles, use vtbl. |
| 3935 | 3939 |
| 3936 switch (op_kind()) { | 3940 switch (op_kind()) { |
| 3937 case MethodRecognizer::kFloat32x4ShuffleX: | 3941 case MethodRecognizer::kFloat32x4ShuffleX: |
| 3938 __ vdup(kWord, result, dvalue0, 0); | 3942 __ vcvtds(dresult0, svalue0); |
| 3939 __ vcvtds(dresult0, sresult0); | |
| 3940 break; | 3943 break; |
| 3941 case MethodRecognizer::kFloat32x4ShuffleY: | 3944 case MethodRecognizer::kFloat32x4ShuffleY: |
| 3942 __ vdup(kWord, result, dvalue0, 1); | 3945 __ vcvtds(dresult0, svalue1); |
| 3943 __ vcvtds(dresult0, sresult0); | |
| 3944 break; | 3946 break; |
| 3945 case MethodRecognizer::kFloat32x4ShuffleZ: | 3947 case MethodRecognizer::kFloat32x4ShuffleZ: |
| 3946 __ vdup(kWord, result, dvalue1, 0); | 3948 __ vcvtds(dresult0, svalue2); |
| 3947 __ vcvtds(dresult0, sresult0); | |
| 3948 break; | 3949 break; |
| 3949 case MethodRecognizer::kFloat32x4ShuffleW: | 3950 case MethodRecognizer::kFloat32x4ShuffleW: |
| 3950 __ vdup(kWord, result, dvalue1, 1); | 3951 __ vcvtds(dresult0, svalue3); |
| 3951 __ vcvtds(dresult0, sresult0); | |
| 3952 break; | 3952 break; |
| 3953 case MethodRecognizer::kInt32x4Shuffle: | 3953 case MethodRecognizer::kInt32x4Shuffle: |
| 3954 case MethodRecognizer::kFloat32x4Shuffle: | 3954 case MethodRecognizer::kFloat32x4Shuffle: |
| 3955 if (mask_ == 0x00) { | 3955 if (mask_ == 0x00) { |
| 3956 __ vdup(kWord, result, dvalue0, 0); | 3956 __ vdup(kWord, result, dvalue0, 0); |
| 3957 } else if (mask_ == 0x55) { | 3957 } else if (mask_ == 0x55) { |
| 3958 __ vdup(kWord, result, dvalue0, 1); | 3958 __ vdup(kWord, result, dvalue0, 1); |
| 3959 } else if (mask_ == 0xAA) { | 3959 } else if (mask_ == 0xAA) { |
| 3960 __ vdup(kWord, result, dvalue1, 0); | 3960 __ vdup(kWord, result, dvalue1, 0); |
| 3961 } else if (mask_ == 0xFF) { | 3961 } else if (mask_ == 0xFF) { |
| (...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4938 summary->set_out(0, Location::RequiresFpuRegister()); | 4938 summary->set_out(0, Location::RequiresFpuRegister()); |
| 4939 return summary; | 4939 return summary; |
| 4940 } | 4940 } |
| 4941 | 4941 |
| 4942 | 4942 |
| 4943 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4943 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 4944 const QRegister left = locs()->in(0).fpu_reg(); | 4944 const QRegister left = locs()->in(0).fpu_reg(); |
| 4945 const QRegister right = locs()->in(1).fpu_reg(); | 4945 const QRegister right = locs()->in(1).fpu_reg(); |
| 4946 const QRegister result = locs()->out(0).fpu_reg(); | 4946 const QRegister result = locs()->out(0).fpu_reg(); |
| 4947 switch (op_kind()) { | 4947 switch (op_kind()) { |
| 4948 case Token::kBIT_AND: { | 4948 case Token::kBIT_AND: __ vandq(result, left, right); break; |
| 4949 __ vandq(result, left, right); | 4949 case Token::kBIT_OR: __ vorrq(result, left, right); break; |
| 4950 break; | 4950 case Token::kBIT_XOR: __ veorq(result, left, right); break; |
| 4951 } | 4951 case Token::kADD: __ vaddqi(kWord, result, left, right); break; |
| 4952 case Token::kBIT_OR: { | 4952 case Token::kSUB: __ vsubqi(kWord, result, left, right); break; |
| 4953 __ vorrq(result, left, right); | |
| 4954 break; | |
| 4955 } | |
| 4956 case Token::kBIT_XOR: { | |
| 4957 __ veorq(result, left, right); | |
| 4958 break; | |
| 4959 } | |
| 4960 case Token::kADD: | |
| 4961 __ vaddqi(kWord, result, left, right); | |
| 4962 break; | |
| 4963 case Token::kSUB: | |
| 4964 __ vsubqi(kWord, result, left, right); | |
| 4965 break; | |
| 4966 default: UNREACHABLE(); | 4953 default: UNREACHABLE(); |
| 4967 } | 4954 } |
| 4968 } | 4955 } |
| 4969 | 4956 |
| 4970 | 4957 |
| 4971 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, | 4958 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, |
| 4972 bool opt) const { | 4959 bool opt) const { |
| 4973 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { | 4960 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { |
| 4974 const intptr_t kNumInputs = 1; | 4961 const intptr_t kNumInputs = 1; |
| 4975 const intptr_t kNumTemps = 0; | 4962 const intptr_t kNumTemps = 0; |
| (...skipping 1462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6438 compiler->GenerateCall(token_pos(), | 6425 compiler->GenerateCall(token_pos(), |
| 6439 &label, | 6426 &label, |
| 6440 PcDescriptors::kOther, | 6427 PcDescriptors::kOther, |
| 6441 locs()); | 6428 locs()); |
| 6442 __ Drop(ArgumentCount()); // Discard arguments. | 6429 __ Drop(ArgumentCount()); // Discard arguments. |
| 6443 } | 6430 } |
| 6444 | 6431 |
| 6445 } // namespace dart | 6432 } // namespace dart |
| 6446 | 6433 |
| 6447 #endif // defined TARGET_ARCH_ARM | 6434 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |