================
@@ -68,6 +68,35 @@ static mlir::Value emitVectorFCmp(CIRGenBuilderTy &builder,
return bitCast;
}
+static cir::VecShuffleOp emitPshufW(CIRGenFunction &cgf,
+ CIRGenBuilderTy &builder,
+ llvm::SmallVector<mlir::Value> &ops,
+ const CallExpr *expr, const bool isLow) {
+ uint32_t imm = cgf.getZExtIntValueFromConstOp(ops[1]);
+
+ auto vecTy = cast<cir::VectorType>(ops[0].getType());
+ unsigned numElts = vecTy.getSize();
+
+ unsigned firstHalfStart = isLow ? 0 : 4;
+ unsigned secondHalfStart = 4 - firstHalfStart;
+
+ // Splat the 8-bits of immediate 4 times to help the loop wrap around.
+ imm = (imm & 0xff) * 0x01010101;
+
+ int64_t indices[32];
+ for (unsigned l = 0; l != numElts; l += 8) {
+ for (unsigned i = firstHalfStart; i != firstHalfStart + 4; ++i) {
+ indices[l + i] = l + (imm & 3) + firstHalfStart;
+ imm /= 4;
----------------
Thibault-Monnier wrote:
I was able to merge the logic for the `pshufd`/`vpermilp` and the `pshufp`
builtins. I can't think of a good function name however, is there anything that
links both?
https://github.com/llvm/llvm-project/pull/169178
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits