@@ -136,6 +136,9 @@ class SVEType {
136
136
137
137
// / Applies a prototype modifier to the type.
138
138
void applyModifier (char Mod);
139
+
140
+ // / Get the builtin base for this SVEType, e.g, 'Wi' for svint64_t.
141
+ std::string builtinBaseType () const ;
139
142
};
140
143
141
144
class SVEEmitter ;
@@ -433,88 +436,82 @@ const std::array<SVEEmitter::ReinterpretTypeInfo, 12> SVEEmitter::Reinterprets =
433
436
// Type implementation
434
437
// ===----------------------------------------------------------------------===//
435
438
436
- std::string SVEType::builtin_str () const {
437
- std::string OutStr;
438
-
439
- if (isScalarPredicate ())
440
- return " b" ;
441
-
442
- if (isSvcount ())
439
+ std::string SVEType::builtinBaseType () const {
440
+ switch (Kind) {
441
+ case TypeKind::Void:
442
+ return " v" ;
443
+ case TypeKind::Svcount:
443
444
return " Qa" ;
444
-
445
- if (isVoid ()) {
446
- OutStr += " v" ;
447
- if (!isPointer ())
448
- return OutStr;
449
- } else if (isFloat ()) {
445
+ case TypeKind::BFloat16:
446
+ assert (ElementBitwidth == 16 && " Invalid BFloat16!" );
447
+ return " y" ;
448
+ case TypeKind::MFloat8:
449
+ assert (ElementBitwidth == 8 && " Invalid MFloat8!" );
450
+ return " c" ;
451
+ case TypeKind::Float:
450
452
switch (ElementBitwidth) {
451
453
case 16 :
452
- OutStr += " h" ;
453
- break ;
454
+ return " h" ;
454
455
case 32 :
455
- OutStr += " f" ;
456
- break ;
456
+ return " f" ;
457
457
case 64 :
458
- OutStr += " d" ;
459
- break ;
458
+ return " d" ;
460
459
default :
461
- llvm_unreachable (" Unhandled float type !" );
460
+ llvm_unreachable (" Unhandled float width !" );
462
461
}
463
- } else if (isBFloat ()) {
464
- assert (ElementBitwidth == 16 && " Not a valid BFloat." );
465
- OutStr += " y" ;
466
- } else if (isMFloat ()) {
467
- assert (ElementBitwidth == 8 && " Not a valid MFloat." );
468
- OutStr += " m" ;
469
- } else {
462
+ case TypeKind::Predicate:
463
+ if (isScalar ())
464
+ return " b" ;
465
+ [[fallthrough]];
466
+ // SInt/UInt, PredicatePattern, PrefetchOp.
467
+ default :
470
468
switch (ElementBitwidth) {
471
469
case 1 :
472
- OutStr += " b" ;
473
- break ;
470
+ return " b" ;
474
471
case 8 :
475
- OutStr += " c" ;
476
- break ;
472
+ return " c" ;
477
473
case 16 :
478
- OutStr += " s" ;
479
- break ;
474
+ return " s" ;
480
475
case 32 :
481
- OutStr += " i" ;
482
- break ;
476
+ return " i" ;
483
477
case 64 :
484
- OutStr += " Wi" ;
485
- break ;
478
+ return " Wi" ;
486
479
case 128 :
487
- OutStr += " LLLi" ;
488
- break ;
480
+ return " LLLi" ;
489
481
default :
490
482
llvm_unreachable (" Unhandled bitwidth!" );
491
483
}
492
484
}
485
+ }
493
486
494
- // Make chars and integer pointers explicitly signed.
495
- if ((ElementBitwidth == 8 || isPointer ()) && isSignedInteger ())
496
- OutStr = " S" + OutStr;
497
- else if (isUnsignedInteger ())
498
- OutStr = " U" + OutStr;
487
+ std::string SVEType::builtin_str () const {
488
+
489
+ std::string Prefix;
499
490
500
- // Constant indices are "int", but have the "constant expression" modifier.
501
- if (isImmediate ()) {
491
+ if (isScalableVector ())
492
+ Prefix = " q" + llvm::utostr (getNumElements () * NumVectors);
493
+ else if (isFixedLengthVector ())
494
+ Prefix = " V" + llvm::utostr (getNumElements () * NumVectors);
495
+ else if (isImmediate ()) {
502
496
assert (!isFloatingPoint () && " fp immediates are not supported" );
503
- OutStr = " I" + OutStr ;
497
+ Prefix = " I" ;
504
498
}
505
499
506
- if (isScalar ()) {
507
- if (Constant)
508
- OutStr += " C" ;
509
- if (Pointer)
510
- OutStr += " *" ;
511
- return OutStr;
512
- }
500
+ // Make chars and integer pointers explicitly signed.
501
+ if ((ElementBitwidth == 8 || isPointer ()) && isSignedInteger ())
502
+ Prefix += " S" ;
503
+ else if (isUnsignedInteger ())
504
+ Prefix += " U" ;
513
505
514
- if (isFixedLengthVector ())
515
- return " V" + utostr (getNumElements () * NumVectors) + OutStr;
516
- return " q" + utostr (getNumElements () * NumVectors) + OutStr;
506
+ std::string BuiltinStr = Prefix + builtinBaseType ();
507
+ if (isConstant ())
508
+ BuiltinStr += " C" ;
509
+ if (isPointer ())
510
+ BuiltinStr += " *" ;
511
+
512
+ return BuiltinStr;
517
513
}
514
+
518
515
std::string SVEType::str () const {
519
516
if (isPredicatePattern ())
520
517
return " enum svpattern" ;
@@ -623,6 +620,7 @@ void SVEType::applyModifier(char Mod) {
623
620
switch (Mod) {
624
621
case ' v' :
625
622
Kind = Void;
623
+ NumVectors = 0 ;
626
624
break ;
627
625
case ' d' :
628
626
DefaultType = true ;
0 commit comments