Index: src/IceTargetLowering.cpp |
diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp |
index d53fbab4e12a01d8179d97bbc3cce298e7ac7fc8..75886d6dd8997693d240c6e878ec52f416402358 100644 |
--- a/src/IceTargetLowering.cpp |
+++ b/src/IceTargetLowering.cpp |
@@ -700,6 +700,39 @@ bool TargetLowering::shouldOptimizeMemIntrins() { |
Ctx->getFlags().getForceMemIntrinOpt(); |
} |
+void TargetLowering::scalarizeArithmetic(InstArithmetic::OpKind Kind, |
+ Variable *Dest, Operand *Src0, |
+ Operand *Src1) { |
+ assert(isVectorType(Dest->getType())); |
+ Type Ty = Dest->getType(); |
+ Type ElementTy = typeElementType(Ty); |
+ SizeT NumElements = typeNumElements(Ty); |
+ |
+ Operand *T = Ctx->getConstantUndef(Ty); |
+ for (SizeT I = 0; I < NumElements; ++I) { |
+ Constant *Index = Ctx->getConstantInt32(I); |
+ |
+ // Extract the next two inputs. |
+ Variable *Op0 = Func->makeVariable(ElementTy); |
+ Context.insert<InstExtractElement>(Op0, Src0, Index); |
+ Variable *Op1 = Func->makeVariable(ElementTy); |
+ Context.insert<InstExtractElement>(Op1, Src1, Index); |
+ |
+ // Perform the arithmetic as a scalar operation. |
+ Variable *Res = Func->makeVariable(ElementTy); |
+ auto *Arith = Context.insert<InstArithmetic>(Kind, Res, Op0, Op1); |
+ // We might have created an operation that needed a helper call. |
+ genTargetHelperCallFor(Arith); |
+ |
+ // Insert the result into position. |
+ Variable *DestT = Func->makeVariable(Ty); |
+ Context.insert<InstInsertElement>(DestT, T, Res, Index); |
+ T = DestT; |
+ } |
+ |
+ Context.insert<InstAssign>(Dest, T); |
+} |
+ |
void TargetLowering::emitWithoutPrefix(const ConstantRelocatable *C, |
const char *Suffix) const { |
if (!BuildDefs::dump()) |