@@ -45,7 +45,7 @@ def SVEPredicate : ScalableVectorOfRankAndLengthAndType<
45
45
// Generalizations of SVBool and SVEPredicate to ranks >= 1.
46
46
// These are masks with a single trailing scalable dimension.
47
47
def SVBoolMask : TrailingScalableVectorOfSizeAndType<[16], [I1]>;
48
- def SVEMask : TrailingScalableVectorOfSizeAndType<[16, 8, 4, 2, 1], [I1]>;
48
+ def SVEPredicateMask : TrailingScalableVectorOfSizeAndType<[16, 8, 4, 2, 1], [I1]>;
49
49
50
50
//===----------------------------------------------------------------------===//
51
51
// ArmSVE op definitions
@@ -243,14 +243,13 @@ def UmmlaOp : ArmSVE_Op<"ummla",
243
243
"$acc `,` $src1 `,` $src2 attr-dict `:` type($src1) `to` type($dst)";
244
244
}
245
245
246
-
247
- class SvboolTypeContraint<string lhsArg, string rhsArg> : TypesMatchWith<
246
+ class SvboolTypeConstraint<string lhsArg, string rhsArg> : TypesMatchWith<
248
247
"expected corresponding svbool type widened to [16]xi1",
249
248
lhsArg, rhsArg,
250
249
"VectorType(VectorType::Builder(::llvm::cast<VectorType>($_self)).setDim(::llvm::cast<VectorType>($_self).getRank() - 1, 16))">;
251
250
252
251
def ConvertFromSvboolOp : ArmSVE_Op<"convert_from_svbool",
253
- [Pure, SvboolTypeContraint <"result", "source">]>
252
+ [Pure, SvboolTypeConstraint <"result", "source">]>
254
253
{
255
254
let summary = "Convert a svbool type to a SVE predicate type";
256
255
let description = [{
@@ -260,45 +259,61 @@ def ConvertFromSvboolOp : ArmSVE_Op<"convert_from_svbool",
260
259
261
260
Example 1: Convert a 1-D svbool mask to a SVE predicate.
262
261
```mlir
263
- %svbool = vector.load %memref[%c0] : memref<?xi1>, vector<[16]xi1>
264
- %mask = arm_sve.convert_from_svbool %svbool : vector<[4]xi1>
262
+ %source = vector.load %memref[%c0] : memref<?xi1>, vector<[16]xi1>
263
+ %result = arm_sve.convert_from_svbool %source : vector<[4]xi1>
265
264
```
266
265
267
266
Example 2: Convert a 2-D svbool mask to a mask of SVE predicates.
268
267
```mlir
269
- %svbool = vector.load %memref[%c0, %c0] : memref<2x?xi1>, vector<2x[16]xi1>
270
- %mask = arm_sve.convert_from_svbool %svbool : vector<2x[8]xi1>
268
+ %source = vector.load %memref[%c0, %c0] : memref<2x?xi1>, vector<2x[16]xi1>
269
+ %result = arm_sve.convert_from_svbool %source : vector<2x[8]xi1>
271
270
```
271
+
272
+ ---
273
+
274
+ A `svbool` is the smallest SVE predicate type that has a in-memory
275
+ representation (and maps to a full predicate register). In MLIR `svbool` is
276
+ represented as `vector<[16]xi1>`. Smaller SVE predicate types
277
+ (`vector<[1|2|4|8]xi1>`) must be stored as `svbool` then converted back to
278
+ a predicate after loading.
272
279
}];
273
280
let arguments = (ins SVBoolMask:$source);
274
- let results = (outs SVEMask :$result);
281
+ let results = (outs SVEPredicateMask :$result);
275
282
let assemblyFormat = "$source attr-dict `:` type($result)";
276
283
}
277
284
278
285
def ConvertToSvboolOp : ArmSVE_Op<"convert_to_svbool",
279
- [Pure, SvboolTypeContraint <"source", "result">]>
286
+ [Pure, SvboolTypeConstraint <"source", "result">]>
280
287
{
281
- let summary = "Convert a predicate type to a svbool type";
288
+ let summary = "Convert a SVE predicate type to a svbool type";
282
289
let description = [{
283
290
Converts SVE predicate types (or vectors of predicate types, e.g.
284
291
`vector<4x[4]xi1>`) to svbool types. Note: Only the trailing dimension can
285
292
be scalable.
286
293
287
294
Example 1: Convert a 1-D SVE predicate to a svbool mask.
288
295
```mlir
289
- %mask = vector.create_mask %dim_size : vector<[4]xi1>
290
- %svbool = arm_sve.convert_to_svbool %mask : vector<[4]xi1>
296
+ %source = vector.create_mask %dim_size : vector<[4]xi1>
297
+ %result = arm_sve.convert_to_svbool %source : vector<[4]xi1>
291
298
// => Results in vector<[16]xi1>
292
299
```
293
300
294
301
Example 2: Convert a 2-D mask of SVE predicates to a svbool mask.
295
302
```mlir
296
- %mask = vector.create_mask %c2, %dim_size : vector<2x[2]xi1>
297
- %svbool = arm_sve.convert_to_svbool %mask : vector<2x[2]xi1>
303
+ %source = vector.create_mask %c2, %dim_size : vector<2x[2]xi1>
304
+ %result = arm_sve.convert_to_svbool %source : vector<2x[2]xi1>
298
305
// => Results in vector<2x[16]xi1>
299
306
```
307
+
308
+ ---
309
+
310
+ A `svbool` is the smallest SVE predicate type that has a in-memory
311
+ representation (and maps to a full predicate register). In MLIR `svbool` is
312
+ represented as `vector<[16]xi1>`. Smaller SVE predicate types
313
+ (`vector<[1|2|4|8]xi1>`) must be converted to a `svbool` before they can be
314
+ stored.
300
315
}];
301
- let arguments = (ins SVEMask :$source);
316
+ let arguments = (ins SVEPredicateMask :$source);
302
317
let results = (outs SVBoolMask:$result);
303
318
let assemblyFormat = "$source attr-dict `:` type($source)";
304
319
}
0 commit comments