@@ -130,6 +130,44 @@ func.func @addi_vector_a_b(%a : vector<4xi64>, %b : vector<4xi64>) -> vector<4xi
130
130
return %x : vector <4 xi64 >
131
131
}
132
132
133
+ // CHECK-LABEL: func @subi_scalar
134
+ // CHECK-SAME: ([[ARG0:%.+]]: vector<2xi32>, [[ARG1:%.+]]: vector<2xi32>) -> vector<2xi32>
135
+ // CHECK-NEXT: [[LOW0:%.+]] = vector.extract [[ARG0]][0] : i32 from vector<2xi32>
136
+ // CHECK-NEXT: [[HIGH0:%.+]] = vector.extract [[ARG0]][1] : i32 from vector<2xi32>
137
+ // CHECK-NEXT: [[LOW1:%.+]] = vector.extract [[ARG1]][0] : i32 from vector<2xi32>
138
+ // CHECK-NEXT: [[HIGH1:%.+]] = vector.extract [[ARG1]][1] : i32 from vector<2xi32>
139
+ // CHECK-NEXT: [[SUB_L:%.+]] = arith.subi [[LOW0]], [[LOW1]] : i32
140
+ // CHECK-NEXT: [[ULT:%.+]] = arith.cmpi ult, [[LOW0]], [[LOW1]] : i32
141
+ // CHECK-NEXT: [[CARRY:%.+]] = arith.extui [[ULT]] : i1 to i32
142
+ // CHECK-NEXT: [[SUB_H0:%.+]] = arith.subi [[HIGH0]], [[CARRY]] : i32
143
+ // CHECK-NEXT: [[SUB_H1:%.+]] = arith.subi [[SUB_H0]], [[HIGH1]] : i32
144
+ // CHECK: [[INS0:%.+]] = vector.insert [[SUB_L]], {{%.+}} [0] : i32 into vector<2xi32>
145
+ // CHECK-NEXT: [[INS1:%.+]] = vector.insert [[SUB_H1]], [[INS0]] [1] : i32 into vector<2xi32>
146
+ // CHECK-NEXT: return [[INS1]] : vector<2xi32>
147
+ func.func @subi_scalar (%a : i64 , %b : i64 ) -> i64 {
148
+ %x = arith.subi %a , %b : i64
149
+ return %x : i64
150
+ }
151
+
152
+ // CHECK-LABEL: func @subi_vector
153
+ // CHECK-SAME: ([[ARG0:%.+]]: vector<4x2xi32>, [[ARG1:%.+]]: vector<4x2xi32>) -> vector<4x2xi32>
154
+ // CHECK-NEXT: [[LOW0:%.+]] = vector.extract_strided_slice [[ARG0]] {offsets = [0, 0], sizes = [4, 1], strides = [1, 1]} : vector<4x2xi32> to vector<4x1xi32>
155
+ // CHECK-NEXT: [[HIGH0:%.+]] = vector.extract_strided_slice [[ARG0]] {offsets = [0, 1], sizes = [4, 1], strides = [1, 1]} : vector<4x2xi32> to vector<4x1xi32>
156
+ // CHECK-NEXT: [[LOW1:%.+]] = vector.extract_strided_slice [[ARG1]] {offsets = [0, 0], sizes = [4, 1], strides = [1, 1]} : vector<4x2xi32> to vector<4x1xi32>
157
+ // CHECK-NEXT: [[HIGH1:%.+]] = vector.extract_strided_slice [[ARG1]] {offsets = [0, 1], sizes = [4, 1], strides = [1, 1]} : vector<4x2xi32> to vector<4x1xi32>
158
+ // CHECK-NEXT: [[SUB_L:%.+]] = arith.subi [[LOW0]], [[LOW1]] : vector<4x1xi32>
159
+ // CHECK-NEXT: [[ULT:%.+]] = arith.cmpi ult, [[LOW0]], [[LOW1]] : vector<4x1xi32>
160
+ // CHECK-NEXT: [[CARRY:%.+]] = arith.extui [[ULT]] : vector<4x1xi1> to vector<4x1xi32>
161
+ // CHECK-NEXT: [[SUB_H0:%.+]] = arith.subi [[HIGH0]], [[CARRY]] : vector<4x1xi32>
162
+ // CHECK-NEXT: [[SUB_H1:%.+]] = arith.subi [[SUB_H0]], [[HIGH1]] : vector<4x1xi32>
163
+ // CHECK: [[INS0:%.+]] = vector.insert_strided_slice [[SUB_L]], {{%.+}} {offsets = [0, 0], strides = [1, 1]} : vector<4x1xi32> into vector<4x2xi32>
164
+ // CHECK-NEXT: [[INS1:%.+]] = vector.insert_strided_slice [[SUB_H1]], [[INS0]] {offsets = [0, 1], strides = [1, 1]} : vector<4x1xi32> into vector<4x2xi32>
165
+ // CHECK-NEXT: return [[INS1]] : vector<4x2xi32>
166
+ func.func @subi_vector (%a : vector <4 xi64 >, %b : vector <4 xi64 >) -> vector <4 xi64 > {
167
+ %x = arith.subi %a , %b : vector <4 xi64 >
168
+ return %x : vector <4 xi64 >
169
+ }
170
+
133
171
// CHECK-LABEL: func.func @cmpi_eq_scalar
134
172
// CHECK-SAME: ([[LHS:%.+]]: vector<2xi32>, [[RHS:%.+]]: vector<2xi32>)
135
173
// CHECK-NEXT: [[LHSLOW:%.+]] = vector.extract [[LHS]][0] : i32 from vector<2xi32>
@@ -967,11 +1005,12 @@ func.func @uitofp_i64_f16(%a : i64) -> f16 {
967
1005
968
1006
// CHECK-LABEL: func @sitofp_i64_f64
969
1007
// CHECK-SAME: ([[ARG:%.+]]: vector<2xi32>) -> f64
970
- // CHECK: [[VONES:%.+]] = arith.constant dense<-1> : vector<2xi32>
971
- // CHECK: [[ONES1:%.+]] = vector.extract [[VONES]][0] : i32 from vector<2xi32>
972
- // CHECK-NEXT: [[ONES2:%.+]] = vector.extract [[VONES]][1] : i32 from vector<2xi32>
973
- // CHECK: arith.xori {{%.+}}, [[ONES1]] : i32
974
- // CHECK-NEXT: arith.xori {{%.+}}, [[ONES2]] : i32
1008
+ // CHECK: [[VZERO:%.+]] = arith.constant dense<0> : vector<2xi32>
1009
+ // CHECK: vector.extract [[VZERO]][0] : i32 from vector<2xi32>
1010
+ // CHECK: [[ZERO1:%.+]] = vector.extract [[VZERO]][0] : i32 from vector<2xi32>
1011
+ // CHECK-NEXT: [[ZERO2:%.+]] = vector.extract [[VZERO]][1] : i32 from vector<2xi32>
1012
+ // CHECK: arith.subi [[ZERO1]], {{%.+}} : i32
1013
+ // CHECK: arith.subi [[ZERO2]], {{%.+}} : i32
975
1014
// CHECK: [[CST0:%.+]] = arith.constant 0 : i32
976
1015
// CHECK: [[HIEQ0:%.+]] = arith.cmpi eq, [[HI:%.+]], [[CST0]] : i32
977
1016
// CHECK-NEXT: [[LOWFP:%.+]] = arith.uitofp [[LOW:%.+]] : i32 to f64
@@ -990,9 +1029,9 @@ func.func @sitofp_i64_f64(%a : i64) -> f64 {
990
1029
991
1030
// CHECK-LABEL: func @sitofp_i64_f64_vector
992
1031
// CHECK-SAME: ([[ARG:%.+]]: vector<3x2xi32>) -> vector<3xf64>
993
- // CHECK: [[VONES :%.+]] = arith.constant dense<-1 > : vector<3x2xi32>
994
- // CHECK: arith.xori
995
- // CHECK-NEXT : arith.xori
1032
+ // CHECK: [[VZERO :%.+]] = arith.constant dense<0 > : vector<3x2xi32>
1033
+ // CHECK: arith.subi
1034
+ // CHECK: arith.subi
996
1035
// CHECK: [[HIEQ0:%.+]] = arith.cmpi eq, [[HI:%.+]], [[CST0:%.+]] : vector<3xi32>
997
1036
// CHECK-NEXT: [[LOWFP:%.+]] = arith.uitofp [[LOW:%.+]] : vector<3xi32> to vector<3xf64>
998
1037
// CHECK-NEXT: [[HIFP:%.+]] = arith.uitofp [[HI:%.+]] : vector<3xi32> to vector<3xf64>
0 commit comments