@@ -73,3 +73,93 @@ func.func @pow_rsqrt(%arg0: f32, %arg1 : vector<4xf32>) -> (f32, vector<4xf32>)
73
73
%1 = math.powf %arg1 , %v : vector <4 xf32 >
74
74
return %0 , %1 : f32 , vector <4 xf32 >
75
75
}
76
+
77
+ // CHECK-LABEL: @ipowi_zero_exp(
78
+ // CHECK-SAME: %[[ARG0:.+]]: i32
79
+ // CHECK-SAME: %[[ARG1:.+]]: vector<4xi32>
80
+ // CHECK-SAME: -> (i32, vector<4xi32>) {
81
+ func.func @ipowi_zero_exp (%arg0: i32 , %arg1: vector <4 xi32 >) -> (i32 , vector <4 xi32 >) {
82
+ // CHECK: %[[CST_S:.*]] = arith.constant 1 : i32
83
+ // CHECK: %[[CST_V:.*]] = arith.constant dense<1> : vector<4xi32>
84
+ // CHECK: return %[[CST_S]], %[[CST_V]]
85
+ %c = arith.constant 0 : i32
86
+ %v = arith.constant dense <0 > : vector <4 xi32 >
87
+ %0 = math.ipowi %arg0 , %c : i32
88
+ %1 = math.ipowi %arg1 , %v : vector <4 xi32 >
89
+ return %0 , %1 : i32 , vector <4 xi32 >
90
+ }
91
+
92
+ // CHECK-LABEL: @ipowi_exp_one(
93
+ // CHECK-SAME: %[[ARG0:.+]]: i32
94
+ // CHECK-SAME: %[[ARG1:.+]]: vector<4xi32>
95
+ // CHECK-SAME: -> (i32, vector<4xi32>, i32, vector<4xi32>) {
96
+ func.func @ipowi_exp_one (%arg0: i32 , %arg1: vector <4 xi32 >) -> (i32 , vector <4 xi32 >, i32 , vector <4 xi32 >) {
97
+ // CHECK: %[[CST_S:.*]] = arith.constant 1 : i32
98
+ // CHECK: %[[CST_V:.*]] = arith.constant dense<1> : vector<4xi32>
99
+ // CHECK: %[[SCALAR:.*]] = arith.divsi %[[CST_S]], %[[ARG0]]
100
+ // CHECK: %[[VECTOR:.*]] = arith.divsi %[[CST_V]], %[[ARG1]]
101
+ // CHECK: return %[[ARG0]], %[[ARG1]], %[[SCALAR]], %[[VECTOR]]
102
+ %c1 = arith.constant 1 : i32
103
+ %v1 = arith.constant dense <1 > : vector <4 xi32 >
104
+ %0 = math.ipowi %arg0 , %c1 : i32
105
+ %1 = math.ipowi %arg1 , %v1 : vector <4 xi32 >
106
+ %cm1 = arith.constant -1 : i32
107
+ %vm1 = arith.constant dense <-1 > : vector <4 xi32 >
108
+ %2 = math.ipowi %arg0 , %cm1 : i32
109
+ %3 = math.ipowi %arg1 , %vm1 : vector <4 xi32 >
110
+ return %0 , %1 , %2 , %3 : i32 , vector <4 xi32 >, i32 , vector <4 xi32 >
111
+ }
112
+
113
+ // CHECK-LABEL: @ipowi_exp_two(
114
+ // CHECK-SAME: %[[ARG0:.+]]: i32
115
+ // CHECK-SAME: %[[ARG1:.+]]: vector<4xi32>
116
+ // CHECK-SAME: -> (i32, vector<4xi32>, i32, vector<4xi32>) {
117
+ func.func @ipowi_exp_two (%arg0: i32 , %arg1: vector <4 xi32 >) -> (i32 , vector <4 xi32 >, i32 , vector <4 xi32 >) {
118
+ // CHECK: %[[CST_S:.*]] = arith.constant 1 : i32
119
+ // CHECK: %[[CST_V:.*]] = arith.constant dense<1> : vector<4xi32>
120
+ // CHECK: %[[SCALAR0:.*]] = arith.muli %[[ARG0]], %[[ARG0]]
121
+ // CHECK: %[[VECTOR0:.*]] = arith.muli %[[ARG1]], %[[ARG1]]
122
+ // CHECK: %[[SCALAR1:.*]] = arith.divsi %[[CST_S]], %[[ARG0]]
123
+ // CHECK: %[[SMUL:.*]] = arith.muli %[[SCALAR1]], %[[SCALAR1]]
124
+ // CHECK: %[[VECTOR1:.*]] = arith.divsi %[[CST_V]], %[[ARG1]]
125
+ // CHECK: %[[VMUL:.*]] = arith.muli %[[VECTOR1]], %[[VECTOR1]]
126
+ // CHECK: return %[[SCALAR0]], %[[VECTOR0]], %[[SMUL]], %[[VMUL]]
127
+ %c1 = arith.constant 2 : i32
128
+ %v1 = arith.constant dense <2 > : vector <4 xi32 >
129
+ %0 = math.ipowi %arg0 , %c1 : i32
130
+ %1 = math.ipowi %arg1 , %v1 : vector <4 xi32 >
131
+ %cm1 = arith.constant -2 : i32
132
+ %vm1 = arith.constant dense <-2 > : vector <4 xi32 >
133
+ %2 = math.ipowi %arg0 , %cm1 : i32
134
+ %3 = math.ipowi %arg1 , %vm1 : vector <4 xi32 >
135
+ return %0 , %1 , %2 , %3 : i32 , vector <4 xi32 >, i32 , vector <4 xi32 >
136
+ }
137
+
138
+ // CHECK-LABEL: @ipowi_exp_three(
139
+ // CHECK-SAME: %[[ARG0:.+]]: i32
140
+ // CHECK-SAME: %[[ARG1:.+]]: vector<4xi32>
141
+ // CHECK-SAME: -> (i32, vector<4xi32>, i32, vector<4xi32>) {
142
+ func.func @ipowi_exp_three (%arg0: i32 , %arg1: vector <4 xi32 >) -> (i32 , vector <4 xi32 >, i32 , vector <4 xi32 >) {
143
+ // CHECK: %[[CST_S:.*]] = arith.constant 1 : i32
144
+ // CHECK: %[[CST_V:.*]] = arith.constant dense<1> : vector<4xi32>
145
+ // CHECK: %[[SMUL0:.*]] = arith.muli %[[ARG0]], %[[ARG0]]
146
+ // CHECK: %[[SCALAR0:.*]] = arith.muli %[[SMUL0]], %[[ARG0]]
147
+ // CHECK: %[[VMUL0:.*]] = arith.muli %[[ARG1]], %[[ARG1]]
148
+ // CHECK: %[[VECTOR0:.*]] = arith.muli %[[VMUL0]], %[[ARG1]]
149
+ // CHECK: %[[SCALAR1:.*]] = arith.divsi %[[CST_S]], %[[ARG0]]
150
+ // CHECK: %[[SMUL1:.*]] = arith.muli %[[SCALAR1]], %[[SCALAR1]]
151
+ // CHECK: %[[SMUL2:.*]] = arith.muli %[[SMUL1]], %[[SCALAR1]]
152
+ // CHECK: %[[VECTOR1:.*]] = arith.divsi %[[CST_V]], %[[ARG1]]
153
+ // CHECK: %[[VMUL1:.*]] = arith.muli %[[VECTOR1]], %[[VECTOR1]]
154
+ // CHECK: %[[VMUL2:.*]] = arith.muli %[[VMUL1]], %[[VECTOR1]]
155
+ // CHECK: return %[[SCALAR0]], %[[VECTOR0]], %[[SMUL2]], %[[VMUL2]]
156
+ %c1 = arith.constant 3 : i32
157
+ %v1 = arith.constant dense <3 > : vector <4 xi32 >
158
+ %0 = math.ipowi %arg0 , %c1 : i32
159
+ %1 = math.ipowi %arg1 , %v1 : vector <4 xi32 >
160
+ %cm1 = arith.constant -3 : i32
161
+ %vm1 = arith.constant dense <-3 > : vector <4 xi32 >
162
+ %2 = math.ipowi %arg0 , %cm1 : i32
163
+ %3 = math.ipowi %arg1 , %vm1 : vector <4 xi32 >
164
+ return %0 , %1 , %2 , %3 : i32 , vector <4 xi32 >, i32 , vector <4 xi32 >
165
+ }
0 commit comments