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