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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 3386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3397 switch (op_kind()) { | 3397 switch (op_kind()) { |
3398 case Token::kADD: __ addps(left, right); break; | 3398 case Token::kADD: __ addps(left, right); break; |
3399 case Token::kSUB: __ subps(left, right); break; | 3399 case Token::kSUB: __ subps(left, right); break; |
3400 case Token::kMUL: __ mulps(left, right); break; | 3400 case Token::kMUL: __ mulps(left, right); break; |
3401 case Token::kDIV: __ divps(left, right); break; | 3401 case Token::kDIV: __ divps(left, right); break; |
3402 default: UNREACHABLE(); | 3402 default: UNREACHABLE(); |
3403 } | 3403 } |
3404 } | 3404 } |
3405 | 3405 |
3406 | 3406 |
| 3407 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const { |
| 3408 const intptr_t kNumInputs = 2; |
| 3409 const intptr_t kNumTemps = 0; |
| 3410 LocationSummary* summary = |
| 3411 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3412 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3413 summary->set_in(1, Location::RequiresFpuRegister()); |
| 3414 summary->set_out(Location::SameAsFirstInput()); |
| 3415 return summary; |
| 3416 } |
| 3417 |
| 3418 |
| 3419 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3420 XmmRegister left = locs()->in(0).fpu_reg(); |
| 3421 XmmRegister right = locs()->in(1).fpu_reg(); |
| 3422 |
| 3423 ASSERT(locs()->out().fpu_reg() == left); |
| 3424 |
| 3425 switch (op_kind()) { |
| 3426 case Token::kADD: __ addpd(left, right); break; |
| 3427 case Token::kSUB: __ subpd(left, right); break; |
| 3428 case Token::kMUL: __ mulpd(left, right); break; |
| 3429 case Token::kDIV: __ divpd(left, right); break; |
| 3430 default: UNREACHABLE(); |
| 3431 } |
| 3432 } |
| 3433 |
| 3434 |
3407 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { | 3435 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { |
3408 const intptr_t kNumInputs = 1; | 3436 const intptr_t kNumInputs = 1; |
3409 const intptr_t kNumTemps = 0; | 3437 const intptr_t kNumTemps = 0; |
3410 LocationSummary* summary = | 3438 LocationSummary* summary = |
3411 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3439 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3412 summary->set_in(0, Location::RequiresFpuRegister()); | 3440 summary->set_in(0, Location::RequiresFpuRegister()); |
3413 summary->set_out(Location::SameAsFirstInput()); | 3441 summary->set_out(Location::SameAsFirstInput()); |
3414 return summary; | 3442 return summary; |
3415 } | 3443 } |
3416 | 3444 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3828 summary->set_out(Location::SameAsFirstInput()); | 3856 summary->set_out(Location::SameAsFirstInput()); |
3829 return summary; | 3857 return summary; |
3830 } | 3858 } |
3831 | 3859 |
3832 | 3860 |
3833 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3861 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3834 // NOP. | 3862 // NOP. |
3835 } | 3863 } |
3836 | 3864 |
3837 | 3865 |
| 3866 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { |
| 3867 const intptr_t kNumInputs = 1; |
| 3868 const intptr_t kNumTemps = 0; |
| 3869 LocationSummary* summary = |
| 3870 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3871 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3872 summary->set_out(Location::SameAsFirstInput()); |
| 3873 return summary; |
| 3874 } |
| 3875 |
| 3876 |
| 3877 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3878 XmmRegister value = locs()->in(0).fpu_reg(); |
| 3879 |
| 3880 ASSERT(locs()->out().fpu_reg() == value); |
| 3881 |
| 3882 switch (op_kind()) { |
| 3883 case MethodRecognizer::kFloat64x2GetX: |
| 3884 __ shufpd(value, value, Immediate(0x00)); |
| 3885 break; |
| 3886 case MethodRecognizer::kFloat64x2GetY: |
| 3887 __ shufpd(value, value, Immediate(0x33)); |
| 3888 break; |
| 3889 default: UNREACHABLE(); |
| 3890 } |
| 3891 } |
| 3892 |
| 3893 |
| 3894 |
| 3895 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { |
| 3896 const intptr_t kNumInputs = 0; |
| 3897 const intptr_t kNumTemps = 0; |
| 3898 LocationSummary* summary = |
| 3899 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3900 summary->set_out(Location::RequiresFpuRegister()); |
| 3901 return summary; |
| 3902 } |
| 3903 |
| 3904 |
| 3905 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3906 XmmRegister value = locs()->out().fpu_reg(); |
| 3907 __ xorpd(value, value); |
| 3908 } |
| 3909 |
| 3910 |
| 3911 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { |
| 3912 const intptr_t kNumInputs = 1; |
| 3913 const intptr_t kNumTemps = 0; |
| 3914 LocationSummary* summary = |
| 3915 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3916 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3917 summary->set_out(Location::SameAsFirstInput()); |
| 3918 return summary; |
| 3919 } |
| 3920 |
| 3921 |
| 3922 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3923 XmmRegister value = locs()->out().fpu_reg(); |
| 3924 __ shufpd(value, value, Immediate(0x0)); |
| 3925 } |
| 3926 |
| 3927 |
| 3928 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( |
| 3929 bool opt) const { |
| 3930 const intptr_t kNumInputs = 2; |
| 3931 const intptr_t kNumTemps = 0; |
| 3932 LocationSummary* summary = |
| 3933 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3934 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3935 summary->set_in(1, Location::RequiresFpuRegister()); |
| 3936 summary->set_out(Location::SameAsFirstInput()); |
| 3937 return summary; |
| 3938 } |
| 3939 |
| 3940 |
| 3941 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3942 XmmRegister v0 = locs()->in(0).fpu_reg(); |
| 3943 XmmRegister v1 = locs()->in(1).fpu_reg(); |
| 3944 ASSERT(v0 == locs()->out().fpu_reg()); |
| 3945 __ subl(ESP, Immediate(16)); |
| 3946 __ movsd(Address(ESP, 0), v0); |
| 3947 __ movsd(Address(ESP, 8), v1); |
| 3948 __ movups(v0, Address(ESP, 0)); |
| 3949 __ addl(ESP, Immediate(16)); |
| 3950 } |
| 3951 |
| 3952 |
| 3953 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( |
| 3954 bool opt) const { |
| 3955 const intptr_t kNumInputs = 1; |
| 3956 const intptr_t kNumTemps = 0; |
| 3957 LocationSummary* summary = |
| 3958 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3959 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3960 summary->set_out(Location::SameAsFirstInput()); |
| 3961 return summary; |
| 3962 } |
| 3963 |
| 3964 |
| 3965 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3966 XmmRegister value = locs()->out().fpu_reg(); |
| 3967 __ cvtpd2ps(value, value); |
| 3968 } |
| 3969 |
| 3970 |
| 3971 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( |
| 3972 bool opt) const { |
| 3973 const intptr_t kNumInputs = 1; |
| 3974 const intptr_t kNumTemps = 0; |
| 3975 LocationSummary* summary = |
| 3976 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3977 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3978 summary->set_out(Location::SameAsFirstInput()); |
| 3979 return summary; |
| 3980 } |
| 3981 |
| 3982 |
| 3983 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3984 XmmRegister value = locs()->out().fpu_reg(); |
| 3985 __ cvtps2pd(value, value); |
| 3986 } |
| 3987 |
| 3988 |
3838 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( | 3989 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
3839 bool opt) const { | 3990 bool opt) const { |
3840 const intptr_t kNumInputs = 4; | 3991 const intptr_t kNumInputs = 4; |
3841 const intptr_t kNumTemps = 0; | 3992 const intptr_t kNumTemps = 0; |
3842 LocationSummary* summary = | 3993 LocationSummary* summary = |
3843 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3994 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3844 summary->set_in(0, Location::RequiresRegister()); | 3995 summary->set_in(0, Location::RequiresRegister()); |
3845 summary->set_in(1, Location::RequiresRegister()); | 3996 summary->set_in(1, Location::RequiresRegister()); |
3846 summary->set_in(2, Location::RequiresRegister()); | 3997 summary->set_in(2, Location::RequiresRegister()); |
3847 summary->set_in(3, Location::RequiresRegister()); | 3998 summary->set_in(3, Location::RequiresRegister()); |
(...skipping 1639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5487 PcDescriptors::kOther, | 5638 PcDescriptors::kOther, |
5488 locs()); | 5639 locs()); |
5489 __ Drop(ArgumentCount()); // Discard arguments. | 5640 __ Drop(ArgumentCount()); // Discard arguments. |
5490 } | 5641 } |
5491 | 5642 |
5492 } // namespace dart | 5643 } // namespace dart |
5493 | 5644 |
5494 #undef __ | 5645 #undef __ |
5495 | 5646 |
5496 #endif // defined TARGET_ARCH_IA32 | 5647 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |