Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index f104803b881dfa99bdfa4f1f68151ff2a128d2e7..93bbb2769b2db2e1e7027c614765415e557e2856 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -97,10 +97,6 @@ void InstARM32::emitUsingTextFixup(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
GlobalContext *Ctx = Func->getContext(); |
- if (Ctx->getFlags().getDisableHybridAssembly()) { |
- UnimplementedError(Ctx->getFlags()); |
- return; |
- } |
auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
std::string Buffer; |
llvm::raw_string_ostream StrBuf(Buffer); |
@@ -113,6 +109,11 @@ void InstARM32::emitUsingTextFixup(const Cfg *Func) const { |
Asm->incEmitTextSize(InstSize); |
emit(Func); |
Ctx->setStrEmit(OldStr); |
+ if (Ctx->getFlags().getDisableHybridAssembly()) { |
+ llvm::errs() << "Can't assemble: " << StrBuf.str() << "\n"; |
+ UnimplementedError(Ctx->getFlags()); |
+ return; |
+ } |
Asm->emitTextInst(StrBuf.str(), Asm->getEmitTextSize()); |
} |
@@ -1683,6 +1684,29 @@ template <> void InstARM32Uxt::emitIAS(const Cfg *Func) const { |
emitUsingTextFixup(Func); |
} |
+template <InstARM32::InstKindARM32 K> |
+void InstARM32UnaryopFP<K>::emitIAS(const Cfg *Func) const { |
+ emitUsingTextFixup(Func); |
+} |
+ |
+template <> void InstARM32Vsqrt::emitIAS(const Cfg *Func) const { |
+ assert(getSrcSize() == 1); |
+ auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
+ const Operand *Dest = getDest(); |
+ switch (Dest->getType()) { |
+ case IceType_f32: |
+ Asm->vsqrts(Dest, getSrc(0), getPredicate()); |
+ break; |
+ case IceType_f64: |
+ Asm->vsqrtd(Dest, getSrc(0), getPredicate()); |
+ break; |
+ default: |
+ llvm::report_fatal_error("Vqrt of non-floating type"); |
Jim Stichnoth
2016/01/29 20:48:02
Vsqrt
Karl
2016/01/29 22:00:55
Done.
|
+ } |
+ if (Asm->needsTextFixup()) |
+ emitUsingTextFixup(Func); |
+} |
+ |
const char *InstARM32Pop::getGPROpcode() const { return "pop"; } |
const char *InstARM32Pop::getSRegOpcode() const { return "vpop"; } |