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

Side by Side Diff: src/IceInstX8632.h

Issue 604873003: Handle add, adc, etc., mfence, div, idiv, mul in the assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: rebase Created 6 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 | « no previous file | src/IceInstX8632.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/IceInstX8632.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698