1*f3632143SOliver Stannard; RUN: llc -mtriple armv8a-none-linux-gnu -mattr=+dotprod -float-abi=hard < %s | FileCheck %s 2*f3632143SOliver Stannard 3*f3632143SOliver Stannarddeclare <2 x i32> @llvm.arm.neon.udot.v2i32.v8i8(<2 x i32>, <8 x i8>, <8 x i8>) 4*f3632143SOliver Stannarddeclare <4 x i32> @llvm.arm.neon.udot.v4i32.v16i8(<4 x i32>, <16 x i8>, <16 x i8>) 5*f3632143SOliver Stannarddeclare <2 x i32> @llvm.arm.neon.sdot.v2i32.v8i8(<2 x i32>, <8 x i8>, <8 x i8>) 6*f3632143SOliver Stannarddeclare <4 x i32> @llvm.arm.neon.sdot.v4i32.v16i8(<4 x i32>, <16 x i8>, <16 x i8>) 7*f3632143SOliver Stannard 8*f3632143SOliver Stannarddefine <2 x i32> @test_vdot_u32(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) #0 { 9*f3632143SOliver Stannardentry: 10*f3632143SOliver Stannard; CHECK-LABEL: test_vdot_u32: 11*f3632143SOliver Stannard; CHECK: vudot.u8 d0, d1, d2 12*f3632143SOliver Stannard %vdot1.i = call <2 x i32> @llvm.arm.neon.udot.v2i32.v8i8(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) #2 13*f3632143SOliver Stannard ret <2 x i32> %vdot1.i 14*f3632143SOliver Stannard} 15*f3632143SOliver Stannard 16*f3632143SOliver Stannarddefine <4 x i32> @test_vdotq_u32(<4 x i32> %a, <16 x i8> %b, <16 x i8> %c) #0 { 17*f3632143SOliver Stannardentry: 18*f3632143SOliver Stannard; CHECK-LABEL: test_vdotq_u32: 19*f3632143SOliver Stannard; CHECK: vudot.u8 q0, q1, q2 20*f3632143SOliver Stannard %vdot1.i = call <4 x i32> @llvm.arm.neon.udot.v4i32.v16i8(<4 x i32> %a, <16 x i8> %b, <16 x i8> %c) #2 21*f3632143SOliver Stannard ret <4 x i32> %vdot1.i 22*f3632143SOliver Stannard} 23*f3632143SOliver Stannard 24*f3632143SOliver Stannarddefine <2 x i32> @test_vdot_s32(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) #0 { 25*f3632143SOliver Stannardentry: 26*f3632143SOliver Stannard; CHECK-LABEL: test_vdot_s32: 27*f3632143SOliver Stannard; CHECK: vsdot.s8 d0, d1, d2 28*f3632143SOliver Stannard %vdot1.i = call <2 x i32> @llvm.arm.neon.sdot.v2i32.v8i8(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) #2 29*f3632143SOliver Stannard ret <2 x i32> %vdot1.i 30*f3632143SOliver Stannard} 31*f3632143SOliver Stannard 32*f3632143SOliver Stannarddefine <4 x i32> @test_vdotq_s32(<4 x i32> %a, <16 x i8> %b, <16 x i8> %c) #0 { 33*f3632143SOliver Stannardentry: 34*f3632143SOliver Stannard; CHECK-LABEL: test_vdotq_s32: 35*f3632143SOliver Stannard; CHECK: vsdot.s8 q0, q1, q2 36*f3632143SOliver Stannard %vdot1.i = call <4 x i32> @llvm.arm.neon.sdot.v4i32.v16i8(<4 x i32> %a, <16 x i8> %b, <16 x i8> %c) #2 37*f3632143SOliver Stannard ret <4 x i32> %vdot1.i 38*f3632143SOliver Stannard} 39*f3632143SOliver Stannard 40*f3632143SOliver Stannarddefine <2 x i32> @test_vdot_lane_u32(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) { 41*f3632143SOliver Stannardentry: 42*f3632143SOliver Stannard; CHECK-LABEL: test_vdot_lane_u32: 43*f3632143SOliver Stannard; CHECK: vudot.u8 d0, d1, d2[1] 44*f3632143SOliver Stannard %.cast = bitcast <8 x i8> %c to <2 x i32> 45*f3632143SOliver Stannard %shuffle = shufflevector <2 x i32> %.cast, <2 x i32> undef, <2 x i32> <i32 1, i32 1> 46*f3632143SOliver Stannard %.cast5 = bitcast <2 x i32> %shuffle to <8 x i8> 47*f3632143SOliver Stannard %vdot1.i = call <2 x i32> @llvm.arm.neon.udot.v2i32.v8i8(<2 x i32> %a, <8 x i8> %b, <8 x i8> %.cast5) #2 48*f3632143SOliver Stannard ret <2 x i32> %vdot1.i 49*f3632143SOliver Stannard} 50*f3632143SOliver Stannard 51*f3632143SOliver Stannarddefine <4 x i32> @test_vdotq_lane_u32(<4 x i32> %a, <16 x i8> %b, <8 x i8> %c) { 52*f3632143SOliver Stannardentry: 53*f3632143SOliver Stannard; CHECK-LABEL: test_vdotq_lane_u32: 54*f3632143SOliver Stannard; CHECK: vudot.u8 q0, q1, d4[1] 55*f3632143SOliver Stannard %.cast = bitcast <8 x i8> %c to <2 x i32> 56*f3632143SOliver Stannard %shuffle = shufflevector <2 x i32> %.cast, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 57*f3632143SOliver Stannard %.cast3 = bitcast <4 x i32> %shuffle to <16 x i8> 58*f3632143SOliver Stannard %vdot1.i = call <4 x i32> @llvm.arm.neon.udot.v4i32.v16i8(<4 x i32> %a, <16 x i8> %b, <16 x i8> %.cast3) #2 59*f3632143SOliver Stannard ret <4 x i32> %vdot1.i 60*f3632143SOliver Stannard} 61*f3632143SOliver Stannard 62*f3632143SOliver Stannarddefine <2 x i32> @test_vdot_lane_s32(<2 x i32> %a, <8 x i8> %b, <8 x i8> %c) { 63*f3632143SOliver Stannardentry: 64*f3632143SOliver Stannard; CHECK-LABEL: test_vdot_lane_s32: 65*f3632143SOliver Stannard; CHECK: vsdot.s8 d0, d1, d2[1] 66*f3632143SOliver Stannard %.cast = bitcast <8 x i8> %c to <2 x i32> 67*f3632143SOliver Stannard %shuffle = shufflevector <2 x i32> %.cast, <2 x i32> undef, <2 x i32> <i32 1, i32 1> 68*f3632143SOliver Stannard %.cast5 = bitcast <2 x i32> %shuffle to <8 x i8> 69*f3632143SOliver Stannard %vdot1.i = call <2 x i32> @llvm.arm.neon.sdot.v2i32.v8i8(<2 x i32> %a, <8 x i8> %b, <8 x i8> %.cast5) #2 70*f3632143SOliver Stannard ret <2 x i32> %vdot1.i 71*f3632143SOliver Stannard} 72*f3632143SOliver Stannard 73*f3632143SOliver Stannarddefine <4 x i32> @test_vdotq_lane_s32(<4 x i32> %a, <16 x i8> %b, <8 x i8> %c) { 74*f3632143SOliver Stannardentry: 75*f3632143SOliver Stannard; CHECK-LABEL: test_vdotq_lane_s32: 76*f3632143SOliver Stannard; CHECK: vsdot.s8 q0, q1, d4[1] 77*f3632143SOliver Stannard %.cast = bitcast <8 x i8> %c to <2 x i32> 78*f3632143SOliver Stannard %shuffle = shufflevector <2 x i32> %.cast, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 79*f3632143SOliver Stannard %.cast3 = bitcast <4 x i32> %shuffle to <16 x i8> 80*f3632143SOliver Stannard %vdot1.i = call <4 x i32> @llvm.arm.neon.sdot.v4i32.v16i8(<4 x i32> %a, <16 x i8> %b, <16 x i8> %.cast3) #2 81*f3632143SOliver Stannard ret <4 x i32> %vdot1.i 82*f3632143SOliver Stannard} 83