@@ -130,6 +130,44 @@ func.func @addi_vector_a_b(%a : vector<4xi64>, %b : vector<4xi64>) -> vector<4xi
130130 return %x : vector <4 xi64 >
131131}
132132
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+
133171// CHECK-LABEL: func.func @cmpi_eq_scalar
134172// CHECK-SAME: ([[LHS:%.+]]: vector<2xi32>, [[RHS:%.+]]: vector<2xi32>)
135173// CHECK-NEXT: [[LHSLOW:%.+]] = vector.extract [[LHS]][0] : i32 from vector<2xi32>
@@ -967,11 +1005,12 @@ func.func @uitofp_i64_f16(%a : i64) -> f16 {
9671005
9681006// CHECK-LABEL: func @sitofp_i64_f64
9691007// 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
9751014// CHECK: [[CST0:%.+]] = arith.constant 0 : i32
9761015// CHECK: [[HIEQ0:%.+]] = arith.cmpi eq, [[HI:%.+]], [[CST0]] : i32
9771016// CHECK-NEXT: [[LOWFP:%.+]] = arith.uitofp [[LOW:%.+]] : i32 to f64
@@ -990,9 +1029,9 @@ func.func @sitofp_i64_f64(%a : i64) -> f64 {
9901029
9911030// CHECK-LABEL: func @sitofp_i64_f64_vector
9921031// 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
9961035// CHECK: [[HIEQ0:%.+]] = arith.cmpi eq, [[HI:%.+]], [[CST0:%.+]] : vector<3xi32>
9971036// CHECK-NEXT: [[LOWFP:%.+]] = arith.uitofp [[LOW:%.+]] : vector<3xi32> to vector<3xf64>
9981037// CHECK-NEXT: [[HIFP:%.+]] = arith.uitofp [[HI:%.+]] : vector<3xi32> to vector<3xf64>
0 commit comments