| 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_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 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 3133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3144 switch (op_kind()) { | 3144 switch (op_kind()) { |
| 3145 case Token::kADD: __ addps(left, right); break; | 3145 case Token::kADD: __ addps(left, right); break; |
| 3146 case Token::kSUB: __ subps(left, right); break; | 3146 case Token::kSUB: __ subps(left, right); break; |
| 3147 case Token::kMUL: __ mulps(left, right); break; | 3147 case Token::kMUL: __ mulps(left, right); break; |
| 3148 case Token::kDIV: __ divps(left, right); break; | 3148 case Token::kDIV: __ divps(left, right); break; |
| 3149 default: UNREACHABLE(); | 3149 default: UNREACHABLE(); |
| 3150 } | 3150 } |
| 3151 } | 3151 } |
| 3152 | 3152 |
| 3153 | 3153 |
| 3154 LocationSummary* Float32x4ShuffleInstr::MakeLocationSummary() const { | 3154 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary() const { |
| 3155 const intptr_t kNumInputs = 1; | 3155 const intptr_t kNumInputs = 1; |
| 3156 const intptr_t kNumTemps = 0; | 3156 const intptr_t kNumTemps = 0; |
| 3157 LocationSummary* summary = | 3157 LocationSummary* summary = |
| 3158 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3158 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3159 summary->set_in(0, Location::RequiresFpuRegister()); | 3159 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3160 summary->set_out(Location::SameAsFirstInput()); | 3160 summary->set_out(Location::SameAsFirstInput()); |
| 3161 return summary; | 3161 return summary; |
| 3162 } | 3162 } |
| 3163 | 3163 |
| 3164 | 3164 |
| 3165 void Float32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3165 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3166 XmmRegister value = locs()->in(0).fpu_reg(); | 3166 XmmRegister value = locs()->in(0).fpu_reg(); |
| 3167 | 3167 |
| 3168 ASSERT(locs()->out().fpu_reg() == value); | 3168 ASSERT(locs()->out().fpu_reg() == value); |
| 3169 | 3169 |
| 3170 switch (op_kind()) { | 3170 switch (op_kind()) { |
| 3171 case MethodRecognizer::kFloat32x4ShuffleX: | 3171 case MethodRecognizer::kFloat32x4ShuffleX: |
| 3172 __ shufps(value, value, Immediate(0x00)); | 3172 __ shufps(value, value, Immediate(0x00)); |
| 3173 __ cvtss2sd(value, value); | 3173 __ cvtss2sd(value, value); |
| 3174 break; | 3174 break; |
| 3175 case MethodRecognizer::kFloat32x4ShuffleY: | 3175 case MethodRecognizer::kFloat32x4ShuffleY: |
| 3176 __ shufps(value, value, Immediate(0x55)); | 3176 __ shufps(value, value, Immediate(0x55)); |
| 3177 __ cvtss2sd(value, value); | 3177 __ cvtss2sd(value, value); |
| 3178 break; | 3178 break; |
| 3179 case MethodRecognizer::kFloat32x4ShuffleZ: | 3179 case MethodRecognizer::kFloat32x4ShuffleZ: |
| 3180 __ shufps(value, value, Immediate(0xAA)); | 3180 __ shufps(value, value, Immediate(0xAA)); |
| 3181 __ cvtss2sd(value, value); | 3181 __ cvtss2sd(value, value); |
| 3182 break; | 3182 break; |
| 3183 case MethodRecognizer::kFloat32x4ShuffleW: | 3183 case MethodRecognizer::kFloat32x4ShuffleW: |
| 3184 __ shufps(value, value, Immediate(0xFF)); | 3184 __ shufps(value, value, Immediate(0xFF)); |
| 3185 __ cvtss2sd(value, value); | 3185 __ cvtss2sd(value, value); |
| 3186 break; | 3186 break; |
| 3187 case MethodRecognizer::kFloat32x4Shuffle: | 3187 case MethodRecognizer::kFloat32x4Shuffle: |
| 3188 case MethodRecognizer::kUint32x4Shuffle: |
| 3188 __ shufps(value, value, Immediate(mask_)); | 3189 __ shufps(value, value, Immediate(mask_)); |
| 3189 break; | 3190 break; |
| 3190 default: UNREACHABLE(); | 3191 default: UNREACHABLE(); |
| 3191 } | 3192 } |
| 3192 } | 3193 } |
| 3193 | 3194 |
| 3194 | 3195 |
| 3196 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary() const { |
| 3197 const intptr_t kNumInputs = 2; |
| 3198 const intptr_t kNumTemps = 0; |
| 3199 LocationSummary* summary = |
| 3200 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3201 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3202 summary->set_in(1, Location::RequiresFpuRegister()); |
| 3203 summary->set_out(Location::SameAsFirstInput()); |
| 3204 return summary; |
| 3205 } |
| 3206 |
| 3207 |
| 3208 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3209 XmmRegister left = locs()->in(0).fpu_reg(); |
| 3210 XmmRegister right = locs()->in(1).fpu_reg(); |
| 3211 |
| 3212 ASSERT(locs()->out().fpu_reg() == left); |
| 3213 switch (op_kind()) { |
| 3214 case MethodRecognizer::kFloat32x4ShuffleMix: |
| 3215 case MethodRecognizer::kUint32x4ShuffleMix: |
| 3216 __ shufps(left, right, Immediate(mask_)); |
| 3217 break; |
| 3218 default: UNREACHABLE(); |
| 3219 } |
| 3220 } |
| 3221 |
| 3222 |
| 3195 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary() const { | 3223 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary() const { |
| 3196 const intptr_t kNumInputs = 1; | 3224 const intptr_t kNumInputs = 1; |
| 3197 const intptr_t kNumTemps = 0; | 3225 const intptr_t kNumTemps = 0; |
| 3198 LocationSummary* summary = | 3226 LocationSummary* summary = |
| 3199 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3227 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3200 summary->set_in(0, Location::RequiresFpuRegister()); | 3228 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3201 summary->set_out(Location::RequiresRegister()); | 3229 summary->set_out(Location::RequiresRegister()); |
| 3202 return summary; | 3230 return summary; |
| 3203 } | 3231 } |
| 3204 | 3232 |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3546 summary->set_out(Location::SameAsFirstInput()); | 3574 summary->set_out(Location::SameAsFirstInput()); |
| 3547 return summary; | 3575 return summary; |
| 3548 } | 3576 } |
| 3549 | 3577 |
| 3550 | 3578 |
| 3551 void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3579 void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3552 // NOP. | 3580 // NOP. |
| 3553 } | 3581 } |
| 3554 | 3582 |
| 3555 | 3583 |
| 3556 LocationSummary* Float32x4TwoArgShuffleInstr::MakeLocationSummary() const { | |
| 3557 const intptr_t kNumInputs = 2; | |
| 3558 const intptr_t kNumTemps = 0; | |
| 3559 LocationSummary* summary = | |
| 3560 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | |
| 3561 summary->set_in(0, Location::RequiresFpuRegister()); | |
| 3562 summary->set_in(1, Location::RequiresFpuRegister()); | |
| 3563 summary->set_out(Location::SameAsFirstInput()); | |
| 3564 return summary; | |
| 3565 } | |
| 3566 | |
| 3567 | |
| 3568 void Float32x4TwoArgShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
| 3569 XmmRegister left = locs()->in(0).fpu_reg(); | |
| 3570 XmmRegister right = locs()->in(1).fpu_reg(); | |
| 3571 | |
| 3572 ASSERT(locs()->out().fpu_reg() == left); | |
| 3573 | |
| 3574 switch (op_kind()) { | |
| 3575 case MethodRecognizer::kFloat32x4WithZWInXY: | |
| 3576 __ movhlps(left, right); | |
| 3577 break; | |
| 3578 case MethodRecognizer::kFloat32x4InterleaveXY: | |
| 3579 __ unpcklps(left, right); | |
| 3580 break; | |
| 3581 case MethodRecognizer::kFloat32x4InterleaveZW: | |
| 3582 __ unpckhps(left, right); | |
| 3583 break; | |
| 3584 case MethodRecognizer::kFloat32x4InterleaveXYPairs: | |
| 3585 __ unpcklpd(left, right); | |
| 3586 break; | |
| 3587 case MethodRecognizer::kFloat32x4InterleaveZWPairs: | |
| 3588 __ unpckhpd(left, right); | |
| 3589 break; | |
| 3590 default: UNREACHABLE(); | |
| 3591 } | |
| 3592 } | |
| 3593 | |
| 3594 | |
| 3595 LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const { | 3584 LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const { |
| 3596 const intptr_t kNumInputs = 4; | 3585 const intptr_t kNumInputs = 4; |
| 3597 const intptr_t kNumTemps = 1; | 3586 const intptr_t kNumTemps = 1; |
| 3598 LocationSummary* summary = | 3587 LocationSummary* summary = |
| 3599 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3588 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3600 summary->set_in(0, Location::RequiresRegister()); | 3589 summary->set_in(0, Location::RequiresRegister()); |
| 3601 summary->set_in(1, Location::RequiresRegister()); | 3590 summary->set_in(1, Location::RequiresRegister()); |
| 3602 summary->set_in(2, Location::RequiresRegister()); | 3591 summary->set_in(2, Location::RequiresRegister()); |
| 3603 summary->set_in(3, Location::RequiresRegister()); | 3592 summary->set_in(3, Location::RequiresRegister()); |
| 3604 summary->set_temp(0, Location::RequiresRegister()); | 3593 summary->set_temp(0, Location::RequiresRegister()); |
| (...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4818 PcDescriptors::kOther, | 4807 PcDescriptors::kOther, |
| 4819 locs()); | 4808 locs()); |
| 4820 __ Drop(2); // Discard type arguments and receiver. | 4809 __ Drop(2); // Discard type arguments and receiver. |
| 4821 } | 4810 } |
| 4822 | 4811 |
| 4823 } // namespace dart | 4812 } // namespace dart |
| 4824 | 4813 |
| 4825 #undef __ | 4814 #undef __ |
| 4826 | 4815 |
| 4827 #endif // defined TARGET_ARCH_X64 | 4816 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |