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

Side by Side Diff: src/IceInstARM32.cpp

Issue 1430973003: Fix textual emission of label instructions in ARM assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Remove -unsafe-ias from lit tests that don't need it. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests_lit/assembler/arm32/branch-simple.ll » ('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 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 startNextInst(Func); 835 startNextInst(Func);
836 Str << "\n\t" 836 Str << "\n\t"
837 << "b" 837 << "b"
838 << "\t" << getTargetFalse()->getAsmName(); 838 << "\t" << getTargetFalse()->getAsmName();
839 } 839 }
840 } 840 }
841 } 841 }
842 } 842 }
843 843
844 void InstARM32Br::emitIAS(const Cfg *Func) const { 844 void InstARM32Br::emitIAS(const Cfg *Func) const {
845 if (!Func->getContext()->getFlags().getAllowUnsafeIas())
846 return emitUsingTextFixup(Func);
847 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 845 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
848 if (Label) { 846 if (Label) {
849 Asm->b(Asm->getOrCreateLocalLabel(Label->getNumber()), getPredicate()); 847 Asm->b(Asm->getOrCreateLocalLabel(Label->getNumber()), getPredicate());
850 } else if (isUnconditionalBranch()) { 848 } else if (isUnconditionalBranch()) {
851 Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetFalse()->getIndex()), 849 Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetFalse()->getIndex()),
852 getPredicate()); 850 getPredicate());
853 } else { 851 } else {
854 Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetTrue()->getIndex()), 852 Asm->b(Asm->getOrCreateCfgNodeLabel(getTargetTrue()->getIndex()),
855 getPredicate()); 853 getPredicate());
856 if (const CfgNode *False = getTargetFalse()) 854 if (const CfgNode *False = getTargetFalse())
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 dumpDest(Func); 914 dumpDest(Func);
917 Str << " = "; 915 Str << " = ";
918 } 916 }
919 Str << "call "; 917 Str << "call ";
920 getCallTarget()->dump(Func); 918 getCallTarget()->dump(Func);
921 } 919 }
922 920
923 void InstARM32Label::emit(const Cfg *Func) const { 921 void InstARM32Label::emit(const Cfg *Func) const {
924 if (!BuildDefs::dump()) 922 if (!BuildDefs::dump())
925 return; 923 return;
924 // A label is not really an instruction. Hence, we need to fix the
925 // emitted text size.
926 if (auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>())
927 Asm->decEmitTextSize(InstSize);
926 Ostream &Str = Func->getContext()->getStrEmit(); 928 Ostream &Str = Func->getContext()->getStrEmit();
927 Str << getName(Func) << ":"; 929 Str << getName(Func) << ":";
928 } 930 }
929 931
930 void InstARM32Label::emitIAS(const Cfg *Func) const { 932 void InstARM32Label::emitIAS(const Cfg *Func) const {
931 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 933 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
932 Asm->bindLocalLabel(Func, this, Number); 934 Asm->bindLocalLabel(Func, this, Number);
933 if (Asm->needsTextFixup()) 935 if (Asm->needsTextFixup())
934 emitUsingTextFixup(Func); 936 emitUsingTextFixup(Func);
935 } 937 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 Constant *Src0 = llvm::cast<Constant>(getSrc(0)); 1020 Constant *Src0 = llvm::cast<Constant>(getSrc(0));
1019 if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Src0)) { 1021 if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Src0)) {
1020 Str << "#:lower16:"; 1022 Str << "#:lower16:";
1021 CR->emitWithoutPrefix(Func->getTarget()); 1023 CR->emitWithoutPrefix(Func->getTarget());
1022 } else { 1024 } else {
1023 Src0->emit(Func); 1025 Src0->emit(Func);
1024 } 1026 }
1025 } 1027 }
1026 1028
1027 template <> void InstARM32Movw::emitIAS(const Cfg *Func) const { 1029 template <> void InstARM32Movw::emitIAS(const Cfg *Func) const {
1028 if (!Func->getContext()->getFlags().getAllowUnsafeIas())
1029 return emitUsingTextFixup(Func);
1030 assert(getSrcSize() == 1); 1030 assert(getSrcSize() == 1);
1031 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 1031 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
1032 Asm->movw(getDest(), getSrc(0), getPredicate()); 1032 Asm->movw(getDest(), getSrc(0), getPredicate());
1033 if (Asm->needsTextFixup()) 1033 if (Asm->needsTextFixup())
1034 emitUsingTextFixup(Func); 1034 emitUsingTextFixup(Func);
1035 } 1035 }
1036 1036
1037 template <> void InstARM32Movt::emit(const Cfg *Func) const { 1037 template <> void InstARM32Movt::emit(const Cfg *Func) const {
1038 if (!BuildDefs::dump()) 1038 if (!BuildDefs::dump())
1039 return; 1039 return;
1040 Ostream &Str = Func->getContext()->getStrEmit(); 1040 Ostream &Str = Func->getContext()->getStrEmit();
1041 assert(getSrcSize() == 2); 1041 assert(getSrcSize() == 2);
1042 Variable *Dest = getDest(); 1042 Variable *Dest = getDest();
1043 Constant *Src1 = llvm::cast<Constant>(getSrc(1)); 1043 Constant *Src1 = llvm::cast<Constant>(getSrc(1));
1044 Str << "\t" << Opcode << getPredicate() << "\t"; 1044 Str << "\t" << Opcode << getPredicate() << "\t";
1045 Dest->emit(Func); 1045 Dest->emit(Func);
1046 Str << ", "; 1046 Str << ", ";
1047 if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Src1)) { 1047 if (auto *CR = llvm::dyn_cast<ConstantRelocatable>(Src1)) {
1048 Str << "#:upper16:"; 1048 Str << "#:upper16:";
1049 CR->emitWithoutPrefix(Func->getTarget()); 1049 CR->emitWithoutPrefix(Func->getTarget());
1050 } else { 1050 } else {
1051 Src1->emit(Func); 1051 Src1->emit(Func);
1052 } 1052 }
1053 } 1053 }
1054 1054
1055 template <> void InstARM32Movt::emitIAS(const Cfg *Func) const { 1055 template <> void InstARM32Movt::emitIAS(const Cfg *Func) const {
1056 if (!Func->getContext()->getFlags().getAllowUnsafeIas())
1057 return emitUsingTextFixup(Func);
1058 assert(getSrcSize() == 2); 1056 assert(getSrcSize() == 2);
1059 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); 1057 auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
1060 Asm->movt(getDest(), getSrc(1), getPredicate()); 1058 Asm->movt(getDest(), getSrc(1), getPredicate());
1061 if (Asm->needsTextFixup()) 1059 if (Asm->needsTextFixup())
1062 emitUsingTextFixup(Func); 1060 emitUsingTextFixup(Func);
1063 } 1061 }
1064 1062
1065 void InstARM32Pop::emit(const Cfg *Func) const { 1063 void InstARM32Pop::emit(const Cfg *Func) const {
1066 // TODO(jpp): Improve FP register save/restore. 1064 // TODO(jpp): Improve FP register save/restore.
1067 if (!BuildDefs::dump()) 1065 if (!BuildDefs::dump())
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
1627 template class InstARM32UnaryopGPR<InstARM32::Uxt, true>; 1625 template class InstARM32UnaryopGPR<InstARM32::Uxt, true>;
1628 template class InstARM32UnaryopFP<InstARM32::Vsqrt>; 1626 template class InstARM32UnaryopFP<InstARM32::Vsqrt>;
1629 1627
1630 template class InstARM32FourAddrGPR<InstARM32::Mla>; 1628 template class InstARM32FourAddrGPR<InstARM32::Mla>;
1631 template class InstARM32FourAddrGPR<InstARM32::Mls>; 1629 template class InstARM32FourAddrGPR<InstARM32::Mls>;
1632 1630
1633 template class InstARM32CmpLike<InstARM32::Cmp>; 1631 template class InstARM32CmpLike<InstARM32::Cmp>;
1634 template class InstARM32CmpLike<InstARM32::Tst>; 1632 template class InstARM32CmpLike<InstARM32::Tst>;
1635 1633
1636 } // end of namespace Ice 1634 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | tests_lit/assembler/arm32/branch-simple.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698