@@ -39,7 +39,7 @@ class ArmNeon_IntrOp<string mnemonic, list<int> overloadedResults,
39
39
list<int> overloadedOperands, int numResults,
40
40
list<OpTrait> traits = [], bit requiresAccessGroup = 0>
41
41
: LLVM_IntrOpBase</*dialect=*/ArmNeon_Dialect,
42
- /*opName=*/mnemonic,
42
+ /*opName=*/"intr." # mnemonic,
43
43
/*enumName=*/"aarch64_neon_" # !subst(".", "_", mnemonic),
44
44
/*overloadedResults=*/overloadedResults,
45
45
/*overloadedOperands=*/overloadedOperands,
@@ -53,6 +53,13 @@ class ArmNeon_OverloadedOneResultIntrOp<string mnemonic,
53
53
list<OpTrait> traits = []>
54
54
: ArmNeon_IntrOp<mnemonic, [0], [], 1, traits>;
55
55
56
+ // ArmNeon dialect op that corresponds to an LLVM IR intrinsic with one
57
+ // overloaded result and overloaded operands list.
58
+ class ArmNeon_OverloadedOperandsWithOneResultIntrOp<string mnemonic,
59
+ list<int> overloadedOperands,
60
+ list<OpTrait> traits = []>
61
+ : ArmNeon_IntrOp<mnemonic, [0], overloadedOperands, 1, traits>;
62
+
56
63
def SMullOp : ArmNeon_OverloadedOneResultIntrOp<"smull", [
57
64
NoSideEffect,
58
65
AllTypesMatch<["a", "b"]>,
@@ -82,5 +89,32 @@ def SMullOp : ArmNeon_OverloadedOneResultIntrOp<"smull", [
82
89
"$a `,` $b attr-dict `:` type($a) `to` type($res)";
83
90
}
84
91
92
+ def SdotOp : ArmNeon_OverloadedOperandsWithOneResultIntrOp<"sdot",[1], [
93
+ NoSideEffect,
94
+ AllTypesMatch<["b", "c"]>,
95
+ AllTypesMatch<["a", "res"]>,
96
+ TypesMatchWith<"res has the same number of elements as operand b",
97
+ "b", "res",
98
+ "VectorType::get({$_self.cast<VectorType>().getShape()[0] / 4},"
99
+ "IntegerType::get($_self.getContext(), 32))">]> {
100
+ let summary = "sdot op";
101
+ let description = [{
102
+ Signed integer addition of dot product (vector). This instruction performs
103
+ the following operation on signed integer vectors: res = dot(b, c) + a,
104
+ where vector operands are partitioned into groups of four elements.
105
+
106
+ Source:
107
+ https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics
108
+ }];
109
+ // Supports either:
110
+ // (vector<2xi32>, vector<8xi8>, vector<8xi8>) -> vector<2xi32>
111
+ // (vector<4xi32>, vector<16xi8>, vector<16xi8>) -> vector<16xi32>
112
+ let arguments = (ins VectorOfLengthAndType<[4, 2], [I32]>:$a,
113
+ VectorOfLengthAndType<[16, 8], [I8]>:$b,
114
+ VectorOfLengthAndType<[16, 8], [I8]>:$c);
115
+ let results = (outs VectorOfLengthAndType<[4, 2], [I32]>:$res);
116
+ let assemblyFormat =
117
+ "$a `,` $b `,` $c attr-dict `:` type($b) `,` type($c) `to` type($res)";
118
+ }
85
119
86
120
#endif // ARMNEON_OPS
0 commit comments