OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |