Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index e2498febe9ea46dc5a1dd8f0fe2fb8d483bbe785..7c3e2885e2bb6e9cccbdb359f408b3b9635303ca 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -704,6 +704,24 @@ template <> void InstARM32Vand::emitIAS(const Cfg *Func) const { |
assert(!Asm->needsTextFixup()); |
} |
+template <> void InstARM32Vbsl::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
+ const Variable *Dest = getDest(); |
+ switch (Dest->getType()) { |
+ default: |
+ llvm::report_fatal_error("Vbsl not defined on type " + |
+ typeStdString(Dest->getType())); |
+ case IceType_v4i1: |
+ case IceType_v8i1: |
+ case IceType_v16i1: |
+ case IceType_v16i8: |
+ case IceType_v8i16: |
+ case IceType_v4i32: |
+ Asm->vbslq(Dest, getSrc(0), getSrc(1)); |
+ } |
+ assert(!Asm->needsTextFixup()); |
+} |
+ |
template <> void InstARM32Vdiv::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
const Variable *Dest = getDest(); |
@@ -1496,6 +1514,7 @@ template <> const char *InstARM32Udiv::Opcode = "udiv"; |
// FP |
template <> const char *InstARM32Vadd::Opcode = "vadd"; |
template <> const char *InstARM32Vand::Opcode = "vand"; |
+template <> const char *InstARM32Vbsl::Opcode = "vbsl"; |
template <> const char *InstARM32Vdiv::Opcode = "vdiv"; |
template <> const char *InstARM32Veor::Opcode = "veor"; |
template <> const char *InstARM32Vmla::Opcode = "vmla"; |