| 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 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 case kIA32Ror: | 443 case kIA32Ror: |
| 444 if (HasImmediateInput(instr, 1)) { | 444 if (HasImmediateInput(instr, 1)) { |
| 445 __ ror(i.OutputOperand(), i.InputInt5(1)); | 445 __ ror(i.OutputOperand(), i.InputInt5(1)); |
| 446 } else { | 446 } else { |
| 447 __ ror_cl(i.OutputOperand()); | 447 __ ror_cl(i.OutputOperand()); |
| 448 } | 448 } |
| 449 break; | 449 break; |
| 450 case kIA32Lzcnt: | 450 case kIA32Lzcnt: |
| 451 __ Lzcnt(i.OutputRegister(), i.InputOperand(0)); | 451 __ Lzcnt(i.OutputRegister(), i.InputOperand(0)); |
| 452 break; | 452 break; |
| 453 case kSSEFloat32Cmp: |
| 454 __ ucomiss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 455 break; |
| 456 case kSSEFloat32Add: |
| 457 __ addss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 458 break; |
| 459 case kSSEFloat32Sub: |
| 460 __ subss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 461 break; |
| 462 case kSSEFloat32Mul: |
| 463 __ mulss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 464 break; |
| 465 case kSSEFloat32Div: |
| 466 __ divss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 467 break; |
| 468 case kSSEFloat32Max: |
| 469 __ maxss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 470 break; |
| 471 case kSSEFloat32Min: |
| 472 __ minss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 473 break; |
| 474 case kSSEFloat32Sqrt: |
| 475 __ sqrtss(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 476 break; |
| 453 case kSSEFloat64Cmp: | 477 case kSSEFloat64Cmp: |
| 454 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); | 478 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 455 break; | 479 break; |
| 456 case kSSEFloat64Add: | 480 case kSSEFloat64Add: |
| 457 __ addsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 481 __ addsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 458 break; | 482 break; |
| 459 case kSSEFloat64Sub: | 483 case kSSEFloat64Sub: |
| 460 __ subsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 484 __ subsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 461 break; | 485 break; |
| 462 case kSSEFloat64Mul: | 486 case kSSEFloat64Mul: |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 case kSSEFloat64Sqrt: | 523 case kSSEFloat64Sqrt: |
| 500 __ sqrtsd(i.OutputDoubleRegister(), i.InputOperand(0)); | 524 __ sqrtsd(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 501 break; | 525 break; |
| 502 case kSSEFloat64Round: { | 526 case kSSEFloat64Round: { |
| 503 CpuFeatureScope sse_scope(masm(), SSE4_1); | 527 CpuFeatureScope sse_scope(masm(), SSE4_1); |
| 504 RoundingMode const mode = | 528 RoundingMode const mode = |
| 505 static_cast<RoundingMode>(MiscField::decode(instr->opcode())); | 529 static_cast<RoundingMode>(MiscField::decode(instr->opcode())); |
| 506 __ roundsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), mode); | 530 __ roundsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), mode); |
| 507 break; | 531 break; |
| 508 } | 532 } |
| 509 case kSSECvtss2sd: | 533 case kSSEFloat32ToFloat64: |
| 510 __ cvtss2sd(i.OutputDoubleRegister(), i.InputOperand(0)); | 534 __ cvtss2sd(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 511 break; | 535 break; |
| 512 case kSSECvtsd2ss: | 536 case kSSEFloat64ToFloat32: |
| 513 __ cvtsd2ss(i.OutputDoubleRegister(), i.InputOperand(0)); | 537 __ cvtsd2ss(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 514 break; | 538 break; |
| 515 case kSSEFloat64ToInt32: | 539 case kSSEFloat64ToInt32: |
| 516 __ cvttsd2si(i.OutputRegister(), i.InputOperand(0)); | 540 __ cvttsd2si(i.OutputRegister(), i.InputOperand(0)); |
| 517 break; | 541 break; |
| 518 case kSSEFloat64ToUint32: { | 542 case kSSEFloat64ToUint32: { |
| 519 XMMRegister scratch = xmm0; | 543 XMMRegister scratch = xmm0; |
| 520 __ Move(scratch, -2147483648.0); | 544 __ Move(scratch, -2147483648.0); |
| 521 __ addsd(scratch, i.InputOperand(0)); | 545 __ addsd(scratch, i.InputOperand(0)); |
| 522 __ cvttsd2si(i.OutputRegister(), scratch); | 546 __ cvttsd2si(i.OutputRegister(), scratch); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 545 break; | 569 break; |
| 546 case kSSEFloat64InsertLowWord32: | 570 case kSSEFloat64InsertLowWord32: |
| 547 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 0); | 571 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 0); |
| 548 break; | 572 break; |
| 549 case kSSEFloat64InsertHighWord32: | 573 case kSSEFloat64InsertHighWord32: |
| 550 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 1); | 574 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 1); |
| 551 break; | 575 break; |
| 552 case kSSEFloat64LoadLowWord32: | 576 case kSSEFloat64LoadLowWord32: |
| 553 __ movd(i.OutputDoubleRegister(), i.InputOperand(0)); | 577 __ movd(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 554 break; | 578 break; |
| 579 case kAVXFloat32Add: { |
| 580 CpuFeatureScope avx_scope(masm(), AVX); |
| 581 __ vaddss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 582 i.InputOperand(1)); |
| 583 break; |
| 584 } |
| 585 case kAVXFloat32Sub: { |
| 586 CpuFeatureScope avx_scope(masm(), AVX); |
| 587 __ vsubss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 588 i.InputOperand(1)); |
| 589 break; |
| 590 } |
| 591 case kAVXFloat32Mul: { |
| 592 CpuFeatureScope avx_scope(masm(), AVX); |
| 593 __ vmulss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 594 i.InputOperand(1)); |
| 595 break; |
| 596 } |
| 597 case kAVXFloat32Div: { |
| 598 CpuFeatureScope avx_scope(masm(), AVX); |
| 599 __ vdivss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 600 i.InputOperand(1)); |
| 601 break; |
| 602 } |
| 603 case kAVXFloat32Max: { |
| 604 CpuFeatureScope avx_scope(masm(), AVX); |
| 605 __ vmaxss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 606 i.InputOperand(1)); |
| 607 break; |
| 608 } |
| 609 case kAVXFloat32Min: { |
| 610 CpuFeatureScope avx_scope(masm(), AVX); |
| 611 __ vminss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 612 i.InputOperand(1)); |
| 613 break; |
| 614 } |
| 555 case kAVXFloat64Add: { | 615 case kAVXFloat64Add: { |
| 556 CpuFeatureScope avx_scope(masm(), AVX); | 616 CpuFeatureScope avx_scope(masm(), AVX); |
| 557 __ vaddsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 617 __ vaddsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 558 i.InputOperand(1)); | 618 i.InputOperand(1)); |
| 559 break; | 619 break; |
| 560 } | 620 } |
| 561 case kAVXFloat64Sub: { | 621 case kAVXFloat64Sub: { |
| 562 CpuFeatureScope avx_scope(masm(), AVX); | 622 CpuFeatureScope avx_scope(masm(), AVX); |
| 563 __ vsubsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 623 __ vsubsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
| 564 i.InputOperand(1)); | 624 i.InputOperand(1)); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 case kCheckedStoreFloat64: | 800 case kCheckedStoreFloat64: |
| 741 ASSEMBLE_CHECKED_STORE_FLOAT(movsd); | 801 ASSEMBLE_CHECKED_STORE_FLOAT(movsd); |
| 742 break; | 802 break; |
| 743 case kIA32StackCheck: { | 803 case kIA32StackCheck: { |
| 744 ExternalReference const stack_limit = | 804 ExternalReference const stack_limit = |
| 745 ExternalReference::address_of_stack_limit(isolate()); | 805 ExternalReference::address_of_stack_limit(isolate()); |
| 746 __ cmp(esp, Operand::StaticVariable(stack_limit)); | 806 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 747 break; | 807 break; |
| 748 } | 808 } |
| 749 } | 809 } |
| 750 } | 810 } // NOLINT(readability/fn_size) |
| 751 | 811 |
| 752 | 812 |
| 753 // Assembles a branch after an instruction. | 813 // Assembles a branch after an instruction. |
| 754 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { | 814 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { |
| 755 IA32OperandConverter i(this, instr); | 815 IA32OperandConverter i(this, instr); |
| 756 Label::Distance flabel_distance = | 816 Label::Distance flabel_distance = |
| 757 branch->fallthru ? Label::kNear : Label::kFar; | 817 branch->fallthru ? Label::kNear : Label::kFar; |
| 758 Label* tlabel = branch->true_label; | 818 Label* tlabel = branch->true_label; |
| 759 Label* flabel = branch->false_label; | 819 Label* flabel = branch->false_label; |
| 760 switch (branch->condition) { | 820 switch (branch->condition) { |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 } | 1392 } |
| 1333 } | 1393 } |
| 1334 MarkLazyDeoptSite(); | 1394 MarkLazyDeoptSite(); |
| 1335 } | 1395 } |
| 1336 | 1396 |
| 1337 #undef __ | 1397 #undef __ |
| 1338 | 1398 |
| 1339 } // namespace compiler | 1399 } // namespace compiler |
| 1340 } // namespace internal | 1400 } // namespace internal |
| 1341 } // namespace v8 | 1401 } // namespace v8 |
| OLD | NEW |