================
@@ -85,6 +88,41 @@ static mlir::Value getMaskVecValue(CIRGenBuilderTy &builder,
mlir::Location loc,
return maskVec;
}
+static mlir::Value emitX86FunnelShift(CIRGenFunction &cgf,
+ mlir::Location location, mlir::Value
&op0,
+ mlir::Value &op1, mlir::Value &amt,
+ bool isRight) {
+ CIRGenBuilderTy &builder = cgf.getBuilder();
+ mlir::Type op0Ty = op0.getType();
+
+ // Amount may be scalar immediate, in which case create a splat vector.
+ // Funnel shifts amounts are treated as modulo and types are all power-of-2
+ // so we only care about the lowest log2 bits anyway.
+ if (amt.getType() != op0Ty) {
+ auto vecTy = mlir::cast<cir::VectorType>(op0Ty);
+ uint64_t numElems = vecTy.getSize();
+
+ auto amtTy = mlir::cast<cir::IntType>(amt.getType());
+ auto vecElemTy = mlir::cast<cir::IntType>(vecTy.getElementType());
+
+ // Cast to same width unsigned if not already unsigned.
+ if (amtTy.isSigned()) {
+ cir::IntType unsignedAmtTy = builder.getUIntNTy(amtTy.getWidth());
+ amt = builder.createIntCast(amt, unsignedAmtTy);
+ }
+ // Cast the unsigned `amt` to operand element type's width unsigned.
+ cir::IntType unsignedVecElemType =
builder.getUIntNTy(vecElemTy.getWidth());
+ amt = builder.createIntCast(amt, unsignedVecElemType);
+ amt = cir::VecSplatOp::create(
+ builder, location, cir::VectorType::get(unsignedVecElemType, numElems),
+ amt);
+ }
+
+ const std::string intrinsicName = isRight ? "fshr" : "fshl";
+ return emitIntrinsicCallOp(cgf.getBuilder(), location, intrinsicName, op0Ty,
----------------
AmrDeveloper wrote:
```suggestion
return emitIntrinsicCallOp(builder, location, intrinsicName, op0Ty,
```
https://github.com/llvm/llvm-project/pull/169566
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits