10a03240fSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 20a03240fSCraig Topper; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s 30a03240fSCraig Topper 40a03240fSCraig Topperdeclare <2 x i64> @llvm.ushl.sat.v2i64(<2 x i64>, <2 x i64>) 50a03240fSCraig Topperdeclare <4 x i32> @llvm.ushl.sat.v4i32(<4 x i32>, <4 x i32>) 60a03240fSCraig Topperdeclare <8 x i16> @llvm.ushl.sat.v8i16(<8 x i16>, <8 x i16>) 70a03240fSCraig Topperdeclare <16 x i8> @llvm.ushl.sat.v16i8(<16 x i8>, <16 x i8>) 80a03240fSCraig Topper 90a03240fSCraig Topperdefine <2 x i64> @vec_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind { 100a03240fSCraig Topper; CHECK-LABEL: vec_v2i64: 110a03240fSCraig Topper; CHECK: # %bb.0: 120a03240fSCraig Topper; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 13*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v10, v8, v9 14*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v9, v10, v9 15*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v9 16*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v10, -1, v0 170a03240fSCraig Topper; CHECK-NEXT: ret 180a03240fSCraig Topper %tmp = call <2 x i64> @llvm.ushl.sat.v2i64(<2 x i64> %x, <2 x i64> %y) 190a03240fSCraig Topper ret <2 x i64> %tmp 200a03240fSCraig Topper} 210a03240fSCraig Topper 220a03240fSCraig Topperdefine <4 x i32> @vec_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind { 230a03240fSCraig Topper; CHECK-LABEL: vec_v4i32: 240a03240fSCraig Topper; CHECK: # %bb.0: 250a03240fSCraig Topper; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 26*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v10, v8, v9 27*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v9, v10, v9 28*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v9 29*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v10, -1, v0 300a03240fSCraig Topper; CHECK-NEXT: ret 310a03240fSCraig Topper %tmp = call <4 x i32> @llvm.ushl.sat.v4i32(<4 x i32> %x, <4 x i32> %y) 320a03240fSCraig Topper ret <4 x i32> %tmp 330a03240fSCraig Topper} 340a03240fSCraig Topper 350a03240fSCraig Topperdefine <8 x i16> @vec_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind { 360a03240fSCraig Topper; CHECK-LABEL: vec_v8i16: 370a03240fSCraig Topper; CHECK: # %bb.0: 380a03240fSCraig Topper; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 39*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v10, v8, v9 40*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v9, v10, v9 41*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v9 42*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v10, -1, v0 430a03240fSCraig Topper; CHECK-NEXT: ret 440a03240fSCraig Topper %tmp = call <8 x i16> @llvm.ushl.sat.v8i16(<8 x i16> %x, <8 x i16> %y) 450a03240fSCraig Topper ret <8 x i16> %tmp 460a03240fSCraig Topper} 470a03240fSCraig Topper 480a03240fSCraig Topperdefine <16 x i8> @vec_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind { 490a03240fSCraig Topper; CHECK-LABEL: vec_v16i8: 500a03240fSCraig Topper; CHECK: # %bb.0: 510a03240fSCraig Topper; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 52*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v10, v8, v9 53*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v9, v10, v9 54*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v9 55*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v10, -1, v0 560a03240fSCraig Topper; CHECK-NEXT: ret 570a03240fSCraig Topper %tmp = call <16 x i8> @llvm.ushl.sat.v16i8(<16 x i8> %x, <16 x i8> %y) 580a03240fSCraig Topper ret <16 x i8> %tmp 590a03240fSCraig Topper} 60*00d93defSCraig Topper 61*00d93defSCraig Topperdeclare <vscale x 2 x i64> @llvm.ushl.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 62*00d93defSCraig Topperdeclare <vscale x 4 x i32> @llvm.ushl.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 63*00d93defSCraig Topperdeclare <vscale x 8 x i16> @llvm.ushl.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 64*00d93defSCraig Topperdeclare <vscale x 16 x i8> @llvm.ushl.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 65*00d93defSCraig Topper 66*00d93defSCraig Topperdefine <vscale x 2 x i64> @vec_nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y) nounwind { 67*00d93defSCraig Topper; CHECK-LABEL: vec_nxv2i64: 68*00d93defSCraig Topper; CHECK: # %bb.0: 69*00d93defSCraig Topper; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 70*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v12, v8, v10 71*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v10, v12, v10 72*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v10 73*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v12, -1, v0 74*00d93defSCraig Topper; CHECK-NEXT: ret 75*00d93defSCraig Topper %tmp = call <vscale x 2 x i64> @llvm.ushl.sat.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i64> %y) 76*00d93defSCraig Topper ret <vscale x 2 x i64> %tmp 77*00d93defSCraig Topper} 78*00d93defSCraig Topper 79*00d93defSCraig Topperdefine <vscale x 4 x i32> @vec_nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) nounwind { 80*00d93defSCraig Topper; CHECK-LABEL: vec_nxv4i32: 81*00d93defSCraig Topper; CHECK: # %bb.0: 82*00d93defSCraig Topper; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 83*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v12, v8, v10 84*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v10, v12, v10 85*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v10 86*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v12, -1, v0 87*00d93defSCraig Topper; CHECK-NEXT: ret 88*00d93defSCraig Topper %tmp = call <vscale x 4 x i32> @llvm.ushl.sat.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i32> %y) 89*00d93defSCraig Topper ret <vscale x 4 x i32> %tmp 90*00d93defSCraig Topper} 91*00d93defSCraig Topper 92*00d93defSCraig Topperdefine <vscale x 8 x i16> @vec_nxv8i16(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) nounwind { 93*00d93defSCraig Topper; CHECK-LABEL: vec_nxv8i16: 94*00d93defSCraig Topper; CHECK: # %bb.0: 95*00d93defSCraig Topper; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 96*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v12, v8, v10 97*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v10, v12, v10 98*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v10 99*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v12, -1, v0 100*00d93defSCraig Topper; CHECK-NEXT: ret 101*00d93defSCraig Topper %tmp = call <vscale x 8 x i16> @llvm.ushl.sat.nxv8i16(<vscale x 8 x i16> %x, <vscale x 8 x i16> %y) 102*00d93defSCraig Topper ret <vscale x 8 x i16> %tmp 103*00d93defSCraig Topper} 104*00d93defSCraig Topper 105*00d93defSCraig Topperdefine <vscale x 16 x i8> @vec_nxv16i8(<vscale x 16 x i8> %x, <vscale x 16 x i8> %y) nounwind { 106*00d93defSCraig Topper; CHECK-LABEL: vec_nxv16i8: 107*00d93defSCraig Topper; CHECK: # %bb.0: 108*00d93defSCraig Topper; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 109*00d93defSCraig Topper; CHECK-NEXT: vsll.vv v12, v8, v10 110*00d93defSCraig Topper; CHECK-NEXT: vsrl.vv v10, v12, v10 111*00d93defSCraig Topper; CHECK-NEXT: vmsne.vv v0, v8, v10 112*00d93defSCraig Topper; CHECK-NEXT: vmerge.vim v8, v12, -1, v0 113*00d93defSCraig Topper; CHECK-NEXT: ret 114*00d93defSCraig Topper %tmp = call <vscale x 16 x i8> @llvm.ushl.sat.nxv16i8(<vscale x 16 x i8> %x, <vscale x 16 x i8> %y) 115*00d93defSCraig Topper ret <vscale x 16 x i8> %tmp 116*00d93defSCraig Topper} 117