| 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/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
| 8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/ia32/assembler-ia32.h" | 10 #include "src/ia32/assembler-ia32.h" |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 break; | 470 break; |
| 471 case kSSEFloat32Max: | 471 case kSSEFloat32Max: |
| 472 __ maxss(i.InputDoubleRegister(0), i.InputOperand(1)); | 472 __ maxss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 473 break; | 473 break; |
| 474 case kSSEFloat32Min: | 474 case kSSEFloat32Min: |
| 475 __ minss(i.InputDoubleRegister(0), i.InputOperand(1)); | 475 __ minss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 476 break; | 476 break; |
| 477 case kSSEFloat32Sqrt: | 477 case kSSEFloat32Sqrt: |
| 478 __ sqrtss(i.OutputDoubleRegister(), i.InputOperand(0)); | 478 __ sqrtss(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 479 break; | 479 break; |
| 480 case kSSEFloat32Abs: { |
| 481 // TODO(bmeurer): Use 128-bit constants. |
| 482 // TODO(turbofan): Add AVX version with relaxed register constraints. |
| 483 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
| 484 __ psrlq(kScratchDoubleReg, 33); |
| 485 __ andps(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 486 break; |
| 487 } |
| 480 case kSSEFloat32Neg: { | 488 case kSSEFloat32Neg: { |
| 481 // TODO(bmeurer): Use 128-bit constants. | 489 // TODO(bmeurer): Use 128-bit constants. |
| 482 // TODO(turbofan): Add AVX version with relaxed register constraints. | 490 // TODO(turbofan): Add AVX version with relaxed register constraints. |
| 483 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); | 491 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
| 484 __ psllq(kScratchDoubleReg, 31); | 492 __ psllq(kScratchDoubleReg, 31); |
| 485 __ xorps(i.OutputDoubleRegister(), kScratchDoubleReg); | 493 __ xorps(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 486 break; | 494 break; |
| 487 } | 495 } |
| 488 case kSSEFloat64Cmp: | 496 case kSSEFloat64Cmp: |
| 489 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); | 497 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 __ fnstsw_ax(); | 532 __ fnstsw_ax(); |
| 525 __ sahf(); | 533 __ sahf(); |
| 526 __ j(parity_even, &mod_loop); | 534 __ j(parity_even, &mod_loop); |
| 527 // Move output to stack and clean up. | 535 // Move output to stack and clean up. |
| 528 __ fstp(1); | 536 __ fstp(1); |
| 529 __ fstp_d(Operand(esp, 0)); | 537 __ fstp_d(Operand(esp, 0)); |
| 530 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); | 538 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); |
| 531 __ add(esp, Immediate(kDoubleSize)); | 539 __ add(esp, Immediate(kDoubleSize)); |
| 532 break; | 540 break; |
| 533 } | 541 } |
| 542 case kSSEFloat64Abs: { |
| 543 // TODO(bmeurer): Use 128-bit constants. |
| 544 // TODO(turbofan): Add AVX version with relaxed register constraints. |
| 545 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
| 546 __ psrlq(kScratchDoubleReg, 1); |
| 547 __ andpd(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 548 break; |
| 549 } |
| 534 case kSSEFloat64Neg: { | 550 case kSSEFloat64Neg: { |
| 535 // TODO(bmeurer): Use 128-bit constants. | 551 // TODO(bmeurer): Use 128-bit constants. |
| 536 // TODO(turbofan): Add AVX version with relaxed register constraints. | 552 // TODO(turbofan): Add AVX version with relaxed register constraints. |
| 537 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); | 553 __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
| 538 __ psllq(kScratchDoubleReg, 63); | 554 __ psllq(kScratchDoubleReg, 63); |
| 539 __ xorpd(i.OutputDoubleRegister(), kScratchDoubleReg); | 555 __ xorpd(i.OutputDoubleRegister(), kScratchDoubleReg); |
| 540 break; | 556 break; |
| 541 } | 557 } |
| 542 case kSSEFloat64Sqrt: | 558 case kSSEFloat64Sqrt: |
| 543 __ sqrtsd(i.OutputDoubleRegister(), i.InputOperand(0)); | 559 __ sqrtsd(i.OutputDoubleRegister(), i.InputOperand(0)); |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1407 } | 1423 } |
| 1408 } | 1424 } |
| 1409 MarkLazyDeoptSite(); | 1425 MarkLazyDeoptSite(); |
| 1410 } | 1426 } |
| 1411 | 1427 |
| 1412 #undef __ | 1428 #undef __ |
| 1413 | 1429 |
| 1414 } // namespace compiler | 1430 } // namespace compiler |
| 1415 } // namespace internal | 1431 } // namespace internal |
| 1416 } // namespace v8 | 1432 } // namespace v8 |
| OLD | NEW |