Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Side by Side Diff: src/x64/macro-assembler-x64.cc

Issue 1406353003: [x64] Emit vcvttsd2si[q] when AVX is enabled. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | test/cctest/test-assembler-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/base/division-by-constant.h" 8 #include "src/base/division-by-constant.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 CpuFeatureScope scope(this, AVX); 804 CpuFeatureScope scope(this, AVX);
805 vxorpd(dst, dst, dst); 805 vxorpd(dst, dst, dst);
806 vcvtlsi2sd(dst, dst, src); 806 vcvtlsi2sd(dst, dst, src);
807 } else { 807 } else {
808 xorpd(dst, dst); 808 xorpd(dst, dst);
809 cvtlsi2sd(dst, src); 809 cvtlsi2sd(dst, src);
810 } 810 }
811 } 811 }
812 812
813 813
814 void MacroAssembler::Cvttsd2si(Register dst, XMMRegister src) {
815 if (CpuFeatures::IsSupported(AVX)) {
816 CpuFeatureScope scope(this, AVX);
817 vcvttsd2si(dst, src);
818 } else {
819 cvttsd2si(dst, src);
820 }
821 }
822
823
824 void MacroAssembler::Cvttsd2si(Register dst, const Operand& src) {
825 if (CpuFeatures::IsSupported(AVX)) {
826 CpuFeatureScope scope(this, AVX);
827 vcvttsd2si(dst, src);
828 } else {
829 cvttsd2si(dst, src);
830 }
831 }
832
833
834 void MacroAssembler::Cvttsd2siq(Register dst, XMMRegister src) {
835 if (CpuFeatures::IsSupported(AVX)) {
836 CpuFeatureScope scope(this, AVX);
837 vcvttsd2siq(dst, src);
838 } else {
839 cvttsd2siq(dst, src);
840 }
841 }
842
843
844 void MacroAssembler::Cvttsd2siq(Register dst, const Operand& src) {
845 if (CpuFeatures::IsSupported(AVX)) {
846 CpuFeatureScope scope(this, AVX);
847 vcvttsd2siq(dst, src);
848 } else {
849 cvttsd2siq(dst, src);
850 }
851 }
852
853
814 void MacroAssembler::Load(Register dst, const Operand& src, Representation r) { 854 void MacroAssembler::Load(Register dst, const Operand& src, Representation r) {
815 DCHECK(!r.IsDouble()); 855 DCHECK(!r.IsDouble());
816 if (r.IsInteger8()) { 856 if (r.IsInteger8()) {
817 movsxbq(dst, src); 857 movsxbq(dst, src);
818 } else if (r.IsUInteger8()) { 858 } else if (r.IsUInteger8()) {
819 movzxbl(dst, src); 859 movzxbl(dst, src);
820 } else if (r.IsInteger16()) { 860 } else if (r.IsInteger16()) {
821 movsxwq(dst, src); 861 movsxwq(dst, src);
822 } else if (r.IsUInteger16()) { 862 } else if (r.IsUInteger16()) {
823 movzxwl(dst, src); 863 movzxwl(dst, src);
(...skipping 2455 matching lines...) Expand 10 before | Expand all | Expand 10 after
3279 int offset) { 3319 int offset) {
3280 DoubleToIStub stub(isolate(), input_reg, result_reg, offset, true); 3320 DoubleToIStub stub(isolate(), input_reg, result_reg, offset, true);
3281 call(stub.GetCode(), RelocInfo::CODE_TARGET); 3321 call(stub.GetCode(), RelocInfo::CODE_TARGET);
3282 } 3322 }
3283 3323
3284 3324
3285 void MacroAssembler::TruncateHeapNumberToI(Register result_reg, 3325 void MacroAssembler::TruncateHeapNumberToI(Register result_reg,
3286 Register input_reg) { 3326 Register input_reg) {
3287 Label done; 3327 Label done;
3288 Movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset)); 3328 Movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset));
3289 cvttsd2siq(result_reg, xmm0); 3329 Cvttsd2siq(result_reg, xmm0);
3290 cmpq(result_reg, Immediate(1)); 3330 cmpq(result_reg, Immediate(1));
3291 j(no_overflow, &done, Label::kNear); 3331 j(no_overflow, &done, Label::kNear);
3292 3332
3293 // Slow case. 3333 // Slow case.
3294 if (input_reg.is(result_reg)) { 3334 if (input_reg.is(result_reg)) {
3295 subp(rsp, Immediate(kDoubleSize)); 3335 subp(rsp, Immediate(kDoubleSize));
3296 Movsd(MemOperand(rsp, 0), xmm0); 3336 Movsd(MemOperand(rsp, 0), xmm0);
3297 SlowTruncateToI(result_reg, rsp, 0); 3337 SlowTruncateToI(result_reg, rsp, 0);
3298 addp(rsp, Immediate(kDoubleSize)); 3338 addp(rsp, Immediate(kDoubleSize));
3299 } else { 3339 } else {
3300 SlowTruncateToI(result_reg, input_reg); 3340 SlowTruncateToI(result_reg, input_reg);
3301 } 3341 }
3302 3342
3303 bind(&done); 3343 bind(&done);
3304 // Keep our invariant that the upper 32 bits are zero. 3344 // Keep our invariant that the upper 32 bits are zero.
3305 movl(result_reg, result_reg); 3345 movl(result_reg, result_reg);
3306 } 3346 }
3307 3347
3308 3348
3309 void MacroAssembler::TruncateDoubleToI(Register result_reg, 3349 void MacroAssembler::TruncateDoubleToI(Register result_reg,
3310 XMMRegister input_reg) { 3350 XMMRegister input_reg) {
3311 Label done; 3351 Label done;
3312 cvttsd2siq(result_reg, input_reg); 3352 Cvttsd2siq(result_reg, input_reg);
3313 cmpq(result_reg, Immediate(1)); 3353 cmpq(result_reg, Immediate(1));
3314 j(no_overflow, &done, Label::kNear); 3354 j(no_overflow, &done, Label::kNear);
3315 3355
3316 subp(rsp, Immediate(kDoubleSize)); 3356 subp(rsp, Immediate(kDoubleSize));
3317 Movsd(MemOperand(rsp, 0), input_reg); 3357 Movsd(MemOperand(rsp, 0), input_reg);
3318 SlowTruncateToI(result_reg, rsp, 0); 3358 SlowTruncateToI(result_reg, rsp, 0);
3319 addp(rsp, Immediate(kDoubleSize)); 3359 addp(rsp, Immediate(kDoubleSize));
3320 3360
3321 bind(&done); 3361 bind(&done);
3322 // Keep our invariant that the upper 32 bits are zero. 3362 // Keep our invariant that the upper 32 bits are zero.
3323 movl(result_reg, result_reg); 3363 movl(result_reg, result_reg);
3324 } 3364 }
3325 3365
3326 3366
3327 void MacroAssembler::DoubleToI(Register result_reg, XMMRegister input_reg, 3367 void MacroAssembler::DoubleToI(Register result_reg, XMMRegister input_reg,
3328 XMMRegister scratch, 3368 XMMRegister scratch,
3329 MinusZeroMode minus_zero_mode, 3369 MinusZeroMode minus_zero_mode,
3330 Label* lost_precision, Label* is_nan, 3370 Label* lost_precision, Label* is_nan,
3331 Label* minus_zero, Label::Distance dst) { 3371 Label* minus_zero, Label::Distance dst) {
3332 cvttsd2si(result_reg, input_reg); 3372 Cvttsd2si(result_reg, input_reg);
3333 Cvtlsi2sd(xmm0, result_reg); 3373 Cvtlsi2sd(xmm0, result_reg);
3334 ucomisd(xmm0, input_reg); 3374 ucomisd(xmm0, input_reg);
3335 j(not_equal, lost_precision, dst); 3375 j(not_equal, lost_precision, dst);
3336 j(parity_even, is_nan, dst); // NaN. 3376 j(parity_even, is_nan, dst); // NaN.
3337 if (minus_zero_mode == FAIL_ON_MINUS_ZERO) { 3377 if (minus_zero_mode == FAIL_ON_MINUS_ZERO) {
3338 Label done; 3378 Label done;
3339 // The integer converted back is equal to the original. We 3379 // The integer converted back is equal to the original. We
3340 // only have to test if we got -0 as an input. 3380 // only have to test if we got -0 as an input.
3341 testl(result_reg, result_reg); 3381 testl(result_reg, result_reg);
3342 j(not_zero, &done, Label::kNear); 3382 j(not_zero, &done, Label::kNear);
(...skipping 1818 matching lines...) Expand 10 before | Expand all | Expand 10 after
5161 movl(rax, dividend); 5201 movl(rax, dividend);
5162 shrl(rax, Immediate(31)); 5202 shrl(rax, Immediate(31));
5163 addl(rdx, rax); 5203 addl(rdx, rax);
5164 } 5204 }
5165 5205
5166 5206
5167 } // namespace internal 5207 } // namespace internal
5168 } // namespace v8 5208 } // namespace v8
5169 5209
5170 #endif // V8_TARGET_ARCH_X64 5210 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | test/cctest/test-assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698