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

Side by Side Diff: src/IceInstARM32.cpp

Issue 1418523002: Add hybrid assembler concept to ARM assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 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 | « src/IceInstARM32.h ('k') | src/IceInstMIPS32.h » ('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.cpp - ARM32 instruction implementation ----===// 1 //===- subzero/src/IceInstARM32.cpp - ARM32 instruction implementation ----===//
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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 77
78 void InstARM32Pred::dumpOpcodePred(Ostream &Str, const char *Opcode, 78 void InstARM32Pred::dumpOpcodePred(Ostream &Str, const char *Opcode,
79 Type Ty) const { 79 Type Ty) const {
80 Str << Opcode << getPredicate() << "." << Ty; 80 Str << Opcode << getPredicate() << "." << Ty;
81 } 81 }
82 82
83 CondARM32::Cond InstARM32::getOppositeCondition(CondARM32::Cond Cond) { 83 CondARM32::Cond InstARM32::getOppositeCondition(CondARM32::Cond Cond) {
84 return InstARM32CondAttributes[Cond].Opposite; 84 return InstARM32CondAttributes[Cond].Opposite;
85 } 85 }
86 86
87 void InstARM32::emitUsingTextFixup(const Cfg *Func) const {
88 if (!BuildDefs::dump())
89 return;
90 GlobalContext *Ctx = Func->getContext();
91 if (Ctx->getFlags().getDisableHybridAssembly()) {
92 UnimplementedError(Ctx->getFlags());
93 return;
94 }
95 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
96 std::string Buffer;
97 llvm::raw_string_ostream StrBuf(Buffer);
98 OstreamLocker L(Ctx);
99 Ostream &OldStr = Ctx->getStrEmit();
100 Ctx->setStrEmit(StrBuf);
101 emit(Func);
102 Ctx->setStrEmit(OldStr);
103 Asm->emitTextInst(StrBuf.str());
104 }
105
106 void InstARM32::emitIAS(const Cfg *Func) const { emitUsingTextFixup(Func); }
107
87 void InstARM32Pred::emitUnaryopGPR(const char *Opcode, 108 void InstARM32Pred::emitUnaryopGPR(const char *Opcode,
88 const InstARM32Pred *Inst, const Cfg *Func, 109 const InstARM32Pred *Inst, const Cfg *Func,
89 bool NeedsWidthSuffix) { 110 bool NeedsWidthSuffix) {
90 Ostream &Str = Func->getContext()->getStrEmit(); 111 Ostream &Str = Func->getContext()->getStrEmit();
91 assert(Inst->getSrcSize() == 1); 112 assert(Inst->getSrcSize() == 1);
92 Type SrcTy = Inst->getSrc(0)->getType(); 113 Type SrcTy = Inst->getSrc(0)->getType();
93 Str << "\t" << Opcode; 114 Str << "\t" << Opcode;
94 if (NeedsWidthSuffix) 115 if (NeedsWidthSuffix)
95 Str << getWidthString(SrcTy); 116 Str << getWidthString(SrcTy);
96 Str << Inst->getPredicate() << "\t"; 117 Str << Inst->getPredicate() << "\t";
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 } 334 }
314 if (TargetTrue == OldNode) { 335 if (TargetTrue == OldNode) {
315 TargetTrue = NewNode; 336 TargetTrue = NewNode;
316 Found = true; 337 Found = true;
317 } 338 }
318 return Found; 339 return Found;
319 } 340 }
320 341
321 template <InstARM32::InstKindARM32 K> 342 template <InstARM32::InstKindARM32 K>
322 void InstARM32ThreeAddrGPR<K>::emitIAS(const Cfg *Func) const { 343 void InstARM32ThreeAddrGPR<K>::emitIAS(const Cfg *Func) const {
323 (void)Func; 344 emitUsingTextFixup(Func);
324 UnimplementedError(Func->getContext()->getFlags());
325 } 345 }
326 346
327 template <> 347 template <>
328 void InstARM32ThreeAddrGPR<InstARM32::Add>::emitIAS(const Cfg *Func) const { 348 void InstARM32ThreeAddrGPR<InstARM32::Add>::emitIAS(const Cfg *Func) const {
329 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 349 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
330 Asm->add(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate()); 350 Asm->add(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate());
351 if (Asm->needsTextFixup())
352 emitUsingTextFixup(Func);
331 } 353 }
332 354
333 template <> 355 template <>
334 void InstARM32ThreeAddrGPR<InstARM32::Sub>::emitIAS(const Cfg *Func) const { 356 void InstARM32ThreeAddrGPR<InstARM32::Sub>::emitIAS(const Cfg *Func) const {
335 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 357 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
336 Asm->sub(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate()); 358 Asm->sub(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate());
359 if (Asm->needsTextFixup())
360 emitUsingTextFixup(Func);
337 } 361 }
338 362
339 InstARM32Call::InstARM32Call(Cfg *Func, Variable *Dest, Operand *CallTarget) 363 InstARM32Call::InstARM32Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
340 : InstARM32(Func, InstARM32::Call, 1, Dest) { 364 : InstARM32(Func, InstARM32::Call, 1, Dest) {
341 HasSideEffects = true; 365 HasSideEffects = true;
342 addSource(CallTarget); 366 addSource(CallTarget);
343 } 367 }
344 368
345 InstARM32Label::InstARM32Label(Cfg *Func, TargetARM32 *Target) 369 InstARM32Label::InstARM32Label(Cfg *Func, TargetARM32 *Target)
346 : InstARM32(Func, InstARM32::Label, 0, nullptr), 370 : InstARM32(Func, InstARM32::Label, 0, nullptr),
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 Src0->emit(Func); 631 Src0->emit(Func);
608 Str << ", "; 632 Str << ", ";
609 Dest->emit(Func); 633 Dest->emit(Func);
610 } 634 }
611 } 635 }
612 636
613 void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const { 637 void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const {
614 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 638 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
615 Variable *Dest = getDest(); 639 Variable *Dest = getDest();
616 Operand *Src0 = getSrc(0); 640 Operand *Src0 = getSrc(0);
617 // Note: Loop is used so that we can short circuit using break. 641 if (Dest->hasReg()) {
618 do { 642 const Type DestTy = Dest->getType();
619 if (Dest->hasReg()) { 643 const bool DestIsVector = isVectorType(DestTy);
620 const Type DestTy = Dest->getType(); 644 const bool DestIsScalarFP = isScalarFloatingType(DestTy);
621 const bool DestIsVector = isVectorType(DestTy); 645 const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
622 const bool DestIsScalarFP = isScalarFloatingType(DestTy); 646 if (DestIsVector || DestIsScalarFP || CoreVFPMove)
623 const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0); 647 return Asm->setNeedsTextFixup();
624 if (DestIsVector || DestIsScalarFP || CoreVFPMove) 648 if (isMemoryAccess(Src0)) {
625 break; 649 // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see
626 if (isMemoryAccess(Src0)) { 650 // emitSingleDestSingleSource, local variable LoadOpcode).
627 // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see 651 return Asm->ldr(Dest, Src0, getPredicate());
628 // emitSingleDestSingleSource, local variable LoadOpcode).
629 Asm->ldr(Dest, Src0, getPredicate());
630 } else {
631 Asm->mov(Dest, Src0, getPredicate());
632 }
633 return;
634 } else {
635 const Type Src0Type = Src0->getType();
636 const bool Src0IsVector = isVectorType(Src0Type);
637 const bool Src0IsScalarFP = isScalarFloatingType(Src0Type);
638 const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
639 if (Src0IsVector || Src0IsScalarFP || CoreVFPMove)
640 break;
641 Asm->str(Src0, Dest, getPredicate());
642 return;
643 } 652 }
644 } while (0); 653 return Asm->mov(Dest, Src0, getPredicate());
645 llvm_unreachable("not yet implemented"); 654 } else {
655 const Type Src0Type = Src0->getType();
656 const bool Src0IsVector = isVectorType(Src0Type);
657 const bool Src0IsScalarFP = isScalarFloatingType(Src0Type);
658 const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
659 if (Src0IsVector || Src0IsScalarFP || CoreVFPMove)
660 return Asm->setNeedsTextFixup();
661 return Asm->str(Src0, Dest, getPredicate());
662 }
663 Asm->setNeedsTextFixup();
646 } 664 }
647 665
648 void InstARM32Mov::emit(const Cfg *Func) const { 666 void InstARM32Mov::emit(const Cfg *Func) const {
649 if (!BuildDefs::dump()) 667 if (!BuildDefs::dump())
650 return; 668 return;
651 assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type."); 669 assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type.");
652 if (isMultiDest()) { 670 if (isMultiDest()) {
653 emitMultiDestSingleSource(Func); 671 emitMultiDestSingleSource(Func);
654 return; 672 return;
655 } 673 }
656 674
657 if (isMultiSource()) { 675 if (isMultiSource()) {
658 emitSingleDestMultiSource(Func); 676 emitSingleDestMultiSource(Func);
659 return; 677 return;
660 } 678 }
661 679
662 emitSingleDestSingleSource(Func); 680 emitSingleDestSingleSource(Func);
663 } 681 }
664 682
665 void InstARM32Mov::emitIAS(const Cfg *Func) const { 683 void InstARM32Mov::emitIAS(const Cfg *Func) const {
666 assert(getSrcSize() == 1); 684 assert(getSrcSize() == 1);
667 (void)Func; 685 (void)Func;
668 assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type."); 686 assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type.");
669 if (isMultiDest()) 687 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
670 llvm_unreachable("Not yet implemented"); 688 if (!(isMultiDest() || isMultiSource())) {
671 if (isMultiSource()) 689 // Must be single source/dest.
672 llvm_unreachable("Not yet implemented"); 690 emitIASSingleDestSingleSource(Func);
673 // Must be single source/dest. 691 }
674 emitIASSingleDestSingleSource(Func); 692 if (Asm->needsTextFixup())
693 emitUsingTextFixup(Func);
675 } 694 }
676 695
677 void InstARM32Mov::dump(const Cfg *Func) const { 696 void InstARM32Mov::dump(const Cfg *Func) const {
678 if (!BuildDefs::dump()) 697 if (!BuildDefs::dump())
679 return; 698 return;
680 assert(getSrcSize() == 1 || getSrcSize() == 2); 699 assert(getSrcSize() == 1 || getSrcSize() == 2);
681 Ostream &Str = Func->getContext()->getStrDump(); 700 Ostream &Str = Func->getContext()->getStrDump();
682 Variable *Dest = getDest(); 701 Variable *Dest = getDest();
683 Variable *DestHi = getDestHi(); 702 Variable *DestHi = getDestHi();
684 Dest->dump(Func); 703 Dest->dump(Func);
(...skipping 23 matching lines...) Expand all
708 Str << getTargetTrue()->getAsmName(); 727 Str << getTargetTrue()->getAsmName();
709 if (getTargetFalse()) { 728 if (getTargetFalse()) {
710 Str << "\n\t" 729 Str << "\n\t"
711 << "b" 730 << "b"
712 << "\t" << getTargetFalse()->getAsmName(); 731 << "\t" << getTargetFalse()->getAsmName();
713 } 732 }
714 } 733 }
715 } 734 }
716 } 735 }
717 736
718 void InstARM32Br::emitIAS(const Cfg *Func) const {
719 (void)Func;
720 llvm_unreachable("Not yet implemented");
721 }
722
723 void InstARM32Br::dump(const Cfg *Func) const { 737 void InstARM32Br::dump(const Cfg *Func) const {
724 if (!BuildDefs::dump()) 738 if (!BuildDefs::dump())
725 return; 739 return;
726 Ostream &Str = Func->getContext()->getStrDump(); 740 Ostream &Str = Func->getContext()->getStrDump();
727 Str << "br "; 741 Str << "br ";
728 742
729 if (getPredicate() == CondARM32::AL) { 743 if (getPredicate() == CondARM32::AL) {
730 Str << "label %" 744 Str << "label %"
731 << (Label ? Label->getName(Func) : getTargetFalse()->getName()); 745 << (Label ? Label->getName(Func) : getTargetFalse()->getName());
732 return; 746 return;
(...skipping 28 matching lines...) Expand all
761 CallTarget->emitWithoutPrefix(Func->getTarget()); 775 CallTarget->emitWithoutPrefix(Func->getTarget());
762 } else { 776 } else {
763 Str << "\t" 777 Str << "\t"
764 << "blx" 778 << "blx"
765 << "\t"; 779 << "\t";
766 getCallTarget()->emit(Func); 780 getCallTarget()->emit(Func);
767 } 781 }
768 Func->getTarget()->resetStackAdjustment(); 782 Func->getTarget()->resetStackAdjustment();
769 } 783 }
770 784
771 void InstARM32Call::emitIAS(const Cfg *Func) const {
772 (void)Func;
773 llvm_unreachable("Not yet implemented");
774 }
775
776 void InstARM32Call::dump(const Cfg *Func) const { 785 void InstARM32Call::dump(const Cfg *Func) const {
777 if (!BuildDefs::dump()) 786 if (!BuildDefs::dump())
778 return; 787 return;
779 Ostream &Str = Func->getContext()->getStrDump(); 788 Ostream &Str = Func->getContext()->getStrDump();
780 if (getDest()) { 789 if (getDest()) {
781 dumpDest(Func); 790 dumpDest(Func);
782 Str << " = "; 791 Str << " = ";
783 } 792 }
784 Str << "call "; 793 Str << "call ";
785 getCallTarget()->dump(Func); 794 getCallTarget()->dump(Func);
786 } 795 }
787 796
788 void InstARM32Label::emit(const Cfg *Func) const { 797 void InstARM32Label::emit(const Cfg *Func) const {
789 if (!BuildDefs::dump()) 798 if (!BuildDefs::dump())
790 return; 799 return;
791 Ostream &Str = Func->getContext()->getStrEmit(); 800 Ostream &Str = Func->getContext()->getStrEmit();
792 Str << getName(Func) << ":"; 801 Str << getName(Func) << ":";
793 } 802 }
794 803
795 void InstARM32Label::emitIAS(const Cfg *Func) const {
796 (void)Func;
797 llvm_unreachable("Not yet implemented");
798 }
799
800 void InstARM32Label::dump(const Cfg *Func) const { 804 void InstARM32Label::dump(const Cfg *Func) const {
801 if (!BuildDefs::dump()) 805 if (!BuildDefs::dump())
802 return; 806 return;
803 Ostream &Str = Func->getContext()->getStrDump(); 807 Ostream &Str = Func->getContext()->getStrDump();
804 Str << getName(Func) << ":"; 808 Str << getName(Func) << ":";
805 } 809 }
806 810
807 template <> void InstARM32Ldr::emit(const Cfg *Func) const { 811 template <> void InstARM32Ldr::emit(const Cfg *Func) const {
808 if (!BuildDefs::dump()) 812 if (!BuildDefs::dump())
809 return; 813 return;
810 Ostream &Str = Func->getContext()->getStrEmit(); 814 Ostream &Str = Func->getContext()->getStrEmit();
811 assert(getSrcSize() == 1); 815 assert(getSrcSize() == 1);
812 assert(getDest()->hasReg()); 816 assert(getDest()->hasReg());
813 Variable *Dest = getDest(); 817 Variable *Dest = getDest();
814 Type DestTy = Dest->getType(); 818 Type DestTy = Dest->getType();
815 const bool DestIsVector = isVectorType(DestTy); 819 const bool DestIsVector = isVectorType(DestTy);
816 const bool DestIsScalarFloat = isScalarFloatingType(DestTy); 820 const bool DestIsScalarFloat = isScalarFloatingType(DestTy);
817 const char *ActualOpcode = 821 const char *ActualOpcode =
818 DestIsVector ? "vld1" : (DestIsScalarFloat ? "vldr" : "ldr"); 822 DestIsVector ? "vld1" : (DestIsScalarFloat ? "vldr" : "ldr");
819 const char *VectorMarker = DestIsVector ? ".64" : ""; 823 const char *VectorMarker = DestIsVector ? ".64" : "";
820 const char *WidthString = DestIsVector ? "" : getWidthString(DestTy); 824 const char *WidthString = DestIsVector ? "" : getWidthString(DestTy);
821 Str << "\t" << ActualOpcode << WidthString << getPredicate() << VectorMarker 825 Str << "\t" << ActualOpcode << WidthString << getPredicate() << VectorMarker
822 << "\t"; 826 << "\t";
823 getDest()->emit(Func); 827 getDest()->emit(Func);
824 Str << ", "; 828 Str << ", ";
825 getSrc(0)->emit(Func); 829 getSrc(0)->emit(Func);
826 } 830 }
827 831
828 template <> void InstARM32Ldr::emitIAS(const Cfg *Func) const {
829 assert(getSrcSize() == 1);
830 (void)Func;
831 llvm_unreachable("Not yet implemented");
832 }
833
834 template <> void InstARM32Ldrex::emit(const Cfg *Func) const { 832 template <> void InstARM32Ldrex::emit(const Cfg *Func) const {
835 if (!BuildDefs::dump()) 833 if (!BuildDefs::dump())
836 return; 834 return;
837 Ostream &Str = Func->getContext()->getStrEmit(); 835 Ostream &Str = Func->getContext()->getStrEmit();
838 assert(getSrcSize() == 1); 836 assert(getSrcSize() == 1);
839 assert(getDest()->hasReg()); 837 assert(getDest()->hasReg());
840 Variable *Dest = getDest(); 838 Variable *Dest = getDest();
841 Type DestTy = Dest->getType(); 839 Type DestTy = Dest->getType();
842 assert(isScalarIntegerType(DestTy)); 840 assert(isScalarIntegerType(DestTy));
843 const char *WidthString = getWidthString(DestTy); 841 const char *WidthString = getWidthString(DestTy);
844 Str << "\t" << Opcode << WidthString << getPredicate() << "\t"; 842 Str << "\t" << Opcode << WidthString << getPredicate() << "\t";
845 getDest()->emit(Func); 843 getDest()->emit(Func);
846 Str << ", "; 844 Str << ", ";
847 getSrc(0)->emit(Func); 845 getSrc(0)->emit(Func);
848 } 846 }
849 847
850 template <> void InstARM32Ldrex::emitIAS(const Cfg *Func) const { 848 template <InstARM32::InstKindARM32 K>
851 assert(getSrcSize() == 1); 849 void InstARM32TwoAddrGPR<K>::emitIAS(const Cfg *Func) const {
852 (void)Func; 850 emitUsingTextFixup(Func);
853 llvm_unreachable("Not yet implemented");
854 } 851 }
855 852
856 template <> void InstARM32Movw::emit(const Cfg *Func) const { 853 template <> void InstARM32Movw::emit(const Cfg *Func) const {
857 if (!BuildDefs::dump()) 854 if (!BuildDefs::dump())
858 return; 855 return;
859 Ostream &Str = Func->getContext()->getStrEmit(); 856 Ostream &Str = Func->getContext()->getStrEmit();
860 assert(getSrcSize() == 1); 857 assert(getSrcSize() == 1);
861 Str << "\t" << Opcode << getPredicate() << "\t"; 858 Str << "\t" << Opcode << getPredicate() << "\t";
862 getDest()->emit(Func); 859 getDest()->emit(Func);
863 Str << ", "; 860 Str << ", ";
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 if (isScalarIntegerType(Op->getType())) 916 if (isScalarIntegerType(Op->getType()))
920 continue; 917 continue;
921 Str << "\t" 918 Str << "\t"
922 << "vpop" 919 << "vpop"
923 << "\t{"; 920 << "\t{";
924 Op->emit(Func); 921 Op->emit(Func);
925 Str << "}\n"; 922 Str << "}\n";
926 } 923 }
927 } 924 }
928 925
929 void InstARM32Pop::emitIAS(const Cfg *Func) const {
930 (void)Func;
931 llvm_unreachable("Not yet implemented");
932 }
933
934 void InstARM32Pop::dump(const Cfg *Func) const { 926 void InstARM32Pop::dump(const Cfg *Func) const {
935 if (!BuildDefs::dump()) 927 if (!BuildDefs::dump())
936 return; 928 return;
937 Ostream &Str = Func->getContext()->getStrDump(); 929 Ostream &Str = Func->getContext()->getStrDump();
938 Str << "pop" 930 Str << "pop"
939 << " "; 931 << " ";
940 for (SizeT I = 0; I < Dests.size(); ++I) { 932 for (SizeT I = 0; I < Dests.size(); ++I) {
941 if (I > 0) 933 if (I > 0)
942 Str << ", "; 934 Str << ", ";
943 Dests[I]->dump(Func); 935 Dests[I]->dump(Func);
944 } 936 }
945 } 937 }
946 938
947 void InstARM32AdjustStack::emit(const Cfg *Func) const { 939 void InstARM32AdjustStack::emit(const Cfg *Func) const {
948 if (!BuildDefs::dump()) 940 if (!BuildDefs::dump())
949 return; 941 return;
950 Ostream &Str = Func->getContext()->getStrEmit(); 942 Ostream &Str = Func->getContext()->getStrEmit();
951 assert(getSrcSize() == 2); 943 assert(getSrcSize() == 2);
952 Str << "\t" 944 Str << "\t"
953 << "sub" 945 << "sub"
954 << "\t"; 946 << "\t";
955 getDest()->emit(Func); 947 getDest()->emit(Func);
956 Str << ", "; 948 Str << ", ";
957 getSrc(0)->emit(Func); 949 getSrc(0)->emit(Func);
958 Str << ", "; 950 Str << ", ";
959 getSrc(1)->emit(Func); 951 getSrc(1)->emit(Func);
960 Func->getTarget()->updateStackAdjustment(Amount); 952 Func->getTarget()->updateStackAdjustment(Amount);
961 } 953 }
962 954
963 void InstARM32AdjustStack::emitIAS(const Cfg *Func) const {
964 (void)Func;
965 llvm_unreachable("Not yet implemented");
966 Func->getTarget()->updateStackAdjustment(Amount);
967 }
968
969 void InstARM32AdjustStack::dump(const Cfg *Func) const { 955 void InstARM32AdjustStack::dump(const Cfg *Func) const {
970 if (!BuildDefs::dump()) 956 if (!BuildDefs::dump())
971 return; 957 return;
972 Ostream &Str = Func->getContext()->getStrDump(); 958 Ostream &Str = Func->getContext()->getStrDump();
973 getDest()->dump(Func); 959 getDest()->dump(Func);
974 Str << " = sub.i32 "; 960 Str << " = sub.i32 ";
975 getSrc(0)->dump(Func); 961 getSrc(0)->dump(Func);
976 Str << ", " << Amount << " ; "; 962 Str << ", " << Amount << " ; ";
977 getSrc(1)->dump(Func); 963 getSrc(1)->dump(Func);
978 } 964 }
(...skipping 30 matching lines...) Expand all
1009 if (PrintComma) 995 if (PrintComma)
1010 Str << ", "; 996 Str << ", ";
1011 Op->emit(Func); 997 Op->emit(Func);
1012 PrintComma = true; 998 PrintComma = true;
1013 } 999 }
1014 } 1000 }
1015 Str << "}\n"; 1001 Str << "}\n";
1016 } 1002 }
1017 } 1003 }
1018 1004
1019 void InstARM32Push::emitIAS(const Cfg *Func) const {
1020 (void)Func;
1021 llvm_unreachable("Not yet implemented");
1022 }
1023
1024 void InstARM32Push::dump(const Cfg *Func) const { 1005 void InstARM32Push::dump(const Cfg *Func) const {
1025 if (!BuildDefs::dump()) 1006 if (!BuildDefs::dump())
1026 return; 1007 return;
1027 Ostream &Str = Func->getContext()->getStrDump(); 1008 Ostream &Str = Func->getContext()->getStrDump();
1028 Str << "push" 1009 Str << "push"
1029 << " "; 1010 << " ";
1030 dumpSources(Func); 1011 dumpSources(Func);
1031 } 1012 }
1032 1013
1033 void InstARM32Ret::emit(const Cfg *Func) const { 1014 void InstARM32Ret::emit(const Cfg *Func) const {
1034 if (!BuildDefs::dump()) 1015 if (!BuildDefs::dump())
1035 return; 1016 return;
1036 assert(getSrcSize() > 0); 1017 assert(getSrcSize() > 0);
1037 Variable *LR = llvm::cast<Variable>(getSrc(0)); 1018 Variable *LR = llvm::cast<Variable>(getSrc(0));
1038 assert(LR->hasReg()); 1019 assert(LR->hasReg());
1039 assert(LR->getRegNum() == RegARM32::Reg_lr); 1020 assert(LR->getRegNum() == RegARM32::Reg_lr);
1040 Ostream &Str = Func->getContext()->getStrEmit(); 1021 Ostream &Str = Func->getContext()->getStrEmit();
1041 Str << "\t" 1022 Str << "\t"
1042 << "bx" 1023 << "bx"
1043 << "\t"; 1024 << "\t";
1044 LR->emit(Func); 1025 LR->emit(Func);
1045 } 1026 }
1046 1027
1047 void InstARM32Ret::emitIAS(const Cfg *Func) const { 1028 void InstARM32Ret::emitIAS(const Cfg *Func) const {
1048 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 1029 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
1049 Asm->bx(RegARM32::Encoded_Reg_lr); 1030 Asm->bx(RegARM32::Encoded_Reg_lr);
1031 if (Asm->needsTextFixup())
1032 emitUsingTextFixup(Func);
1050 } 1033 }
1051 1034
1052 void InstARM32Ret::dump(const Cfg *Func) const { 1035 void InstARM32Ret::dump(const Cfg *Func) const {
1053 if (!BuildDefs::dump()) 1036 if (!BuildDefs::dump())
1054 return; 1037 return;
1055 Ostream &Str = Func->getContext()->getStrDump(); 1038 Ostream &Str = Func->getContext()->getStrDump();
1056 Type Ty = (getSrcSize() == 1 ? IceType_void : getSrc(0)->getType()); 1039 Type Ty = (getSrcSize() == 1 ? IceType_void : getSrc(0)->getType());
1057 Str << "ret." << Ty << " "; 1040 Str << "ret." << Ty << " ";
1058 dumpSources(Func); 1041 dumpSources(Func);
1059 } 1042 }
1060 1043
1061 void InstARM32Str::emit(const Cfg *Func) const { 1044 void InstARM32Str::emit(const Cfg *Func) const {
1062 if (!BuildDefs::dump()) 1045 if (!BuildDefs::dump())
1063 return; 1046 return;
1064 Ostream &Str = Func->getContext()->getStrEmit(); 1047 Ostream &Str = Func->getContext()->getStrEmit();
1065 assert(getSrcSize() == 2); 1048 assert(getSrcSize() == 2);
1066 Type Ty = getSrc(0)->getType(); 1049 Type Ty = getSrc(0)->getType();
1067 const bool IsVectorStore = isVectorType(Ty); 1050 const bool IsVectorStore = isVectorType(Ty);
1068 const char *Opcode = 1051 const char *Opcode =
1069 IsVectorStore ? "vst1" : (isScalarFloatingType(Ty) ? "vstr" : "str"); 1052 IsVectorStore ? "vst1" : (isScalarFloatingType(Ty) ? "vstr" : "str");
1070 const char *VecEltWidthString = IsVectorStore ? ".64" : ""; 1053 const char *VecEltWidthString = IsVectorStore ? ".64" : "";
1071 Str << "\t" << Opcode << getWidthString(Ty) << getPredicate() 1054 Str << "\t" << Opcode << getWidthString(Ty) << getPredicate()
1072 << VecEltWidthString << "\t"; 1055 << VecEltWidthString << "\t";
1073 getSrc(0)->emit(Func); 1056 getSrc(0)->emit(Func);
1074 Str << ", "; 1057 Str << ", ";
1075 getSrc(1)->emit(Func); 1058 getSrc(1)->emit(Func);
1076 } 1059 }
1077 1060
1078 void InstARM32Str::emitIAS(const Cfg *Func) const {
1079 assert(getSrcSize() == 2);
1080 (void)Func;
1081 llvm_unreachable("Not yet implemented");
1082 }
1083
1084 void InstARM32Str::dump(const Cfg *Func) const { 1061 void InstARM32Str::dump(const Cfg *Func) const {
1085 if (!BuildDefs::dump()) 1062 if (!BuildDefs::dump())
1086 return; 1063 return;
1087 Ostream &Str = Func->getContext()->getStrDump(); 1064 Ostream &Str = Func->getContext()->getStrDump();
1088 Type Ty = getSrc(0)->getType(); 1065 Type Ty = getSrc(0)->getType();
1089 dumpOpcodePred(Str, "str", Ty); 1066 dumpOpcodePred(Str, "str", Ty);
1090 Str << " "; 1067 Str << " ";
1091 getSrc(1)->dump(Func); 1068 getSrc(1)->dump(Func);
1092 Str << ", "; 1069 Str << ", ";
1093 getSrc(0)->dump(Func); 1070 getSrc(0)->dump(Func);
1094 } 1071 }
1095 1072
1096 void InstARM32Strex::emit(const Cfg *Func) const { 1073 void InstARM32Strex::emit(const Cfg *Func) const {
1097 if (!BuildDefs::dump()) 1074 if (!BuildDefs::dump())
1098 return; 1075 return;
1099 assert(getSrcSize() == 2); 1076 assert(getSrcSize() == 2);
1100 Type Ty = getSrc(0)->getType(); 1077 Type Ty = getSrc(0)->getType();
1101 assert(isScalarIntegerType(Ty)); 1078 assert(isScalarIntegerType(Ty));
1102 Variable *Dest = getDest(); 1079 Variable *Dest = getDest();
1103 Ostream &Str = Func->getContext()->getStrEmit(); 1080 Ostream &Str = Func->getContext()->getStrEmit();
1104 static constexpr char Opcode[] = "strex"; 1081 static constexpr char Opcode[] = "strex";
1105 const char *WidthString = getWidthString(Ty); 1082 const char *WidthString = getWidthString(Ty);
1106 Str << "\t" << Opcode << WidthString << getPredicate() << "\t"; 1083 Str << "\t" << Opcode << WidthString << getPredicate() << "\t";
1107 Dest->emit(Func); 1084 Dest->emit(Func);
1108 Str << ", "; 1085 Str << ", ";
1109 emitSources(Func); 1086 emitSources(Func);
1110 } 1087 }
1111 1088
1112 void InstARM32Strex::emitIAS(const Cfg *Func) const {
1113 assert(getSrcSize() == 2);
1114 (void)Func;
1115 llvm_unreachable("Not yet implemented");
1116 }
1117
1118 void InstARM32Strex::dump(const Cfg *Func) const { 1089 void InstARM32Strex::dump(const Cfg *Func) const {
1119 if (!BuildDefs::dump()) 1090 if (!BuildDefs::dump())
1120 return; 1091 return;
1121 Ostream &Str = Func->getContext()->getStrDump(); 1092 Ostream &Str = Func->getContext()->getStrDump();
1122 Variable *Dest = getDest(); 1093 Variable *Dest = getDest();
1123 Dest->dump(Func); 1094 Dest->dump(Func);
1124 Str << " = "; 1095 Str << " = ";
1125 Type Ty = getSrc(0)->getType(); 1096 Type Ty = getSrc(0)->getType();
1126 dumpOpcodePred(Str, "strex", Ty); 1097 dumpOpcodePred(Str, "strex", Ty);
1127 Str << " "; 1098 Str << " ";
1128 getSrc(1)->dump(Func); 1099 getSrc(1)->dump(Func);
1129 Str << ", "; 1100 Str << ", ";
1130 getSrc(0)->dump(Func); 1101 getSrc(0)->dump(Func);
1131 } 1102 }
1132 1103
1133 void InstARM32Trap::emit(const Cfg *Func) const { 1104 void InstARM32Trap::emit(const Cfg *Func) const {
1134 if (!BuildDefs::dump()) 1105 if (!BuildDefs::dump())
1135 return; 1106 return;
1136 Ostream &Str = Func->getContext()->getStrEmit(); 1107 Ostream &Str = Func->getContext()->getStrEmit();
1137 assert(getSrcSize() == 0); 1108 assert(getSrcSize() == 0);
1138 // There isn't a mnemonic for the special NaCl Trap encoding, so dump 1109 // There isn't a mnemonic for the special NaCl Trap encoding, so dump
1139 // the raw bytes. 1110 // the raw bytes.
1140 Str << "\t.long 0x"; 1111 Str << "\t.long 0x";
1141 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 1112 ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
1142 for (uint8_t I : Asm->getNonExecBundlePadding()) { 1113 for (uint8_t I : Asm->getNonExecBundlePadding()) {
1143 Str.write_hex(I); 1114 Str.write_hex(I);
1144 } 1115 }
1145 } 1116 }
1146 1117
1147 void InstARM32Trap::emitIAS(const Cfg *Func) const {
1148 assert(getSrcSize() == 0);
1149 (void)Func;
1150 llvm_unreachable("Not yet implemented");
1151 }
1152
1153 void InstARM32Trap::dump(const Cfg *Func) const { 1118 void InstARM32Trap::dump(const Cfg *Func) const {
1154 if (!BuildDefs::dump()) 1119 if (!BuildDefs::dump())
1155 return; 1120 return;
1156 Ostream &Str = Func->getContext()->getStrDump(); 1121 Ostream &Str = Func->getContext()->getStrDump();
1157 Str << "trap"; 1122 Str << "trap";
1158 } 1123 }
1159 1124
1160 void InstARM32Umull::emit(const Cfg *Func) const { 1125 void InstARM32Umull::emit(const Cfg *Func) const {
1161 if (!BuildDefs::dump()) 1126 if (!BuildDefs::dump())
1162 return; 1127 return;
1163 Ostream &Str = Func->getContext()->getStrEmit(); 1128 Ostream &Str = Func->getContext()->getStrEmit();
1164 assert(getSrcSize() == 2); 1129 assert(getSrcSize() == 2);
1165 assert(getDest()->hasReg()); 1130 assert(getDest()->hasReg());
1166 Str << "\t" 1131 Str << "\t"
1167 << "umull" << getPredicate() << "\t"; 1132 << "umull" << getPredicate() << "\t";
1168 getDest()->emit(Func); 1133 getDest()->emit(Func);
1169 Str << ", "; 1134 Str << ", ";
1170 DestHi->emit(Func); 1135 DestHi->emit(Func);
1171 Str << ", "; 1136 Str << ", ";
1172 getSrc(0)->emit(Func); 1137 getSrc(0)->emit(Func);
1173 Str << ", "; 1138 Str << ", ";
1174 getSrc(1)->emit(Func); 1139 getSrc(1)->emit(Func);
1175 } 1140 }
1176 1141
1177 void InstARM32Umull::emitIAS(const Cfg *Func) const {
1178 assert(getSrcSize() == 2);
1179 (void)Func;
1180 llvm_unreachable("Not yet implemented");
1181 }
1182
1183 void InstARM32Umull::dump(const Cfg *Func) const { 1142 void InstARM32Umull::dump(const Cfg *Func) const {
1184 if (!BuildDefs::dump()) 1143 if (!BuildDefs::dump())
1185 return; 1144 return;
1186 Ostream &Str = Func->getContext()->getStrDump(); 1145 Ostream &Str = Func->getContext()->getStrDump();
1187 dumpDest(Func); 1146 dumpDest(Func);
1188 Str << " = "; 1147 Str << " = ";
1189 dumpOpcodePred(Str, "umull", getDest()->getType()); 1148 dumpOpcodePred(Str, "umull", getDest()->getType());
1190 Str << " "; 1149 Str << " ";
1191 dumpSources(Func); 1150 dumpSources(Func);
1192 } 1151 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 Ostream &Str = Func->getContext()->getStrEmit(); 1184 Ostream &Str = Func->getContext()->getStrEmit();
1226 assert(getSrcSize() == 1); 1185 assert(getSrcSize() == 1);
1227 assert(getDest()->hasReg()); 1186 assert(getDest()->hasReg());
1228 Str << "\t" 1187 Str << "\t"
1229 << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << "\t"; 1188 << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << "\t";
1230 getDest()->emit(Func); 1189 getDest()->emit(Func);
1231 Str << ", "; 1190 Str << ", ";
1232 getSrc(0)->emit(Func); 1191 getSrc(0)->emit(Func);
1233 } 1192 }
1234 1193
1235 void InstARM32Vcvt::emitIAS(const Cfg *Func) const {
1236 assert(getSrcSize() == 1);
1237 (void)Func;
1238 llvm_unreachable("Not yet implemented");
1239 }
1240
1241 void InstARM32Vcvt::dump(const Cfg *Func) const { 1194 void InstARM32Vcvt::dump(const Cfg *Func) const {
1242 if (!BuildDefs::dump()) 1195 if (!BuildDefs::dump())
1243 return; 1196 return;
1244 Ostream &Str = Func->getContext()->getStrDump(); 1197 Ostream &Str = Func->getContext()->getStrDump();
1245 dumpDest(Func); 1198 dumpDest(Func);
1246 Str << " = " 1199 Str << " = "
1247 << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << " "; 1200 << "vcvt" << getPredicate() << vcvtVariantSuffix(Variant) << " ";
1248 dumpSources(Func); 1201 dumpSources(Func);
1249 } 1202 }
1250 1203
1251 void InstARM32Vcmp::emit(const Cfg *Func) const { 1204 void InstARM32Vcmp::emit(const Cfg *Func) const {
1252 if (!BuildDefs::dump()) 1205 if (!BuildDefs::dump())
1253 return; 1206 return;
1254 Ostream &Str = Func->getContext()->getStrEmit(); 1207 Ostream &Str = Func->getContext()->getStrEmit();
1255 assert(getSrcSize() == 2); 1208 assert(getSrcSize() == 2);
1256 Str << "\t" 1209 Str << "\t"
1257 "vcmp" << getPredicate() << getVecWidthString(getSrc(0)->getType()) 1210 "vcmp" << getPredicate() << getVecWidthString(getSrc(0)->getType())
1258 << "\t"; 1211 << "\t";
1259 getSrc(0)->emit(Func); 1212 getSrc(0)->emit(Func);
1260 Str << ", "; 1213 Str << ", ";
1261 getSrc(1)->emit(Func); 1214 getSrc(1)->emit(Func);
1262 } 1215 }
1263 1216
1264 void InstARM32Vcmp::emitIAS(const Cfg *Func) const {
1265 assert(getSrcSize() == 2);
1266 (void)Func;
1267 llvm_unreachable("Not yet implemented");
1268 }
1269
1270 void InstARM32Vcmp::dump(const Cfg *Func) const { 1217 void InstARM32Vcmp::dump(const Cfg *Func) const {
1271 if (!BuildDefs::dump()) 1218 if (!BuildDefs::dump())
1272 return; 1219 return;
1273 Ostream &Str = Func->getContext()->getStrDump(); 1220 Ostream &Str = Func->getContext()->getStrDump();
1274 Str << "vcmp" << getPredicate() << getVecWidthString(getSrc(0)->getType()); 1221 Str << "vcmp" << getPredicate() << getVecWidthString(getSrc(0)->getType());
1275 dumpSources(Func); 1222 dumpSources(Func);
1276 } 1223 }
1277 1224
1278 void InstARM32Vmrs::emit(const Cfg *Func) const { 1225 void InstARM32Vmrs::emit(const Cfg *Func) const {
1279 if (!BuildDefs::dump()) 1226 if (!BuildDefs::dump())
1280 return; 1227 return;
1281 Ostream &Str = Func->getContext()->getStrEmit(); 1228 Ostream &Str = Func->getContext()->getStrEmit();
1282 assert(getSrcSize() == 0); 1229 assert(getSrcSize() == 0);
1283 Str << "\t" 1230 Str << "\t"
1284 "vmrs" << getPredicate() << "\t" 1231 "vmrs" << getPredicate() << "\t"
1285 "APSR_nzcv" 1232 "APSR_nzcv"
1286 ", " 1233 ", "
1287 "FPSCR"; 1234 "FPSCR";
1288 } 1235 }
1289 1236
1290 void InstARM32Vmrs::emitIAS(const Cfg *Func) const {
1291 assert(getSrcSize() == 0);
1292 (void)Func;
1293 llvm_unreachable("Not yet implemented");
1294 }
1295
1296 void InstARM32Vmrs::dump(const Cfg *Func) const { 1237 void InstARM32Vmrs::dump(const Cfg *Func) const {
1297 if (!BuildDefs::dump()) 1238 if (!BuildDefs::dump())
1298 return; 1239 return;
1299 Ostream &Str = Func->getContext()->getStrDump(); 1240 Ostream &Str = Func->getContext()->getStrDump();
1300 Str << "APSR{n,z,v,c} = vmrs" << getPredicate() << "\t" 1241 Str << "APSR{n,z,v,c} = vmrs" << getPredicate() << "\t"
1301 "FPSCR{n,z,c,v}"; 1242 "FPSCR{n,z,c,v}";
1302 } 1243 }
1303 1244
1304 void InstARM32Vabs::emit(const Cfg *Func) const { 1245 void InstARM32Vabs::emit(const Cfg *Func) const {
1305 if (!BuildDefs::dump()) 1246 if (!BuildDefs::dump())
1306 return; 1247 return;
1307 Ostream &Str = Func->getContext()->getStrEmit(); 1248 Ostream &Str = Func->getContext()->getStrEmit();
1308 assert(getSrcSize() == 1); 1249 assert(getSrcSize() == 1);
1309 Str << "\t" 1250 Str << "\t"
1310 "vabs" << getPredicate() << getVecWidthString(getSrc(0)->getType()) 1251 "vabs" << getPredicate() << getVecWidthString(getSrc(0)->getType())
1311 << "\t"; 1252 << "\t";
1312 getDest()->emit(Func); 1253 getDest()->emit(Func);
1313 Str << ", "; 1254 Str << ", ";
1314 getSrc(0)->emit(Func); 1255 getSrc(0)->emit(Func);
1315 } 1256 }
1316 1257
1317 void InstARM32Vabs::emitIAS(const Cfg *Func) const {
1318 assert(getSrcSize() == 1);
1319 (void)Func;
1320 llvm_unreachable("Not yet implemented");
1321 }
1322
1323 void InstARM32Vabs::dump(const Cfg *Func) const { 1258 void InstARM32Vabs::dump(const Cfg *Func) const {
1324 if (!BuildDefs::dump()) 1259 if (!BuildDefs::dump())
1325 return; 1260 return;
1326 Ostream &Str = Func->getContext()->getStrDump(); 1261 Ostream &Str = Func->getContext()->getStrDump();
1327 dumpDest(Func); 1262 dumpDest(Func);
1328 Str << " = vabs" << getPredicate() << getVecWidthString(getSrc(0)->getType()); 1263 Str << " = vabs" << getPredicate() << getVecWidthString(getSrc(0)->getType());
1329 } 1264 }
1330 1265
1331 void InstARM32Dmb::emit(const Cfg *Func) const { 1266 void InstARM32Dmb::emit(const Cfg *Func) const {
1332 if (!BuildDefs::dump()) 1267 if (!BuildDefs::dump())
1333 return; 1268 return;
1334 Ostream &Str = Func->getContext()->getStrEmit(); 1269 Ostream &Str = Func->getContext()->getStrEmit();
1335 assert(getSrcSize() == 0); 1270 assert(getSrcSize() == 0);
1336 Str << "\t" 1271 Str << "\t"
1337 "dmb" 1272 "dmb"
1338 "\t" 1273 "\t"
1339 "sy"; 1274 "sy";
1340 } 1275 }
1341 1276
1342 void InstARM32Dmb::emitIAS(const Cfg *Func) const {
1343 assert(getSrcSize() == 1);
1344 (void)Func;
1345 llvm_unreachable("Not yet implemented");
1346 }
1347
1348 void InstARM32Dmb::dump(const Cfg *Func) const { 1277 void InstARM32Dmb::dump(const Cfg *Func) const {
1349 if (!BuildDefs::dump()) 1278 if (!BuildDefs::dump())
1350 return; 1279 return;
1351 Func->getContext()->getStrDump() << "dmb\tsy"; 1280 Func->getContext()->getStrDump() << "dmb\tsy";
1352 } 1281 }
1353 1282
1354 void OperandARM32Mem::emit(const Cfg *Func) const { 1283 void OperandARM32Mem::emit(const Cfg *Func) const {
1355 if (!BuildDefs::dump()) 1284 if (!BuildDefs::dump())
1356 return; 1285 return;
1357 Ostream &Str = Func->getContext()->getStrEmit(); 1286 Ostream &Str = Func->getContext()->getStrEmit();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 template class InstARM32ThreeAddrGPR<InstARM32::Eor>; 1408 template class InstARM32ThreeAddrGPR<InstARM32::Eor>;
1480 template class InstARM32ThreeAddrGPR<InstARM32::Lsl>; 1409 template class InstARM32ThreeAddrGPR<InstARM32::Lsl>;
1481 template class InstARM32ThreeAddrGPR<InstARM32::Lsr>; 1410 template class InstARM32ThreeAddrGPR<InstARM32::Lsr>;
1482 template class InstARM32ThreeAddrGPR<InstARM32::Mul>; 1411 template class InstARM32ThreeAddrGPR<InstARM32::Mul>;
1483 template class InstARM32ThreeAddrGPR<InstARM32::Orr>; 1412 template class InstARM32ThreeAddrGPR<InstARM32::Orr>;
1484 template class InstARM32ThreeAddrGPR<InstARM32::Rsb>; 1413 template class InstARM32ThreeAddrGPR<InstARM32::Rsb>;
1485 template class InstARM32ThreeAddrGPR<InstARM32::Sbc>; 1414 template class InstARM32ThreeAddrGPR<InstARM32::Sbc>;
1486 template class InstARM32ThreeAddrGPR<InstARM32::Sdiv>; 1415 template class InstARM32ThreeAddrGPR<InstARM32::Sdiv>;
1487 template class InstARM32ThreeAddrGPR<InstARM32::Sub>; 1416 template class InstARM32ThreeAddrGPR<InstARM32::Sub>;
1488 template class InstARM32ThreeAddrGPR<InstARM32::Udiv>; 1417 template class InstARM32ThreeAddrGPR<InstARM32::Udiv>;
1418
1489 template class InstARM32ThreeAddrFP<InstARM32::Vadd>; 1419 template class InstARM32ThreeAddrFP<InstARM32::Vadd>;
1490 template class InstARM32ThreeAddrFP<InstARM32::Vdiv>; 1420 template class InstARM32ThreeAddrFP<InstARM32::Vdiv>;
1491 template class InstARM32ThreeAddrFP<InstARM32::Vmul>; 1421 template class InstARM32ThreeAddrFP<InstARM32::Vmul>;
1492 template class InstARM32ThreeAddrFP<InstARM32::Vsub>; 1422 template class InstARM32ThreeAddrFP<InstARM32::Vsub>;
1493 1423
1424 template class InstARM32TwoAddrGPR<InstARM32::Movt>;
1425
1494 } // end of namespace Ice 1426 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceInstARM32.h ('k') | src/IceInstMIPS32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698