| 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 |