llvm/llvm/test/CodeGen/Hexagon/autohvx/funnel-128b.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -march=hexagon -mattr=+hvxv60,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V60 %s
; RUN: llc -march=hexagon -mattr=+hvxv62,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V62 %s
; RUN: llc -march=hexagon -mattr=+hvxv66,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V66 %s

define <128 x i8> @f0(<128 x i8> %a0, <128 x i8> %a1, i8 %a2) #0 {
; V60-LABEL: f0:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = vsplatb(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = ##117901063
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3:2.uh = vzxt(v2.ub)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vasl(v0.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.h = vasl(v1.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f0:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r2 = #7
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.b = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.b = vsplat(r2)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3:2.uh = vzxt(v2.ub)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vasl(v0.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vasl(v1.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f0:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r2 = #7
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.b = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.b = vsplat(r2)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.uh = vzxt(v2.ub)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vasl(v0.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vasl(v1.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <128 x i8> undef, i8 %a2, i32 0
  %v1 = shufflevector <128 x i8> %v0, <128 x i8> undef, <128 x i32> zeroinitializer
  %v2 = call <128 x i8> @llvm.fshl.v128i8(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %v1)
  ret <128 x i8> %v2
}

define <64 x i16> @f1(<64 x i16> %a0, <64 x i16> %a1, i16 %a2) #0 {
; V60-LABEL: f1:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1 = and(r0,#15)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     p0 = bitsclr(r0,#15)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2.h = vasl(v0.h,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = sub(#16,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.uh = vlsr(v1.uh,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1 = vor(v2,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     if (!p0) v0 = v1
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f1:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1 = and(r0,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     p0 = bitsclr(r0,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.h = vasl(v0.h,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     r1 = sub(#16,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.uh = vlsr(v1.uh,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1 = vor(v2,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     if (!p0) v0 = v1
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f1:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r1 = and(r0,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     p0 = bitsclr(r0,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.h = vasl(v0.h,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     r1 = sub(#16,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.uh = vlsr(v1.uh,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1 = vor(v2,v1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     if (!p0) v0 = v1
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <64 x i16> undef, i16 %a2, i32 0
  %v1 = shufflevector <64 x i16> %v0, <64 x i16> undef, <64 x i32> zeroinitializer
  %v2 = call <64 x i16> @llvm.fshl.v64i16(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %v1)
  ret <64 x i16> %v2
}

define <32 x i32> @f2(<32 x i32> %a0, <32 x i32> %a1, i32 %a2) #0 {
; V60-LABEL: f2:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1 = and(r0,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     p0 = bitsclr(r0,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2.w = vasl(v0.w,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = sub(#32,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.uw = vlsr(v1.uw,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1 = vor(v2,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     if (!p0) v0 = v1
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f2:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1 = and(r0,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     p0 = bitsclr(r0,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.w = vasl(v0.w,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     r1 = sub(#32,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.uw = vlsr(v1.uw,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1 = vor(v2,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     if (!p0) v0 = v1
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f2:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r0 = and(r0,#31)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     r1 = #32
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4 = vxor(v4,v4)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3 = vsplat(r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.w = vsub(v3.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.w = vsub(v4.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4.w = vlsr(v1.w,v3.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v5:4.w = vasrinto(v0.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = v5
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <32 x i32> undef, i32 %a2, i32 0
  %v1 = shufflevector <32 x i32> %v0, <32 x i32> undef, <32 x i32> zeroinitializer
  %v2 = call <32 x i32> @llvm.fshl.v32i32(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %v1)
  ret <32 x i32> %v2
}

define <128 x i8> @f3(<128 x i8> %a0, <128 x i8> %a1, i8 %a2) #0 {
; V60-LABEL: f3:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = vsplatb(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = ##117901063
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3:2.uh = vzxt(v2.ub)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f3:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r2 = #7
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.b = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.b = vsplat(r2)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3:2.uh = vzxt(v2.ub)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f3:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r2 = #7
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.b = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.b = vsplat(r2)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.uh = vzxt(v2.ub)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <128 x i8> undef, i8 %a2, i32 0
  %v1 = shufflevector <128 x i8> %v0, <128 x i8> undef, <128 x i32> zeroinitializer
  %v2 = call <128 x i8> @llvm.fshr.v128i8(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %v1)
  ret <128 x i8> %v2
}

define <64 x i16> @f4(<64 x i16> %a0, <64 x i16> %a1, i16 %a2) #0 {
; V60-LABEL: f4:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1 = and(r0,#15)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     p0 = bitsclr(r0,#15)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2.uh = vlsr(v1.uh,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = sub(#16,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vasl(v0.h,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vor(v0,v2)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     if (p0) v0 = v1
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f4:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1 = and(r0,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     p0 = bitsclr(r0,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.uh = vlsr(v1.uh,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     r1 = sub(#16,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vasl(v0.h,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v2)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     if (p0) v0 = v1
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f4:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r1 = and(r0,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     p0 = bitsclr(r0,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.uh = vlsr(v1.uh,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     r1 = sub(#16,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vasl(v0.h,r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = vor(v0,v2)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     if (p0) v0 = v1
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <64 x i16> undef, i16 %a2, i32 0
  %v1 = shufflevector <64 x i16> %v0, <64 x i16> undef, <64 x i32> zeroinitializer
  %v2 = call <64 x i16> @llvm.fshr.v64i16(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %v1)
  ret <64 x i16> %v2
}

define <32 x i32> @f5(<32 x i32> %a0, <32 x i32> %a1, i32 %a2) #0 {
; V60-LABEL: f5:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1 = and(r0,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     p0 = bitsclr(r0,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2.uw = vlsr(v1.uw,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = sub(#32,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.w = vasl(v0.w,r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vor(v0,v2)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     if (p0) v0 = v1
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f5:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1 = and(r0,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     p0 = bitsclr(r0,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2.uw = vlsr(v1.uw,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     r1 = sub(#32,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.w = vasl(v0.w,r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v2)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     if (p0) v0 = v1
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f5:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r0 = and(r0,#31)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3 = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.w = vlsr(v1.w,v3.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.w = vasrinto(v0.w,v3.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = v2
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = insertelement <32 x i32> undef, i32 %a2, i32 0
  %v1 = shufflevector <32 x i32> %v0, <32 x i32> undef, <32 x i32> zeroinitializer
  %v2 = call <32 x i32> @llvm.fshr.v32i32(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %v1)
  ret <32 x i32> %v2
}

define <128 x i8> @f6(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %a2) #0 {
; V60-LABEL: f6:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = ##117901063
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3:2.uh = vzxt(v2.ub)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vasl(v0.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.h = vasl(v1.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f6:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r0 = #7
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.b = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3:2.uh = vzxt(v2.ub)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vasl(v0.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vasl(v1.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f6:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r0 = #7
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.b = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.uh = vzxt(v2.ub)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vasl(v0.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vasl(v1.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.b = vshuffo(v1.b,v0.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <128 x i8> @llvm.fshl.v128i8(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %a2)
  ret <128 x i8> %v0
}

define <64 x i16> @f7(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %a2) #0 {
; V60-LABEL: f7:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = ##983055
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = ##1048592
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vxor(v3,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v5 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v4)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4.h = vsub(v5.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     q0 = vcmp.eq(v2.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v31.h = vasl(v0.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.h = vlsr(v1.h,v4.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1 = vor(v31,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vmux(q0,v0,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f7:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1:0 = combine(#16,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.h = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v4.h = vsplat(r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.h = vsub(v4.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vasl(v0.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f7:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r1:0 = combine(#16,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.h = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4.h = vsplat(r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.h = vsub(v4.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vasl(v0.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = vor(v0,v1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <64 x i16> @llvm.fshl.v64i16(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %a2)
  ret <64 x i16> %v0
}

define <32 x i32> @f8(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %a2) #0 {
; V60-LABEL: f8:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1:0 = combine(#32,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vxor(v3,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v5 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v4)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v5.w = vsub(v5.w,v2.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4 = vand(v2,v4)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2.w = vasl(v0.w,v2.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     q0 = vcmp.eq(v4.w,v3.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.w = vlsr(v1.w,v5.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1 = vor(v2,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vmux(q0,v0,v1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f8:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1:0 = combine(#32,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3 = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v4 = vsplat(r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.w = vsub(v4.w,v2.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.w = vasl(v0.w,v2.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.w = vlsr(v1.w,v3.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f8:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r1:0 = combine(#32,#31)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v31 = vxor(v31,v31)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3 = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4 = vsplat(r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4.w = vsub(v4.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.w = vsub(v31.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4.w = vlsr(v1.w,v4.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v5:4.w = vasrinto(v0.w,v2.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = v5
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <32 x i32> @llvm.fshl.v32i32(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %a2)
  ret <32 x i32> %v0
}

define <128 x i8> @f9(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %a2) #0 {
; V60-LABEL: f9:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = ##117901063
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3:2.uh = vzxt(v2.ub)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f9:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r0 = #7
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.b = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3:2.uh = vzxt(v2.ub)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f9:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r0 = #7
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1:0.b = vshuffoe(v0.b,v1.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.b = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.uh = vzxt(v2.ub)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vlsr(v0.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vlsr(v1.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.b = vshuffe(v1.b,v0.b)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <128 x i8> @llvm.fshr.v128i8(<128 x i8> %a0, <128 x i8> %a1, <128 x i8> %a2)
  ret <128 x i8> %v0
}

define <64 x i16> @f10(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %a2) #0 {
; V60-LABEL: f10:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r0 = ##983055
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     r1 = ##1048592
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vxor(v3,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v5 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v4)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4.h = vsub(v5.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     q0 = vcmp.eq(v2.h,v3.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v31.h = vlsr(v1.h,v2.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.h = vasl(v0.h,v4.h)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vor(v0,v31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vmux(q0,v1,v0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f10:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1:0 = combine(#16,#15)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.h = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v4.h = vsplat(r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.h = vsub(v2.h,v4.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.h = vlsr(v1.h,v2.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.h = vlsr(v0.h,v3.h)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f10:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r1:0 = combine(#16,#15)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.h = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v4.h = vsplat(r1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3.h = vsub(v2.h,v4.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v1.h = vlsr(v1.h,v2.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0.h = vlsr(v0.h,v3.h)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = vor(v0,v1)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <64 x i16> @llvm.fshr.v64i16(<64 x i16> %a0, <64 x i16> %a1, <64 x i16> %a2)
  ret <64 x i16> %v0
}

define <32 x i32> @f11(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %a2) #0 {
; V60-LABEL: f11:
; V60:       // %bb.0:
; V60-NEXT:    {
; V60-NEXT:     r1:0 = combine(#32,#31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v3 = vxor(v3,v3)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4 = vsplat(r0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v5 = vsplat(r1)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v2 = vand(v2,v4)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v4.w = vsub(v5.w,v2.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     q0 = vcmp.eq(v2.w,v3.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v31.w = vlsr(v1.w,v2.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0.w = vasl(v0.w,v4.w)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vor(v0,v31)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     v0 = vmux(q0,v1,v0)
; V60-NEXT:    }
; V60-NEXT:    {
; V60-NEXT:     jumpr r31
; V60-NEXT:    }
;
; V62-LABEL: f11:
; V62:       // %bb.0:
; V62-NEXT:    {
; V62-NEXT:     r1:0 = combine(#32,#31)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3 = vsplat(r0)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v4 = vsplat(r1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v2 = vand(v2,v3)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v3.w = vsub(v2.w,v4.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v1.w = vlsr(v1.w,v2.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0.w = vlsr(v0.w,v3.w)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     v0 = vor(v0,v1)
; V62-NEXT:    }
; V62-NEXT:    {
; V62-NEXT:     jumpr r31
; V62-NEXT:    }
;
; V66-LABEL: f11:
; V66:       // %bb.0:
; V66-NEXT:    {
; V66-NEXT:     r0 = #31
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3 = vsplat(r0)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3 = vand(v2,v3)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v2.w = vlsr(v1.w,v3.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v3:2.w = vasrinto(v0.w,v3.w)
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     v0 = v2
; V66-NEXT:    }
; V66-NEXT:    {
; V66-NEXT:     jumpr r31
; V66-NEXT:    }
  %v0 = call <32 x i32> @llvm.fshr.v32i32(<32 x i32> %a0, <32 x i32> %a1, <32 x i32> %a2)
  ret <32 x i32> %v0
}

declare <128 x i8> @llvm.fshl.v128i8(<128 x i8>, <128 x i8>, <128 x i8>)
declare <128 x i8> @llvm.fshr.v128i8(<128 x i8>, <128 x i8>, <128 x i8>)
declare <64 x i16> @llvm.fshl.v64i16(<64 x i16>, <64 x i16>, <64 x i16>)
declare <64 x i16> @llvm.fshr.v64i16(<64 x i16>, <64 x i16>, <64 x i16>)
declare <32 x i32> @llvm.fshl.v32i32(<32 x i32>, <32 x i32>, <32 x i32>)
declare <32 x i32> @llvm.fshr.v32i32(<32 x i32>, <32 x i32>, <32 x i32>)

attributes #0 = { nounwind }