OLD | NEW |
1 //===- subzero/src/IceInstX8632.h - Low-level x86 instructions --*- C++ -*-===// | 1 //===- subzero/src/IceInstX8632.h - Low-level x86 instructions --*- C++ -*-===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file declares the InstX8632 and OperandX8632 classes and | 10 // This file declares the InstX8632 and OperandX8632 classes and |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 static bool classof(const Inst *Inst) { return isClassof(Inst, Call); } | 421 static bool classof(const Inst *Inst) { return isClassof(Inst, Call); } |
422 | 422 |
423 private: | 423 private: |
424 InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget); | 424 InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget); |
425 InstX8632Call(const InstX8632Call &) LLVM_DELETED_FUNCTION; | 425 InstX8632Call(const InstX8632Call &) LLVM_DELETED_FUNCTION; |
426 InstX8632Call &operator=(const InstX8632Call &) LLVM_DELETED_FUNCTION; | 426 InstX8632Call &operator=(const InstX8632Call &) LLVM_DELETED_FUNCTION; |
427 ~InstX8632Call() override {} | 427 ~InstX8632Call() override {} |
428 }; | 428 }; |
429 | 429 |
430 // Emit a one-operand (GPR) instruction. | 430 // Emit a one-operand (GPR) instruction. |
431 void emitIASVarTyGPR(const Cfg *Func, Type Ty, const Variable *Var, | 431 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Var, |
432 const x86::AssemblerX86::GPREmitterOneOp &Emitter); | 432 const x86::AssemblerX86::GPREmitterOneOp &Emitter); |
433 | 433 |
434 // Instructions of the form x := op(x). | 434 // Instructions of the form x := op(x). |
435 template <InstX8632::InstKindX8632 K> | 435 template <InstX8632::InstKindX8632 K> |
436 class InstX8632InplaceopGPR : public InstX8632 { | 436 class InstX8632InplaceopGPR : public InstX8632 { |
437 public: | 437 public: |
438 static InstX8632InplaceopGPR *create(Cfg *Func, Operand *SrcDest) { | 438 static InstX8632InplaceopGPR *create(Cfg *Func, Operand *SrcDest) { |
439 return new (Func->allocate<InstX8632InplaceopGPR>()) | 439 return new (Func->allocate<InstX8632InplaceopGPR>()) |
440 InstX8632InplaceopGPR(Func, SrcDest); | 440 InstX8632InplaceopGPR(Func, SrcDest); |
441 } | 441 } |
442 void emit(const Cfg *Func) const override { | 442 void emit(const Cfg *Func) const override { |
443 Ostream &Str = Func->getContext()->getStrEmit(); | 443 Ostream &Str = Func->getContext()->getStrEmit(); |
444 assert(getSrcSize() == 1); | 444 assert(getSrcSize() == 1); |
445 Str << "\t" << Opcode << "\t"; | 445 Str << "\t" << Opcode << "\t"; |
446 getSrc(0)->emit(Func); | 446 getSrc(0)->emit(Func); |
447 Str << "\n"; | 447 Str << "\n"; |
448 } | 448 } |
449 void emitIAS(const Cfg *Func) const override { | 449 void emitIAS(const Cfg *Func) const override { |
450 assert(getSrcSize() == 1); | 450 assert(getSrcSize() == 1); |
451 const Variable *Var = getDest(); | 451 const Variable *Var = getDest(); |
452 Type Ty = Var->getType(); | 452 Type Ty = Var->getType(); |
453 emitIASVarTyGPR(Func, Ty, Var, Emitter); | 453 emitIASOpTyGPR(Func, Ty, Var, Emitter); |
454 } | 454 } |
455 void dump(const Cfg *Func) const override { | 455 void dump(const Cfg *Func) const override { |
456 Ostream &Str = Func->getContext()->getStrDump(); | 456 Ostream &Str = Func->getContext()->getStrDump(); |
457 dumpDest(Func); | 457 dumpDest(Func); |
458 Str << " = " << Opcode << "." << getDest()->getType() << " "; | 458 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
459 dumpSources(Func); | 459 dumpSources(Func); |
460 } | 460 } |
461 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 461 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
462 | 462 |
463 private: | 463 private: |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 }; | 571 }; |
572 | 572 |
573 // See the definition of emitTwoAddress() for a description of | 573 // See the definition of emitTwoAddress() for a description of |
574 // ShiftHack. | 574 // ShiftHack. |
575 void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func, | 575 void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func, |
576 bool ShiftHack = false); | 576 bool ShiftHack = false); |
577 | 577 |
578 template <InstX8632::InstKindX8632 K, bool ShiftHack = false> | 578 template <InstX8632::InstKindX8632 K, bool ShiftHack = false> |
579 class InstX8632Binop : public InstX8632 { | 579 class InstX8632Binop : public InstX8632 { |
580 public: | 580 public: |
581 // Create an ordinary binary-op instruction like add or sub. | 581 // Create a binary-op instruction like shifts. |
582 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) { | 582 static InstX8632Binop *create(Cfg *Func, Variable *Dest, Operand *Source) { |
583 return new (Func->allocate<InstX8632Binop>()) | 583 return new (Func->allocate<InstX8632Binop>()) |
584 InstX8632Binop(Func, Dest, Source); | 584 InstX8632Binop(Func, Dest, Source); |
585 } | 585 } |
586 void emit(const Cfg *Func) const override { | 586 void emit(const Cfg *Func) const override { |
587 emitTwoAddress(Opcode, this, Func, ShiftHack); | 587 emitTwoAddress(Opcode, this, Func, ShiftHack); |
588 } | 588 } |
589 void dump(const Cfg *Func) const override { | 589 void dump(const Cfg *Func) const override { |
590 Ostream &Str = Func->getContext()->getStrDump(); | 590 Ostream &Str = Func->getContext()->getStrDump(); |
591 dumpDest(Func); | 591 dumpDest(Func); |
592 Str << " = " << Opcode << "." << getDest()->getType() << " "; | 592 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
593 dumpSources(Func); | 593 dumpSources(Func); |
594 } | 594 } |
595 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 595 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
596 | 596 |
597 private: | 597 private: |
598 InstX8632Binop(Cfg *Func, Variable *Dest, Operand *Source) | 598 InstX8632Binop(Cfg *Func, Variable *Dest, Operand *Source) |
599 : InstX8632(Func, K, 2, Dest) { | 599 : InstX8632(Func, K, 2, Dest) { |
600 addSource(Dest); | 600 addSource(Dest); |
601 addSource(Source); | 601 addSource(Source); |
602 } | 602 } |
603 InstX8632Binop(const InstX8632Binop &) LLVM_DELETED_FUNCTION; | 603 InstX8632Binop(const InstX8632Binop &) LLVM_DELETED_FUNCTION; |
604 InstX8632Binop &operator=(const InstX8632Binop &) LLVM_DELETED_FUNCTION; | 604 InstX8632Binop &operator=(const InstX8632Binop &) LLVM_DELETED_FUNCTION; |
605 ~InstX8632Binop() override {} | 605 ~InstX8632Binop() override {} |
606 static const char *Opcode; | 606 static const char *Opcode; |
607 }; | 607 }; |
608 | 608 |
| 609 template <InstX8632::InstKindX8632 K> |
| 610 class InstX8632BinopGPR : public InstX8632 { |
| 611 public: |
| 612 // Create an ordinary binary-op instruction like add or sub. |
| 613 static InstX8632BinopGPR *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| 614 return new (Func->allocate<InstX8632BinopGPR>()) |
| 615 InstX8632BinopGPR(Func, Dest, Source); |
| 616 } |
| 617 void emit(const Cfg *Func) const override { |
| 618 const bool ShiftHack = false; |
| 619 emitTwoAddress(Opcode, this, Func, ShiftHack); |
| 620 } |
| 621 void emitIAS(const Cfg *Func) const override { |
| 622 Type Ty = getDest()->getType(); |
| 623 assert(getSrcSize() == 2); |
| 624 emitIASRegOpTyGPR(Func, Ty, getDest(), getSrc(1), Emitter); |
| 625 } |
| 626 void dump(const Cfg *Func) const override { |
| 627 Ostream &Str = Func->getContext()->getStrDump(); |
| 628 dumpDest(Func); |
| 629 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
| 630 dumpSources(Func); |
| 631 } |
| 632 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 633 |
| 634 private: |
| 635 InstX8632BinopGPR(Cfg *Func, Variable *Dest, Operand *Source) |
| 636 : InstX8632(Func, K, 2, Dest) { |
| 637 addSource(Dest); |
| 638 addSource(Source); |
| 639 } |
| 640 InstX8632BinopGPR(const InstX8632BinopGPR &) LLVM_DELETED_FUNCTION; |
| 641 InstX8632BinopGPR &operator=(const InstX8632BinopGPR &) LLVM_DELETED_FUNCTION; |
| 642 ~InstX8632BinopGPR() override {} |
| 643 static const char *Opcode; |
| 644 static const x86::AssemblerX86::GPREmitterRegOp Emitter; |
| 645 }; |
| 646 |
609 template <InstX8632::InstKindX8632 K, bool NeedsElementType> | 647 template <InstX8632::InstKindX8632 K, bool NeedsElementType> |
610 class InstX8632BinopXmm : public InstX8632 { | 648 class InstX8632BinopXmm : public InstX8632 { |
611 public: | 649 public: |
612 // Create an XMM binary-op instruction like addss or addps. | 650 // Create an XMM binary-op instruction like addss or addps. |
613 static InstX8632BinopXmm *create(Cfg *Func, Variable *Dest, Operand *Source) { | 651 static InstX8632BinopXmm *create(Cfg *Func, Variable *Dest, Operand *Source) { |
614 return new (Func->allocate<InstX8632BinopXmm>()) | 652 return new (Func->allocate<InstX8632BinopXmm>()) |
615 InstX8632BinopXmm(Func, Dest, Source); | 653 InstX8632BinopXmm(Func, Dest, Source); |
616 } | 654 } |
617 void emit(const Cfg *Func) const override { | 655 void emit(const Cfg *Func) const override { |
618 const bool ShiftHack = false; | 656 const bool ShiftHack = false; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 Ostream &Str = Func->getContext()->getStrEmit(); | 696 Ostream &Str = Func->getContext()->getStrEmit(); |
659 assert(getSrcSize() == 3); | 697 assert(getSrcSize() == 3); |
660 Str << "\t" << Opcode << "\t"; | 698 Str << "\t" << Opcode << "\t"; |
661 getDest()->emit(Func); | 699 getDest()->emit(Func); |
662 Str << ", "; | 700 Str << ", "; |
663 getSrc(1)->emit(Func); | 701 getSrc(1)->emit(Func); |
664 Str << ", "; | 702 Str << ", "; |
665 getSrc(2)->emit(Func); | 703 getSrc(2)->emit(Func); |
666 Str << "\n"; | 704 Str << "\n"; |
667 } | 705 } |
| 706 void emitIAS(const Cfg *Func) const override { emit(Func); } |
668 void dump(const Cfg *Func) const override { | 707 void dump(const Cfg *Func) const override { |
669 Ostream &Str = Func->getContext()->getStrDump(); | 708 Ostream &Str = Func->getContext()->getStrDump(); |
670 dumpDest(Func); | 709 dumpDest(Func); |
671 Str << " = " << Opcode << "." << getDest()->getType() << " "; | 710 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
672 dumpSources(Func); | 711 dumpSources(Func); |
673 } | 712 } |
674 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 713 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
675 | 714 |
676 private: | 715 private: |
677 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2) | 716 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2) |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 typedef InstX8632UnaryopGPR<InstX8632::Cbwdq> InstX8632Cbwdq; | 813 typedef InstX8632UnaryopGPR<InstX8632::Cbwdq> InstX8632Cbwdq; |
775 typedef InstX8632UnaryopXmm<InstX8632::Movd> InstX8632Movd; | 814 typedef InstX8632UnaryopXmm<InstX8632::Movd> InstX8632Movd; |
776 typedef InstX8632UnaryopXmm<InstX8632::Sqrtss> InstX8632Sqrtss; | 815 typedef InstX8632UnaryopXmm<InstX8632::Sqrtss> InstX8632Sqrtss; |
777 // Move/assignment instruction - wrapper for mov/movss/movsd. | 816 // Move/assignment instruction - wrapper for mov/movss/movsd. |
778 typedef InstX8632Movlike<InstX8632::Mov> InstX8632Mov; | 817 typedef InstX8632Movlike<InstX8632::Mov> InstX8632Mov; |
779 // Move packed - copy 128 bit values between XMM registers, or mem128 | 818 // Move packed - copy 128 bit values between XMM registers, or mem128 |
780 // and XMM registers. | 819 // and XMM registers. |
781 typedef InstX8632Movlike<InstX8632::Movp> InstX8632Movp; | 820 typedef InstX8632Movlike<InstX8632::Movp> InstX8632Movp; |
782 // Movq - copy between XMM registers, or mem64 and XMM registers. | 821 // Movq - copy between XMM registers, or mem64 and XMM registers. |
783 typedef InstX8632Movlike<InstX8632::Movq> InstX8632Movq; | 822 typedef InstX8632Movlike<InstX8632::Movq> InstX8632Movq; |
784 typedef InstX8632Binop<InstX8632::Add> InstX8632Add; | 823 typedef InstX8632BinopGPR<InstX8632::Add> InstX8632Add; |
785 typedef InstX8632BinopXmm<InstX8632::Addps, true> InstX8632Addps; | 824 typedef InstX8632BinopXmm<InstX8632::Addps, true> InstX8632Addps; |
786 typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc; | 825 typedef InstX8632BinopGPR<InstX8632::Adc> InstX8632Adc; |
787 typedef InstX8632BinopXmm<InstX8632::Addss, false> InstX8632Addss; | 826 typedef InstX8632BinopXmm<InstX8632::Addss, false> InstX8632Addss; |
788 typedef InstX8632BinopXmm<InstX8632::Padd, true> InstX8632Padd; | 827 typedef InstX8632BinopXmm<InstX8632::Padd, true> InstX8632Padd; |
789 typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub; | 828 typedef InstX8632BinopGPR<InstX8632::Sub> InstX8632Sub; |
790 typedef InstX8632BinopXmm<InstX8632::Subps, true> InstX8632Subps; | 829 typedef InstX8632BinopXmm<InstX8632::Subps, true> InstX8632Subps; |
791 typedef InstX8632BinopXmm<InstX8632::Subss, false> InstX8632Subss; | 830 typedef InstX8632BinopXmm<InstX8632::Subss, false> InstX8632Subss; |
792 typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb; | 831 typedef InstX8632BinopGPR<InstX8632::Sbb> InstX8632Sbb; |
793 typedef InstX8632BinopXmm<InstX8632::Psub, true> InstX8632Psub; | 832 typedef InstX8632BinopXmm<InstX8632::Psub, true> InstX8632Psub; |
794 typedef InstX8632Binop<InstX8632::And> InstX8632And; | 833 typedef InstX8632BinopGPR<InstX8632::And> InstX8632And; |
795 typedef InstX8632BinopXmm<InstX8632::Pand, false> InstX8632Pand; | 834 typedef InstX8632BinopXmm<InstX8632::Pand, false> InstX8632Pand; |
796 typedef InstX8632BinopXmm<InstX8632::Pandn, false> InstX8632Pandn; | 835 typedef InstX8632BinopXmm<InstX8632::Pandn, false> InstX8632Pandn; |
797 typedef InstX8632Binop<InstX8632::Or> InstX8632Or; | 836 typedef InstX8632BinopGPR<InstX8632::Or> InstX8632Or; |
798 typedef InstX8632BinopXmm<InstX8632::Por, false> InstX8632Por; | 837 typedef InstX8632BinopXmm<InstX8632::Por, false> InstX8632Por; |
799 typedef InstX8632Binop<InstX8632::Xor> InstX8632Xor; | 838 typedef InstX8632BinopGPR<InstX8632::Xor> InstX8632Xor; |
800 typedef InstX8632BinopXmm<InstX8632::Pxor, false> InstX8632Pxor; | 839 typedef InstX8632BinopXmm<InstX8632::Pxor, false> InstX8632Pxor; |
801 typedef InstX8632Binop<InstX8632::Imul> InstX8632Imul; | 840 typedef InstX8632Binop<InstX8632::Imul> InstX8632Imul; |
802 typedef InstX8632BinopXmm<InstX8632::Mulps, true> InstX8632Mulps; | 841 typedef InstX8632BinopXmm<InstX8632::Mulps, true> InstX8632Mulps; |
803 typedef InstX8632BinopXmm<InstX8632::Mulss, false> InstX8632Mulss; | 842 typedef InstX8632BinopXmm<InstX8632::Mulss, false> InstX8632Mulss; |
804 typedef InstX8632Binop<InstX8632::Pmull> InstX8632Pmull; | 843 typedef InstX8632Binop<InstX8632::Pmull> InstX8632Pmull; |
805 typedef InstX8632BinopXmm<InstX8632::Pmuludq, false> InstX8632Pmuludq; | 844 typedef InstX8632BinopXmm<InstX8632::Pmuludq, false> InstX8632Pmuludq; |
806 typedef InstX8632BinopXmm<InstX8632::Divps, true> InstX8632Divps; | 845 typedef InstX8632BinopXmm<InstX8632::Divps, true> InstX8632Divps; |
807 typedef InstX8632BinopXmm<InstX8632::Divss, false> InstX8632Divss; | 846 typedef InstX8632BinopXmm<InstX8632::Divss, false> InstX8632Divss; |
808 typedef InstX8632Binop<InstX8632::Rol, true> InstX8632Rol; | 847 typedef InstX8632Binop<InstX8632::Rol, true> InstX8632Rol; |
809 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; | 848 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 | 890 |
852 // Mul instruction - unsigned multiply. | 891 // Mul instruction - unsigned multiply. |
853 class InstX8632Mul : public InstX8632 { | 892 class InstX8632Mul : public InstX8632 { |
854 public: | 893 public: |
855 static InstX8632Mul *create(Cfg *Func, Variable *Dest, Variable *Source1, | 894 static InstX8632Mul *create(Cfg *Func, Variable *Dest, Variable *Source1, |
856 Operand *Source2) { | 895 Operand *Source2) { |
857 return new (Func->allocate<InstX8632Mul>()) | 896 return new (Func->allocate<InstX8632Mul>()) |
858 InstX8632Mul(Func, Dest, Source1, Source2); | 897 InstX8632Mul(Func, Dest, Source1, Source2); |
859 } | 898 } |
860 void emit(const Cfg *Func) const override; | 899 void emit(const Cfg *Func) const override; |
| 900 void emitIAS(const Cfg *Func) const override; |
861 void dump(const Cfg *Func) const override; | 901 void dump(const Cfg *Func) const override; |
862 static bool classof(const Inst *Inst) { return isClassof(Inst, Mul); } | 902 static bool classof(const Inst *Inst) { return isClassof(Inst, Mul); } |
863 | 903 |
864 private: | 904 private: |
865 InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2); | 905 InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1, Operand *Source2); |
866 InstX8632Mul(const InstX8632Mul &) LLVM_DELETED_FUNCTION; | 906 InstX8632Mul(const InstX8632Mul &) LLVM_DELETED_FUNCTION; |
867 InstX8632Mul &operator=(const InstX8632Mul &) LLVM_DELETED_FUNCTION; | 907 InstX8632Mul &operator=(const InstX8632Mul &) LLVM_DELETED_FUNCTION; |
868 ~InstX8632Mul() override {} | 908 ~InstX8632Mul() override {} |
869 }; | 909 }; |
870 | 910 |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 ~InstX8632Test() override {} | 1145 ~InstX8632Test() override {} |
1106 }; | 1146 }; |
1107 | 1147 |
1108 // Mfence instruction. | 1148 // Mfence instruction. |
1109 class InstX8632Mfence : public InstX8632 { | 1149 class InstX8632Mfence : public InstX8632 { |
1110 public: | 1150 public: |
1111 static InstX8632Mfence *create(Cfg *Func) { | 1151 static InstX8632Mfence *create(Cfg *Func) { |
1112 return new (Func->allocate<InstX8632Mfence>()) InstX8632Mfence(Func); | 1152 return new (Func->allocate<InstX8632Mfence>()) InstX8632Mfence(Func); |
1113 } | 1153 } |
1114 void emit(const Cfg *Func) const override; | 1154 void emit(const Cfg *Func) const override; |
| 1155 void emitIAS(const Cfg *Func) const override; |
1115 void dump(const Cfg *Func) const override; | 1156 void dump(const Cfg *Func) const override; |
1116 static bool classof(const Inst *Inst) { return isClassof(Inst, Mfence); } | 1157 static bool classof(const Inst *Inst) { return isClassof(Inst, Mfence); } |
1117 | 1158 |
1118 private: | 1159 private: |
1119 InstX8632Mfence(Cfg *Func); | 1160 InstX8632Mfence(Cfg *Func); |
1120 InstX8632Mfence(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; | 1161 InstX8632Mfence(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; |
1121 InstX8632Mfence &operator=(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; | 1162 InstX8632Mfence &operator=(const InstX8632Mfence &) LLVM_DELETED_FUNCTION; |
1122 ~InstX8632Mfence() override {} | 1163 ~InstX8632Mfence() override {} |
1123 }; | 1164 }; |
1124 | 1165 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1400 template <> void InstX8632Pextr::emit(const Cfg *Func) const; | 1441 template <> void InstX8632Pextr::emit(const Cfg *Func) const; |
1401 template <> void InstX8632Pinsr::emit(const Cfg *Func) const; | 1442 template <> void InstX8632Pinsr::emit(const Cfg *Func) const; |
1402 template <> void InstX8632Pmull::emit(const Cfg *Func) const; | 1443 template <> void InstX8632Pmull::emit(const Cfg *Func) const; |
1403 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; | 1444 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; |
1404 template <> void InstX8632Psll::emit(const Cfg *Func) const; | 1445 template <> void InstX8632Psll::emit(const Cfg *Func) const; |
1405 template <> void InstX8632Psra::emit(const Cfg *Func) const; | 1446 template <> void InstX8632Psra::emit(const Cfg *Func) const; |
1406 template <> void InstX8632Psub::emit(const Cfg *Func) const; | 1447 template <> void InstX8632Psub::emit(const Cfg *Func) const; |
1407 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; | 1448 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; |
1408 template <> void InstX8632Subss::emit(const Cfg *Func) const; | 1449 template <> void InstX8632Subss::emit(const Cfg *Func) const; |
1409 | 1450 |
| 1451 template <> void InstX8632Div::emitIAS(const Cfg *Func) const; |
| 1452 template <> void InstX8632Idiv::emitIAS(const Cfg *Func) const; |
1410 template <> void InstX8632Cbwdq::emitIAS(const Cfg *Func) const; | 1453 template <> void InstX8632Cbwdq::emitIAS(const Cfg *Func) const; |
1411 template <> void InstX8632Movd::emitIAS(const Cfg *Func) const; | 1454 template <> void InstX8632Movd::emitIAS(const Cfg *Func) const; |
1412 | 1455 |
1413 } // end of namespace Ice | 1456 } // end of namespace Ice |
1414 | 1457 |
1415 #endif // SUBZERO_SRC_ICEINSTX8632_H | 1458 #endif // SUBZERO_SRC_ICEINSTX8632_H |
OLD | NEW |