@@ -103,15 +103,21 @@ define <vscale x 4 x i32> @sabd_s_promoted_ops(<vscale x 4 x i16> %a, <vscale x
103103 ret <vscale x 4 x i32 > %abs
104104}
105105
106- ; FIXME: Crashes legalization if enabled
107- ;; define <vscale x 2 x i64> @sabd_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
108- ;; %a.sext = sext <vscale x 2 x i64> %a to <vscale x 2 x i128>
109- ;; %b.sext = sext <vscale x 2 x i64> %b to <vscale x 2 x i128>
110- ;; %sub = sub <vscale x 2 x i128> %a.sext, %b.sext
111- ;; %abs = call <vscale x 2 x i128> @llvm.abs.nxv2i128(<vscale x 2 x i128> %sub, i1 true)
112- ;; %trunc = trunc <vscale x 2 x i128> %abs to <vscale x 2 x i64>
113- ;; ret <vscale x 2 x i64> %trunc
114- ;; }
106+ define <vscale x 2 x i64 > @sabd_d (<vscale x 2 x i64 > %a , <vscale x 2 x i64 > %b ) {
107+ ; CHECK-LABEL: sabd_d:
108+ ; CHECK: # %bb.0:
109+ ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
110+ ; CHECK-NEXT: vmin.vv v12, v8, v10
111+ ; CHECK-NEXT: vmax.vv v8, v8, v10
112+ ; CHECK-NEXT: vsub.vv v8, v8, v12
113+ ; CHECK-NEXT: ret
114+ %a.sext = sext <vscale x 2 x i64 > %a to <vscale x 2 x i128 >
115+ %b.sext = sext <vscale x 2 x i64 > %b to <vscale x 2 x i128 >
116+ %sub = sub <vscale x 2 x i128 > %a.sext , %b.sext
117+ %abs = call <vscale x 2 x i128 > @llvm.abs.nxv2i128 (<vscale x 2 x i128 > %sub , i1 true )
118+ %trunc = trunc <vscale x 2 x i128 > %abs to <vscale x 2 x i64 >
119+ ret <vscale x 2 x i64 > %trunc
120+ }
115121
116122define <vscale x 2 x i64 > @sabd_d_promoted_ops (<vscale x 2 x i32 > %a , <vscale x 2 x i32 > %b ) {
117123; CHECK-LABEL: sabd_d_promoted_ops:
@@ -231,15 +237,21 @@ define <vscale x 4 x i32> @uabd_s_promoted_ops(<vscale x 4 x i16> %a, <vscale x
231237 ret <vscale x 4 x i32 > %abs
232238}
233239
234- ; FIXME: Crashes legalization if enabled
235- ;; define <vscale x 2 x i64> @uabd_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
236- ;; %a.zext = zext <vscale x 2 x i64> %a to <vscale x 2 x i128>
237- ;; %b.zext = zext <vscale x 2 x i64> %b to <vscale x 2 x i128>
238- ;; %sub = sub <vscale x 2 x i128> %a.zext, %b.zext
239- ;; %abs = call <vscale x 2 x i128> @llvm.abs.nxv2i128(<vscale x 2 x i128> %sub, i1 true)
240- ;; %trunc = trunc <vscale x 2 x i128> %abs to <vscale x 2 x i64>
241- ;; ret <vscale x 2 x i64> %trunc
242- ;; }
240+ define <vscale x 2 x i64 > @uabd_d (<vscale x 2 x i64 > %a , <vscale x 2 x i64 > %b ) {
241+ ; CHECK-LABEL: uabd_d:
242+ ; CHECK: # %bb.0:
243+ ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
244+ ; CHECK-NEXT: vminu.vv v12, v8, v10
245+ ; CHECK-NEXT: vmaxu.vv v8, v8, v10
246+ ; CHECK-NEXT: vsub.vv v8, v8, v12
247+ ; CHECK-NEXT: ret
248+ %a.zext = zext <vscale x 2 x i64 > %a to <vscale x 2 x i128 >
249+ %b.zext = zext <vscale x 2 x i64 > %b to <vscale x 2 x i128 >
250+ %sub = sub <vscale x 2 x i128 > %a.zext , %b.zext
251+ %abs = call <vscale x 2 x i128 > @llvm.abs.nxv2i128 (<vscale x 2 x i128 > %sub , i1 true )
252+ %trunc = trunc <vscale x 2 x i128 > %abs to <vscale x 2 x i64 >
253+ ret <vscale x 2 x i64 > %trunc
254+ }
243255
244256define <vscale x 2 x i64 > @uabd_d_promoted_ops (<vscale x 2 x i32 > %a , <vscale x 2 x i32 > %b ) {
245257; CHECK-LABEL: uabd_d_promoted_ops:
0 commit comments