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

Unified Diff: src/IceInstARM32.cpp

Issue 1418523002: Add hybrid assembler concept to ARM assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/IceInstARM32.cpp
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
index d7136b359bb82e39fdb4ca1d5ebebcadb26d42e3..5ed807698c589d4e3a50212dadbaca811b503241 100644
--- a/src/IceInstARM32.cpp
+++ b/src/IceInstARM32.cpp
@@ -84,6 +84,23 @@ CondARM32::Cond InstARM32::getOppositeCondition(CondARM32::Cond Cond) {
return InstARM32CondAttributes[Cond].Opposite;
}
+void InstARM32::emitUsingTextFixup(const Cfg *Func) const {
+ GlobalContext *Ctx = Func->getContext();
+ if (!BuildDefs::dump() || !Ctx->getFlags().getAllowHybridAssembly())
+ UnimplementedError(Ctx->getFlags());
+ std::string Buffer;
+ llvm::raw_string_ostream StrBuf(Buffer);
+ OstreamLocker L(Ctx);
+ Ostream &OldStr = Ctx->getStrEmit();
+ Ctx->setStrEmit(StrBuf);
+ emit(Func);
+ Ctx->setStrEmit(OldStr);
+ ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
+ Asm->emitTextInst(StrBuf.str());
+}
+
+void InstARM32::emitIAS(const Cfg *Func) const { emitUsingTextFixup(Func); }
+
void InstARM32Pred::emitUnaryopGPR(const char *Opcode,
const InstARM32Pred *Inst, const Cfg *Func,
bool NeedsWidthSuffix) {
@@ -320,20 +337,21 @@ bool InstARM32Br::repointEdges(CfgNode *OldNode, CfgNode *NewNode) {
template <InstARM32::InstKindARM32 K>
void InstARM32ThreeAddrGPR<K>::emitIAS(const Cfg *Func) const {
- (void)Func;
- UnimplementedError(Func->getContext()->getFlags());
+ emitUsingTextFixup(Func);
}
template <>
void InstARM32ThreeAddrGPR<InstARM32::Add>::emitIAS(const Cfg *Func) const {
ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
- Asm->add(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate());
+ if (!Asm->add(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate()))
+ emitUsingTextFixup(Func);
}
template <>
void InstARM32ThreeAddrGPR<InstARM32::Sub>::emitIAS(const Cfg *Func) const {
ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
- Asm->sub(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate());
+ if (!Asm->sub(getDest(), getSrc(0), getSrc(1), SetFlags, getPredicate()))
+ emitUsingTextFixup(Func);
}
InstARM32Call::InstARM32Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
@@ -610,39 +628,33 @@ void InstARM32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
}
}
-void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const {
+bool InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const {
ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
Variable *Dest = getDest();
Operand *Src0 = getSrc(0);
- // Note: Loop is used so that we can short circuit using break.
- do {
- if (Dest->hasReg()) {
- const Type DestTy = Dest->getType();
- const bool DestIsVector = isVectorType(DestTy);
- const bool DestIsScalarFP = isScalarFloatingType(DestTy);
- const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
- if (DestIsVector || DestIsScalarFP || CoreVFPMove)
- break;
- if (isMemoryAccess(Src0)) {
- // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see
- // emitSingleDestSingleSource, local variable LoadOpcode).
- Asm->ldr(Dest, Src0, getPredicate());
- } else {
- Asm->mov(Dest, Src0, getPredicate());
- }
- return;
- } else {
- const Type Src0Type = Src0->getType();
- const bool Src0IsVector = isVectorType(Src0Type);
- const bool Src0IsScalarFP = isScalarFloatingType(Src0Type);
- const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
- if (Src0IsVector || Src0IsScalarFP || CoreVFPMove)
- break;
- Asm->str(Src0, Dest, getPredicate());
- return;
+ if (Dest->hasReg()) {
+ const Type DestTy = Dest->getType();
+ const bool DestIsVector = isVectorType(DestTy);
+ const bool DestIsScalarFP = isScalarFloatingType(DestTy);
+ const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
+ if (DestIsVector || DestIsScalarFP || CoreVFPMove)
+ return false;
+ if (isMemoryAccess(Src0)) {
+ // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see
+ // emitSingleDestSingleSource, local variable LoadOpcode).
+ return Asm->ldr(Dest, Src0, getPredicate());
}
- } while (0);
- llvm_unreachable("not yet implemented");
+ return Asm->mov(Dest, Src0, getPredicate());
+ } else {
+ const Type Src0Type = Src0->getType();
+ const bool Src0IsVector = isVectorType(Src0Type);
+ const bool Src0IsScalarFP = isScalarFloatingType(Src0Type);
+ const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
+ if (Src0IsVector || Src0IsScalarFP || CoreVFPMove)
+ return false;
+ return Asm->str(Src0, Dest, getPredicate());
+ }
+ return false;
}
void InstARM32Mov::emit(const Cfg *Func) const {
@@ -666,12 +678,12 @@ void InstARM32Mov::emitIAS(const Cfg *Func) const {
assert(getSrcSize() == 1);
(void)Func;
assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type.");
- if (isMultiDest())
- llvm_unreachable("Not yet implemented");
- if (isMultiSource())
- llvm_unreachable("Not yet implemented");
- // Must be single source/dest.
- emitIASSingleDestSingleSource(Func);
+ if (!(isMultiDest() || isMultiSource())) {
+ // Must be single source/dest.
+ if (emitIASSingleDestSingleSource(Func))
+ return;
+ }
+ emitUsingTextFixup(Func);
}
void InstARM32Mov::dump(const Cfg *Func) const {
@@ -715,11 +727,6 @@ void InstARM32Br::emit(const Cfg *Func) const {
}
}
-void InstARM32Br::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Br::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -768,11 +775,6 @@ void InstARM32Call::emit(const Cfg *Func) const {
Func->getTarget()->resetStackAdjustment();
}
-void InstARM32Call::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Call::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -792,11 +794,6 @@ void InstARM32Label::emit(const Cfg *Func) const {
Str << getName(Func) << ":";
}
-void InstARM32Label::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Label::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -825,12 +822,6 @@ template <> void InstARM32Ldr::emit(const Cfg *Func) const {
getSrc(0)->emit(Func);
}
-template <> void InstARM32Ldr::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 1);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
template <> void InstARM32Ldrex::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -847,10 +838,9 @@ template <> void InstARM32Ldrex::emit(const Cfg *Func) const {
getSrc(0)->emit(Func);
}
-template <> void InstARM32Ldrex::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 1);
- (void)Func;
- llvm_unreachable("Not yet implemented");
+template <InstARM32::InstKindARM32 K>
+void InstARM32TwoAddrGPR<K>::emitIAS(const Cfg *Func) const {
+ emitUsingTextFixup(Func);
}
template <> void InstARM32Movw::emit(const Cfg *Func) const {
@@ -926,11 +916,6 @@ void InstARM32Pop::emit(const Cfg *Func) const {
}
}
-void InstARM32Pop::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Pop::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -960,12 +945,6 @@ void InstARM32AdjustStack::emit(const Cfg *Func) const {
Func->getTarget()->updateStackAdjustment(Amount);
}
-void InstARM32AdjustStack::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
- Func->getTarget()->updateStackAdjustment(Amount);
-}
-
void InstARM32AdjustStack::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1016,11 +995,6 @@ void InstARM32Push::emit(const Cfg *Func) const {
}
}
-void InstARM32Push::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Push::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1046,7 +1020,8 @@ void InstARM32Ret::emit(const Cfg *Func) const {
void InstARM32Ret::emitIAS(const Cfg *Func) const {
ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
- Asm->bx(RegARM32::Encoded_Reg_lr);
+ if (!Asm->bx(RegARM32::Encoded_Reg_lr))
+ emitUsingTextFixup(Func);
}
void InstARM32Ret::dump(const Cfg *Func) const {
@@ -1075,12 +1050,6 @@ void InstARM32Str::emit(const Cfg *Func) const {
getSrc(1)->emit(Func);
}
-void InstARM32Str::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 2);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Str::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1109,12 +1078,6 @@ void InstARM32Strex::emit(const Cfg *Func) const {
emitSources(Func);
}
-void InstARM32Strex::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 2);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Strex::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1144,12 +1107,6 @@ void InstARM32Trap::emit(const Cfg *Func) const {
}
}
-void InstARM32Trap::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 0);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Trap::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1174,12 +1131,6 @@ void InstARM32Umull::emit(const Cfg *Func) const {
getSrc(1)->emit(Func);
}
-void InstARM32Umull::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 2);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Umull::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1232,12 +1183,6 @@ void InstARM32Vcvt::emit(const Cfg *Func) const {
getSrc(0)->emit(Func);
}
-void InstARM32Vcvt::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 1);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Vcvt::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1261,12 +1206,6 @@ void InstARM32Vcmp::emit(const Cfg *Func) const {
getSrc(1)->emit(Func);
}
-void InstARM32Vcmp::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 2);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Vcmp::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1287,12 +1226,6 @@ void InstARM32Vmrs::emit(const Cfg *Func) const {
"FPSCR";
}
-void InstARM32Vmrs::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 0);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Vmrs::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1314,12 +1247,6 @@ void InstARM32Vabs::emit(const Cfg *Func) const {
getSrc(0)->emit(Func);
}
-void InstARM32Vabs::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 1);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Vabs::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1339,12 +1266,6 @@ void InstARM32Dmb::emit(const Cfg *Func) const {
"sy";
}
-void InstARM32Dmb::emitIAS(const Cfg *Func) const {
- assert(getSrcSize() == 1);
- (void)Func;
- llvm_unreachable("Not yet implemented");
-}
-
void InstARM32Dmb::dump(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1486,9 +1407,12 @@ template class InstARM32ThreeAddrGPR<InstARM32::Sbc>;
template class InstARM32ThreeAddrGPR<InstARM32::Sdiv>;
template class InstARM32ThreeAddrGPR<InstARM32::Sub>;
template class InstARM32ThreeAddrGPR<InstARM32::Udiv>;
+
template class InstARM32ThreeAddrFP<InstARM32::Vadd>;
template class InstARM32ThreeAddrFP<InstARM32::Vdiv>;
template class InstARM32ThreeAddrFP<InstARM32::Vmul>;
template class InstARM32ThreeAddrFP<InstARM32::Vsub>;
+template class InstARM32TwoAddrGPR<InstARM32::Movt>;
+
} // end of namespace Ice

Powered by Google App Engine
This is Rietveld 408576698