; 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 }