================
@@ -831,6 +831,65 @@ static cir::VectorType getNeonType(CIRGenFunction *cgf,
NeonTypeFlags typeFlags,
llvm_unreachable("Unknown vector element type!");
}
+// Get integer from a mlir::Value that is an int constant or a constant op.
+static int64_t getIntValueFromConstOp(mlir::Value val) {
+ return val.getDefiningOp<cir::ConstantOp>().getIntValue().getSExtValue();
+}
+
+// Build a constant shift amount vector of `vecTy` to shift a vector
+// Here `shitfVal` is a constant integer that will be splated into a
+// a const vector of `vecTy` which is the return of this function
+static mlir::Value emitNeonShiftVector(CIRGenBuilderTy &builder,
+ mlir::Value shiftVal,
+ cir::VectorType vecTy,
+ mlir::Location loc) {
+ mlir::Type eltTy = vecTy.getElementType();
+ if (shiftVal.getType() != eltTy) {
+ shiftVal = builder.createIntCast(shiftVal, eltTy);
+ }
+ return cir::VecSplatOp::create(builder, loc, vecTy, shiftVal);
+}
+
+// Build ShiftOp of vector type whose shift amount is a vector built
+// from a constant integer using `emitNeonShiftVector` function
+static mlir::Value emitCommonNeonShift(CIRGenBuilderTy &builder,
+ mlir::Location loc,
+ cir::VectorType resTy,
+ mlir::Value shifTgt,
+ mlir::Value shiftAmt, bool shiftLeft) {
+ shiftAmt = emitNeonShiftVector(builder, shiftAmt, resTy, loc);
+ return cir::ShiftOp::create(builder, loc, resTy,
+ builder.createBitcast(shifTgt, resTy), shiftAmt,
+ shiftLeft);
+}
+
+// Right-shift a vector by a constant.
+static mlir::Value emitNeonRShiftImm(CIRGenFunction &cgf, mlir::Value shiftVec,
+ mlir::Value shiftVal,
+ cir::VectorType vecTy, bool usgn,
+ mlir::Location loc) {
+ CIRGenBuilderTy &builder = cgf.getBuilder();
+ int64_t shiftAmt = getIntValueFromConstOp(shiftVal);
+ int eltSize =
+ cgf.cgm.getDataLayout().getTypeSizeInBits(vecTy.getElementType());
+
+ shiftVec = builder.createBitcast(shiftVec, vecTy);
+ // lshr/ashr are undefined when the shift amount is equal to the vector
+ // element size.
+ if (shiftAmt == eltSize) {
+ if (usgn) {
+ // Right-shifting an unsigned value by its size yields 0.
+ return builder.getZero(loc, vecTy);
+ }
+ // Right-shifting a signed value by its size is equivalent
+ // to a shift of size-1.
+ --shiftAmt;
+ shiftVal = builder.getConstInt(loc, vecTy.getElementType(), shiftAmt);
+ }
+ return emitCommonNeonShift(builder, loc, vecTy, shiftVec, shiftVal,
+ false /* right shift */);
----------------
banach-space wrote:
```suggestion
/*shiftLeft=*/false);
```
https://github.com/llvm/llvm-project/pull/186693
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits