Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index 4919600ddb228355fd2b09f7deca52563fa18c8e..02cf941bc4708e9848da03bda933ca3f50899066 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -226,6 +226,11 @@ void InstARM32FourAddrGPR<K>::emitIAS(const Cfg *Func) const { |
emitUsingTextFixup(Func); |
} |
+template <InstARM32::InstKindARM32 K> |
+void InstARM32ThreeAddrFP<K>::emitIAS(const Cfg *Func) const { |
+ emitUsingTextFixup(Func); |
+} |
+ |
template <> void InstARM32Mla::emitIAS(const Cfg *Func) const { |
assert(getSrcSize() == 3); |
auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
@@ -592,6 +597,25 @@ template <> void InstARM32Udiv::emitIAS(const Cfg *Func) const { |
emitUsingTextFixup(Func); |
} |
+template <> void InstARM32Vadd::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>(); |
+ const Variable *Dest = getDest(); |
+ switch (Dest->getType()) { |
+ default: |
+ // TODO(kschimpf) Figure if more cases are needed. |
+ Asm->setNeedsTextFixup(); |
+ break; |
+ case IceType_f32: |
+ Asm->vadds(getDest(), getSrc(0), getSrc(1), CondARM32::AL); |
+ break; |
+ case IceType_f64: |
+ Asm->vaddd(getDest(), getSrc(0), getSrc(1), CondARM32::AL); |
+ break; |
+ } |
+ if (Asm->needsTextFixup()) |
+ emitUsingTextFixup(Func); |
+} |
+ |
InstARM32Call::InstARM32Call(Cfg *Func, Variable *Dest, Operand *CallTarget) |
: InstARM32(Func, InstARM32::Call, 1, Dest) { |
HasSideEffects = true; |
@@ -1404,7 +1428,7 @@ void InstARM32Pop::emitIAS(const Cfg *Func) const { |
const Variable *LastDest = nullptr; |
for (const Variable *Var : Dests) { |
assert(Var->hasReg() && "pop only applies to registers"); |
- int32_t Reg = RegARM32::getEncodedGPR(Var->getRegNum()); |
+ int32_t Reg = RegARM32::getEncodedGPReg(Var->getRegNum()); |
LastDest = Var; |
GPRegisters |= (1 << Reg); |
++IntegerCount; |
@@ -1536,7 +1560,7 @@ void InstARM32Push::emitIAS(const Cfg *Func) const { |
const Variable *LastSrc = nullptr; |
for (SizeT Index = 0; Index < getSrcSize(); ++Index) { |
const auto *Var = llvm::cast<Variable>(getSrc(Index)); |
- int32_t Reg = RegARM32::getEncodedGPR(Var->getRegNum()); |
+ int32_t Reg = RegARM32::getEncodedGPReg(Var->getRegNum()); |
assert(Reg != RegARM32::Encoded_Not_GPR); |
LastSrc = Var; |
GPRegisters |= (1 << Reg); |