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

Side by Side Diff: src/IceInstARM32.h

Issue 1881623002: Subzero. ARM32. Vector shifts. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fixes GPLUSPLUS build Created 4 years, 8 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 | « src/IceAssemblerARM32.cpp ('k') | src/IceInstARM32.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/IceInstARM32.h - ARM32 machine instructions --*- C++ -*-===// 1 //===- subzero/src/IceInstARM32.h - ARM32 machine 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 /// \file 10 /// \file
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 Vadd, 428 Vadd,
429 Vand, 429 Vand,
430 Vcmp, 430 Vcmp,
431 Vcvt, 431 Vcvt,
432 Vdiv, 432 Vdiv,
433 Veor, 433 Veor,
434 Vmla, 434 Vmla,
435 Vmls, 435 Vmls,
436 Vmrs, 436 Vmrs,
437 Vmul, 437 Vmul,
438 Vneg,
438 Vorr, 439 Vorr,
440 Vshl,
439 Vsqrt, 441 Vsqrt,
440 Vsub 442 Vsub
441 }; 443 };
442 444
443 static constexpr size_t InstSize = sizeof(uint32_t); 445 static constexpr size_t InstSize = sizeof(uint32_t);
444 446
445 static const char *getWidthString(Type Ty);
446 static const char *getVecWidthString(Type Ty);
447 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond); 447 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond);
448 448
449 /// Called inside derived methods emit() to communicate that multiple 449 /// Called inside derived methods emit() to communicate that multiple
450 /// instructions are being generated. Used by emitIAS() methods to 450 /// instructions are being generated. Used by emitIAS() methods to
451 /// generate textual fixups for instructions that are not yet 451 /// generate textual fixups for instructions that are not yet
452 /// implemented. 452 /// implemented.
453 void startNextInst(const Cfg *Func) const; 453 void startNextInst(const Cfg *Func) const;
454 454
455 /// FPSign is used for certain vector instructions (particularly, right
456 /// shifts) that require an operand sign specification.
457 enum FPSign {
458 FS_None,
459 FS_Signed,
460 FS_Unsigned,
461 };
455 /// Shared emit routines for common forms of instructions. 462 /// Shared emit routines for common forms of instructions.
456 static void emitThreeAddrFP(const char *Opcode, const InstARM32 *Instr, 463 /// @{
457 const Cfg *Func); 464 static void emitThreeAddrFP(const char *Opcode, FPSign Sign,
458 static void emitFourAddrFP(const char *Opcode, const InstARM32 *Instr, 465 const InstARM32 *Instr, const Cfg *Func);
459 const Cfg *Func); 466 static void emitFourAddrFP(const char *Opcode, FPSign Sign,
467 const InstARM32 *Instr, const Cfg *Func);
468 /// @}
460 469
461 void dump(const Cfg *Func) const override; 470 void dump(const Cfg *Func) const override;
462 471
463 void emitIAS(const Cfg *Func) const override; 472 void emitIAS(const Cfg *Func) const override;
464 473
465 protected: 474 protected:
466 InstARM32(Cfg *Func, InstKindARM32 Kind, SizeT Maxsrcs, Variable *Dest) 475 InstARM32(Cfg *Func, InstKindARM32 Kind, SizeT Maxsrcs, Variable *Dest)
467 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} 476 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {}
468 477
469 static bool isClassof(const Inst *Instr, InstKindARM32 MyKind) { 478 static bool isClassof(const Inst *Instr, InstKindARM32 MyKind) {
(...skipping 18 matching lines...) Expand all
488 497
489 CondARM32::Cond getPredicate() const { return Predicate; } 498 CondARM32::Cond getPredicate() const { return Predicate; }
490 void setPredicate(CondARM32::Cond Pred) { Predicate = Pred; } 499 void setPredicate(CondARM32::Cond Pred) { Predicate = Pred; }
491 500
492 static const char *predString(CondARM32::Cond Predicate); 501 static const char *predString(CondARM32::Cond Predicate);
493 void dumpOpcodePred(Ostream &Str, const char *Opcode, Type Ty) const; 502 void dumpOpcodePred(Ostream &Str, const char *Opcode, Type Ty) const;
494 503
495 /// Shared emit routines for common forms of instructions. 504 /// Shared emit routines for common forms of instructions.
496 static void emitUnaryopGPR(const char *Opcode, const InstARM32Pred *Instr, 505 static void emitUnaryopGPR(const char *Opcode, const InstARM32Pred *Instr,
497 const Cfg *Func, bool NeedsWidthSuffix); 506 const Cfg *Func, bool NeedsWidthSuffix);
498 static void emitUnaryopFP(const char *Opcode, const InstARM32Pred *Instr, 507 static void emitUnaryopFP(const char *Opcode, FPSign Sign,
499 const Cfg *Func); 508 const InstARM32Pred *Instr, const Cfg *Func);
500 static void emitTwoAddr(const char *Opcode, const InstARM32Pred *Instr, 509 static void emitTwoAddr(const char *Opcode, const InstARM32Pred *Instr,
501 const Cfg *Func); 510 const Cfg *Func);
502 static void emitThreeAddr(const char *Opcode, const InstARM32Pred *Instr, 511 static void emitThreeAddr(const char *Opcode, const InstARM32Pred *Instr,
503 const Cfg *Func, bool SetFlags); 512 const Cfg *Func, bool SetFlags);
504 static void emitFourAddr(const char *Opcode, const InstARM32Pred *Instr, 513 static void emitFourAddr(const char *Opcode, const InstARM32Pred *Instr,
505 const Cfg *Func); 514 const Cfg *Func);
506 static void emitCmpLike(const char *Opcode, const InstARM32Pred *Instr, 515 static void emitCmpLike(const char *Opcode, const InstARM32Pred *Instr,
507 const Cfg *Func); 516 const Cfg *Func);
508 517
509 protected: 518 protected:
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 575
567 public: 576 public:
568 static InstARM32UnaryopFP *create(Cfg *Func, Variable *Dest, Variable *Src, 577 static InstARM32UnaryopFP *create(Cfg *Func, Variable *Dest, Variable *Src,
569 CondARM32::Cond Predicate) { 578 CondARM32::Cond Predicate) {
570 return new (Func->allocate<InstARM32UnaryopFP>()) 579 return new (Func->allocate<InstARM32UnaryopFP>())
571 InstARM32UnaryopFP(Func, Dest, Src, Predicate); 580 InstARM32UnaryopFP(Func, Dest, Src, Predicate);
572 } 581 }
573 void emit(const Cfg *Func) const override { 582 void emit(const Cfg *Func) const override {
574 if (!BuildDefs::dump()) 583 if (!BuildDefs::dump())
575 return; 584 return;
576 emitUnaryopFP(Opcode, this, Func); 585 emitUnaryopFP(Opcode, Sign, this, Func);
577 } 586 }
578 void emitIAS(const Cfg *Func) const override; 587 void emitIAS(const Cfg *Func) const override;
579 void dump(const Cfg *Func) const override { 588 void dump(const Cfg *Func) const override {
580 if (!BuildDefs::dump()) 589 if (!BuildDefs::dump())
581 return; 590 return;
582 Ostream &Str = Func->getContext()->getStrDump(); 591 Ostream &Str = Func->getContext()->getStrDump();
583 dumpDest(Func); 592 dumpDest(Func);
584 Str << " = "; 593 Str << " = ";
585 dumpOpcodePred(Str, Opcode, getDest()->getType()); 594 dumpOpcodePred(Str, Opcode, getDest()->getType());
586 Str << " "; 595 Str << " ";
587 dumpSources(Func); 596 dumpSources(Func);
588 } 597 }
589 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } 598 static bool classof(const Inst *Instr) { return isClassof(Instr, K); }
590 599
591 private: 600 protected:
592 InstARM32UnaryopFP(Cfg *Func, Variable *Dest, Operand *Src, 601 InstARM32UnaryopFP(Cfg *Func, Variable *Dest, Operand *Src,
593 CondARM32::Cond Predicate) 602 CondARM32::Cond Predicate)
594 : InstARM32Pred(Func, K, 1, Dest, Predicate) { 603 : InstARM32Pred(Func, K, 1, Dest, Predicate) {
595 addSource(Src); 604 addSource(Src);
596 } 605 }
597 606
607 FPSign Sign = FS_None;
598 static const char *Opcode; 608 static const char *Opcode;
599 }; 609 };
600 610
611 template <InstARM32::InstKindARM32 K>
612 class InstARM32UnaryopSignAwareFP : public InstARM32UnaryopFP<K> {
613 InstARM32UnaryopSignAwareFP() = delete;
614 InstARM32UnaryopSignAwareFP(const InstARM32UnaryopSignAwareFP &) = delete;
615 InstARM32UnaryopSignAwareFP &
616 operator=(const InstARM32UnaryopSignAwareFP &) = delete;
617
618 public:
619 static InstARM32UnaryopSignAwareFP *
620 create(Cfg *Func, Variable *Dest, Variable *Src, CondARM32::Cond Predicate) {
621 return new (Func->allocate<InstARM32UnaryopSignAwareFP>())
622 InstARM32UnaryopSignAwareFP(Func, Dest, Src, Predicate);
623 }
624 void emitIAS(const Cfg *Func) const override;
625 void setSignType(InstARM32::FPSign SignType) { this->Sign = SignType; }
626
627 private:
628 InstARM32UnaryopSignAwareFP(Cfg *Func, Variable *Dest, Operand *Src,
629 CondARM32::Cond Predicate)
630 : InstARM32UnaryopFP<K>(Func, Dest, Src, Predicate) {}
631 };
632
601 /// Instructions of the form x := x op y. 633 /// Instructions of the form x := x op y.
602 template <InstARM32::InstKindARM32 K> 634 template <InstARM32::InstKindARM32 K>
603 class InstARM32TwoAddrGPR : public InstARM32Pred { 635 class InstARM32TwoAddrGPR : public InstARM32Pred {
604 InstARM32TwoAddrGPR() = delete; 636 InstARM32TwoAddrGPR() = delete;
605 InstARM32TwoAddrGPR(const InstARM32TwoAddrGPR &) = delete; 637 InstARM32TwoAddrGPR(const InstARM32TwoAddrGPR &) = delete;
606 InstARM32TwoAddrGPR &operator=(const InstARM32TwoAddrGPR &) = delete; 638 InstARM32TwoAddrGPR &operator=(const InstARM32TwoAddrGPR &) = delete;
607 639
608 public: 640 public:
609 /// Dest must be a register. 641 /// Dest must be a register.
610 static InstARM32TwoAddrGPR *create(Cfg *Func, Variable *Dest, Operand *Src, 642 static InstARM32TwoAddrGPR *create(Cfg *Func, Variable *Dest, Operand *Src,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything 773 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything
742 /// must be a register. 774 /// must be a register.
743 static InstARM32ThreeAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, 775 static InstARM32ThreeAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0,
744 Variable *Src1) { 776 Variable *Src1) {
745 return new (Func->allocate<InstARM32ThreeAddrFP>()) 777 return new (Func->allocate<InstARM32ThreeAddrFP>())
746 InstARM32ThreeAddrFP(Func, Dest, Src0, Src1); 778 InstARM32ThreeAddrFP(Func, Dest, Src0, Src1);
747 } 779 }
748 void emit(const Cfg *Func) const override { 780 void emit(const Cfg *Func) const override {
749 if (!BuildDefs::dump()) 781 if (!BuildDefs::dump())
750 return; 782 return;
751 emitThreeAddrFP(Opcode, this, Func); 783 emitThreeAddrFP(Opcode, Sign, this, Func);
752 } 784 }
753 void emitIAS(const Cfg *Func) const override; 785 void emitIAS(const Cfg *Func) const override;
754 void dump(const Cfg *Func) const override { 786 void dump(const Cfg *Func) const override {
755 if (!BuildDefs::dump()) 787 if (!BuildDefs::dump())
756 return; 788 return;
757 Ostream &Str = Func->getContext()->getStrDump(); 789 Ostream &Str = Func->getContext()->getStrDump();
758 dumpDest(Func); 790 dumpDest(Func);
759 Str << " = "; 791 Str << " = ";
760 Str << Opcode << "." << getDest()->getType() << " "; 792 Str << Opcode << "." << getDest()->getType() << " ";
761 dumpSources(Func); 793 dumpSources(Func);
762 } 794 }
763 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } 795 static bool classof(const Inst *Instr) { return isClassof(Instr, K); }
764 796
765 private: 797 protected:
766 InstARM32ThreeAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, 798 FPSign Sign = FS_None;
767 Variable *Src1) 799
800 InstARM32ThreeAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Operand *Src1)
768 : InstARM32(Func, K, 2, Dest) { 801 : InstARM32(Func, K, 2, Dest) {
769 addSource(Src0); 802 addSource(Src0);
770 addSource(Src1); 803 addSource(Src1);
771 } 804 }
772 805
773 static const char *Opcode; 806 static const char *Opcode;
774 }; 807 };
775 808
809 template <InstARM32::InstKindARM32 K>
810 class InstARM32ThreeAddrSignAwareFP : public InstARM32ThreeAddrFP<K> {
811 InstARM32ThreeAddrSignAwareFP() = delete;
812 InstARM32ThreeAddrSignAwareFP(const InstARM32ThreeAddrSignAwareFP &) = delete;
813 InstARM32ThreeAddrSignAwareFP &
814 operator=(const InstARM32ThreeAddrSignAwareFP &) = delete;
815
816 public:
817 /// Create a vector/FP binary-op instruction like vadd, and vsub. Everything
818 /// must be a register.
819 static InstARM32ThreeAddrSignAwareFP *create(Cfg *Func, Variable *Dest,
820 Variable *Src0, Variable *Src1) {
821 return new (Func->allocate<InstARM32ThreeAddrSignAwareFP>())
822 InstARM32ThreeAddrSignAwareFP(Func, Dest, Src0, Src1);
823 }
824
825 void emitIAS(const Cfg *Func) const override;
826 void setSignType(InstARM32::FPSign SignType) { this->Sign = SignType; }
827
828 private:
829 InstARM32ThreeAddrSignAwareFP(Cfg *Func, Variable *Dest, Variable *Src0,
830 Variable *Src1)
831 : InstARM32ThreeAddrFP<K>(Func, Dest, Src0, Src1) {}
832 };
833
776 /// Instructions of the form x := a op1 (y op2 z). E.g., multiply accumulate. 834 /// Instructions of the form x := a op1 (y op2 z). E.g., multiply accumulate.
777 template <InstARM32::InstKindARM32 K> 835 template <InstARM32::InstKindARM32 K>
778 class InstARM32FourAddrGPR : public InstARM32Pred { 836 class InstARM32FourAddrGPR : public InstARM32Pred {
779 InstARM32FourAddrGPR() = delete; 837 InstARM32FourAddrGPR() = delete;
780 InstARM32FourAddrGPR(const InstARM32FourAddrGPR &) = delete; 838 InstARM32FourAddrGPR(const InstARM32FourAddrGPR &) = delete;
781 InstARM32FourAddrGPR &operator=(const InstARM32FourAddrGPR &) = delete; 839 InstARM32FourAddrGPR &operator=(const InstARM32FourAddrGPR &) = delete;
782 840
783 public: 841 public:
784 // Every operand must be a register. 842 // Every operand must be a register.
785 static InstARM32FourAddrGPR *create(Cfg *Func, Variable *Dest, Variable *Src0, 843 static InstARM32FourAddrGPR *create(Cfg *Func, Variable *Dest, Variable *Src0,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 public: 891 public:
834 // Every operand must be a register. 892 // Every operand must be a register.
835 static InstARM32FourAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0, 893 static InstARM32FourAddrFP *create(Cfg *Func, Variable *Dest, Variable *Src0,
836 Variable *Src1) { 894 Variable *Src1) {
837 return new (Func->allocate<InstARM32FourAddrFP>()) 895 return new (Func->allocate<InstARM32FourAddrFP>())
838 InstARM32FourAddrFP(Func, Dest, Src0, Src1); 896 InstARM32FourAddrFP(Func, Dest, Src0, Src1);
839 } 897 }
840 void emit(const Cfg *Func) const override { 898 void emit(const Cfg *Func) const override {
841 if (!BuildDefs::dump()) 899 if (!BuildDefs::dump())
842 return; 900 return;
843 emitFourAddrFP(Opcode, this, Func); 901 emitFourAddrFP(Opcode, Sign, this, Func);
844 } 902 }
845 void emitIAS(const Cfg *Func) const override; 903 void emitIAS(const Cfg *Func) const override;
846 void dump(const Cfg *Func) const override { 904 void dump(const Cfg *Func) const override {
847 if (!BuildDefs::dump()) 905 if (!BuildDefs::dump())
848 return; 906 return;
849 Ostream &Str = Func->getContext()->getStrDump(); 907 Ostream &Str = Func->getContext()->getStrDump();
850 dumpDest(Func); 908 dumpDest(Func);
851 Str << " = "; 909 Str << " = ";
852 Str << Opcode << "." << getDest()->getType() << " "; 910 Str << Opcode << "." << getDest()->getType() << " ";
853 dumpDest(Func); 911 dumpDest(Func);
854 Str << ", "; 912 Str << ", ";
855 dumpSources(Func); 913 dumpSources(Func);
856 } 914 }
857 static bool classof(const Inst *Instr) { return isClassof(Instr, K); } 915 static bool classof(const Inst *Instr) { return isClassof(Instr, K); }
858 916
859 private: 917 private:
860 InstARM32FourAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1) 918 InstARM32FourAddrFP(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1)
861 : InstARM32(Func, K, 3, Dest) { 919 : InstARM32(Func, K, 3, Dest) {
862 addSource(Dest); 920 addSource(Dest);
863 addSource(Src0); 921 addSource(Src0);
864 addSource(Src1); 922 addSource(Src1);
865 } 923 }
866 924
925 FPSign Sign = FS_None;
867 static const char *Opcode; 926 static const char *Opcode;
868 }; 927 };
869 928
870 /// Instructions of the form x cmpop y (setting flags). 929 /// Instructions of the form x cmpop y (setting flags).
871 template <InstARM32::InstKindARM32 K> 930 template <InstARM32::InstKindARM32 K>
872 class InstARM32CmpLike : public InstARM32Pred { 931 class InstARM32CmpLike : public InstARM32Pred {
873 InstARM32CmpLike() = delete; 932 InstARM32CmpLike() = delete;
874 InstARM32CmpLike(const InstARM32CmpLike &) = delete; 933 InstARM32CmpLike(const InstARM32CmpLike &) = delete;
875 InstARM32CmpLike &operator=(const InstARM32CmpLike &) = delete; 934 InstARM32CmpLike &operator=(const InstARM32CmpLike &) = delete;
876 935
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>; 983 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>;
925 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>; 984 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>;
926 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>; 985 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>;
927 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>; 986 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>;
928 using InstARM32Vand = InstARM32ThreeAddrFP<InstARM32::Vand>; 987 using InstARM32Vand = InstARM32ThreeAddrFP<InstARM32::Vand>;
929 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; 988 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>;
930 using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>; 989 using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>;
931 using InstARM32Vmla = InstARM32FourAddrFP<InstARM32::Vmla>; 990 using InstARM32Vmla = InstARM32FourAddrFP<InstARM32::Vmla>;
932 using InstARM32Vmls = InstARM32FourAddrFP<InstARM32::Vmls>; 991 using InstARM32Vmls = InstARM32FourAddrFP<InstARM32::Vmls>;
933 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; 992 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>;
993 using InstARM32Vneg = InstARM32UnaryopSignAwareFP<InstARM32::Vneg>;
934 using InstARM32Vorr = InstARM32ThreeAddrFP<InstARM32::Vorr>; 994 using InstARM32Vorr = InstARM32ThreeAddrFP<InstARM32::Vorr>;
995 using InstARM32Vshl = InstARM32ThreeAddrSignAwareFP<InstARM32::Vshl>;
935 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; 996 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>;
936 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>; 997 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>;
937 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>; 998 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>;
938 /// MovT leaves the bottom bits alone so dest is also a source. This helps 999 /// MovT leaves the bottom bits alone so dest is also a source. This helps
939 /// indicate that a previous MovW setting dest is not dead code. 1000 /// indicate that a previous MovW setting dest is not dead code.
940 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; 1001 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>;
941 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>; 1002 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>;
942 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>; 1003 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>;
943 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>; 1004 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>;
944 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>; 1005 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>;
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 // violations and link errors. 1584 // violations and link errors.
1524 1585
1525 template <> void InstARM32Ldr::emit(const Cfg *Func) const; 1586 template <> void InstARM32Ldr::emit(const Cfg *Func) const;
1526 template <> void InstARM32Movw::emit(const Cfg *Func) const; 1587 template <> void InstARM32Movw::emit(const Cfg *Func) const;
1527 template <> void InstARM32Movt::emit(const Cfg *Func) const; 1588 template <> void InstARM32Movt::emit(const Cfg *Func) const;
1528 1589
1529 } // end of namespace ARM32 1590 } // end of namespace ARM32
1530 } // end of namespace Ice 1591 } // end of namespace Ice
1531 1592
1532 #endif // SUBZERO_SRC_ICEINSTARM32_H 1593 #endif // SUBZERO_SRC_ICEINSTARM32_H
OLDNEW
« no previous file with comments | « src/IceAssemblerARM32.cpp ('k') | src/IceInstARM32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698