================
@@ -665,6 +665,53 @@ def CIR_LoadOp : CIR_Op<"load", [
// FIXME: add verifier.
}
+//===----------------------------------------------------------------------===//
+// MaskLoadOp
+//===----------------------------------------------------------------------===//
+
+def CIR_MaskedLoadOp : CIR_Op<"mask.load", [
+ TypesMatchWith<"type of 'result' matches pointee type of 'addr'",
+ "addr", "result", "mlir::cast<cir::PointerType>($_self).getPointee()">
+]> {
+ let summary = "Masked vector load from memory";
+ let description = [{
+ `cir.masked_load` conditionally loads elements from memory based on a mask.
+ Elements for which the mask is false are taken from `pass_thru`.
+
+ This operation is intended to correspond closely to LLVM's masked load op
+ (`llvm.intr.maskedload` / `LLVM::MaskedLoadOp`) and lower directly to it.
+
+ `alignment` can be provided to override the default alignment derived from
+ the pointee/element type data layout.
+
+ Example:
+
+ ```mlir
+ %v = cir.masked_load align(16) %ptr, %mask, %passthru
+ : !cir.ptr<i32>, <4xi1>, <4xi32> -> <4xi32>
+ ```
+ }];
+
+ let arguments = (ins
+ Arg<CIR_PointerType, "base address (points to element type)",
[MemRead]>:$addr,
+ CIR_VectorType:$mask,
+ CIR_VectorType:$pass_thru,
+ OptionalAttr<IntValidAlignment<I64Attr>>:$alignment
+ );
+
+ let results = (outs CIR_AnyType:$result);
+
+ let assemblyFormat = [{
+ (`align` `(` $alignment^ `)`)?
+ $addr `,` $mask `,` $pass_thru
+ `:` qualified(type($addr)) `,` type($mask) `,` type($pass_thru)
+ `->` type($result)
+ attr-dict
+ }];
+
+ // FIXME: add verifier
----------------
woruyu wrote:
Done! delete
https://github.com/llvm/llvm-project/pull/169464
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits