@@ -96,6 +96,32 @@ define i16 @narrow_zext_add(i16 %x16, i32 %y32) {
96
96
ret i16 %r
97
97
}
98
98
99
+ define i16 @narrow_sext_sub (i16 %x16 , i32 %y32 ) {
100
+ ; CHECK-LABEL: @narrow_sext_sub(
101
+ ; CHECK-NEXT: [[X321:%.*]] = zext i16 %x16 to i32
102
+ ; CHECK-NEXT: [[B:%.*]] = sub i32 [[X321]], %y32
103
+ ; CHECK-NEXT: [[R:%.*]] = trunc i32 [[B]] to i16
104
+ ; CHECK-NEXT: ret i16 [[R]]
105
+ ;
106
+ %x32 = sext i16 %x16 to i32
107
+ %b = sub i32 %x32 , %y32
108
+ %r = trunc i32 %b to i16
109
+ ret i16 %r
110
+ }
111
+
112
+ define i16 @narrow_zext_sub (i16 %x16 , i32 %y32 ) {
113
+ ; CHECK-LABEL: @narrow_zext_sub(
114
+ ; CHECK-NEXT: [[X32:%.*]] = zext i16 %x16 to i32
115
+ ; CHECK-NEXT: [[B:%.*]] = sub i32 [[X32]], %y32
116
+ ; CHECK-NEXT: [[R:%.*]] = trunc i32 [[B]] to i16
117
+ ; CHECK-NEXT: ret i16 [[R]]
118
+ ;
119
+ %x32 = zext i16 %x16 to i32
120
+ %b = sub i32 %x32 , %y32
121
+ %r = trunc i32 %b to i16
122
+ ret i16 %r
123
+ }
124
+
99
125
define i16 @narrow_sext_mul (i16 %x16 , i32 %y32 ) {
100
126
; CHECK-LABEL: @narrow_sext_mul(
101
127
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 %y32 to i16
@@ -235,6 +261,36 @@ define <2 x i16> @narrow_zext_add_commute(<2 x i16> %x16, <2 x i32> %y32) {
235
261
ret <2 x i16 > %r
236
262
}
237
263
264
+ define <2 x i16 > @narrow_sext_sub_commute (<2 x i16 > %x16 , <2 x i32 > %y32 ) {
265
+ ; CHECK-LABEL: @narrow_sext_sub_commute(
266
+ ; CHECK-NEXT: [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
267
+ ; CHECK-NEXT: [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
268
+ ; CHECK-NEXT: [[B:%.*]] = sub <2 x i32> [[Y32OP0]], [[X321]]
269
+ ; CHECK-NEXT: [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
270
+ ; CHECK-NEXT: ret <2 x i16> [[R]]
271
+ ;
272
+ %y32op0 = sdiv <2 x i32 > %y32 , <i32 7 , i32 -17 >
273
+ %x32 = sext <2 x i16 > %x16 to <2 x i32 >
274
+ %b = sub <2 x i32 > %y32op0 , %x32
275
+ %r = trunc <2 x i32 > %b to <2 x i16 >
276
+ ret <2 x i16 > %r
277
+ }
278
+
279
+ define <2 x i16 > @narrow_zext_sub_commute (<2 x i16 > %x16 , <2 x i32 > %y32 ) {
280
+ ; CHECK-LABEL: @narrow_zext_sub_commute(
281
+ ; CHECK-NEXT: [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
282
+ ; CHECK-NEXT: [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
283
+ ; CHECK-NEXT: [[B:%.*]] = sub <2 x i32> [[Y32OP0]], [[X32]]
284
+ ; CHECK-NEXT: [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
285
+ ; CHECK-NEXT: ret <2 x i16> [[R]]
286
+ ;
287
+ %y32op0 = sdiv <2 x i32 > %y32 , <i32 7 , i32 -17 >
288
+ %x32 = zext <2 x i16 > %x16 to <2 x i32 >
289
+ %b = sub <2 x i32 > %y32op0 , %x32
290
+ %r = trunc <2 x i32 > %b to <2 x i16 >
291
+ ret <2 x i16 > %r
292
+ }
293
+
238
294
define <2 x i16 > @narrow_sext_mul_commute (<2 x i16 > %x16 , <2 x i32 > %y32 ) {
239
295
; CHECK-LABEL: @narrow_sext_mul_commute(
240
296
; CHECK-NEXT: [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
0 commit comments