1*75268812SMikhail Maltsev; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*75268812SMikhail Maltsev; RUN: llc -mtriple=armv8.6a-arm-none-eabi -mattr=+bf16,+neon,fullfp16 < %s | FileCheck %s 3*75268812SMikhail Maltsev; FIXME: Remove fullfp16 once bfloat arguments and returns lowering stops 4*75268812SMikhail Maltsev; depending on it. 5*75268812SMikhail Maltsev 6*75268812SMikhail Maltsevtarget datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 7*75268812SMikhail Maltsevtarget triple = "armv8.6a-arm-none-eabi" 8*75268812SMikhail Maltsev 9*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vcreate_bf16(i64 %a) { 10*75268812SMikhail Maltsev; CHECK-LABEL: test_vcreate_bf16: 11*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 12*75268812SMikhail Maltsev; CHECK-NEXT: vmov d0, r0, r1 13*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 14*75268812SMikhail Maltseventry: 15*75268812SMikhail Maltsev %0 = bitcast i64 %a to <4 x bfloat> 16*75268812SMikhail Maltsev ret <4 x bfloat> %0 17*75268812SMikhail Maltsev} 18*75268812SMikhail Maltsev 19*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vdup_n_bf16(bfloat %v) { 20*75268812SMikhail Maltsev; CHECK-LABEL: test_vdup_n_bf16: 21*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 22*75268812SMikhail Maltsev; CHECK-NEXT: @ kill: def $s0 killed $s0 def $d0 23*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 d0, d0[0] 24*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 25*75268812SMikhail Maltseventry: 26*75268812SMikhail Maltsev %vecinit.i = insertelement <4 x bfloat> undef, bfloat %v, i32 0 27*75268812SMikhail Maltsev %vecinit3.i = shufflevector <4 x bfloat> %vecinit.i, <4 x bfloat> undef, <4 x i32> zeroinitializer 28*75268812SMikhail Maltsev ret <4 x bfloat> %vecinit3.i 29*75268812SMikhail Maltsev} 30*75268812SMikhail Maltsev 31*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x bfloat> @test_vdupq_n_bf16(bfloat %v) { 32*75268812SMikhail Maltsev; CHECK-LABEL: test_vdupq_n_bf16: 33*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 34*75268812SMikhail Maltsev; CHECK-NEXT: @ kill: def $s0 killed $s0 def $d0 35*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 q0, d0[0] 36*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 37*75268812SMikhail Maltseventry: 38*75268812SMikhail Maltsev %vecinit.i = insertelement <8 x bfloat> undef, bfloat %v, i32 0 39*75268812SMikhail Maltsev %vecinit7.i = shufflevector <8 x bfloat> %vecinit.i, <8 x bfloat> undef, <8 x i32> zeroinitializer 40*75268812SMikhail Maltsev ret <8 x bfloat> %vecinit7.i 41*75268812SMikhail Maltsev} 42*75268812SMikhail Maltsev 43*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vdup_lane_bf16(<4 x bfloat> %v) { 44*75268812SMikhail Maltsev; CHECK-LABEL: test_vdup_lane_bf16: 45*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 46*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 d0, d0[1] 47*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 48*75268812SMikhail Maltseventry: 49*75268812SMikhail Maltsev %lane = shufflevector <4 x bfloat> %v, <4 x bfloat> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 50*75268812SMikhail Maltsev ret <4 x bfloat> %lane 51*75268812SMikhail Maltsev} 52*75268812SMikhail Maltsev 53*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x bfloat> @test_vdupq_lane_bf16(<4 x bfloat> %v) { 54*75268812SMikhail Maltsev; CHECK-LABEL: test_vdupq_lane_bf16: 55*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 56*75268812SMikhail Maltsev; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0 57*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 q0, d0[1] 58*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 59*75268812SMikhail Maltseventry: 60*75268812SMikhail Maltsev %lane = shufflevector <4 x bfloat> %v, <4 x bfloat> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 61*75268812SMikhail Maltsev ret <8 x bfloat> %lane 62*75268812SMikhail Maltsev} 63*75268812SMikhail Maltsev 64*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vdup_laneq_bf16(<8 x bfloat> %v) { 65*75268812SMikhail Maltsev; CHECK-LABEL: test_vdup_laneq_bf16: 66*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 67*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 d0, d1[3] 68*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 69*75268812SMikhail Maltseventry: 70*75268812SMikhail Maltsev %lane = shufflevector <8 x bfloat> %v, <8 x bfloat> undef, <4 x i32> <i32 7, i32 7, i32 7, i32 7> 71*75268812SMikhail Maltsev ret <4 x bfloat> %lane 72*75268812SMikhail Maltsev} 73*75268812SMikhail Maltsev 74*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x bfloat> @test_vdupq_laneq_bf16(<8 x bfloat> %v) { 75*75268812SMikhail Maltsev; CHECK-LABEL: test_vdupq_laneq_bf16: 76*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 77*75268812SMikhail Maltsev; CHECK-NEXT: vdup.16 q0, d1[3] 78*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 79*75268812SMikhail Maltseventry: 80*75268812SMikhail Maltsev %lane = shufflevector <8 x bfloat> %v, <8 x bfloat> undef, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> 81*75268812SMikhail Maltsev ret <8 x bfloat> %lane 82*75268812SMikhail Maltsev} 83*75268812SMikhail Maltsev 84*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x bfloat> @test_vcombine_bf16(<4 x bfloat> %low, <4 x bfloat> %high) { 85*75268812SMikhail Maltsev; CHECK-LABEL: test_vcombine_bf16: 86*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 87*75268812SMikhail Maltsev; CHECK-NEXT: vmov.f64 d16, d1 88*75268812SMikhail Maltsev; CHECK-NEXT: vorr d17, d0, d0 89*75268812SMikhail Maltsev; CHECK-NEXT: vorr q0, q8, q8 90*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 91*75268812SMikhail Maltseventry: 92*75268812SMikhail Maltsev %shuffle.i = shufflevector <4 x bfloat> %high, <4 x bfloat> %low, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 93*75268812SMikhail Maltsev ret <8 x bfloat> %shuffle.i 94*75268812SMikhail Maltsev} 95*75268812SMikhail Maltsev 96*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vget_high_bf16(<8 x bfloat> %a) { 97*75268812SMikhail Maltsev; CHECK-LABEL: test_vget_high_bf16: 98*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 99*75268812SMikhail Maltsev; CHECK-NEXT: vmov.f64 d0, d1 100*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 101*75268812SMikhail Maltseventry: 102*75268812SMikhail Maltsev %shuffle.i = shufflevector <8 x bfloat> %a, <8 x bfloat> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 103*75268812SMikhail Maltsev ret <4 x bfloat> %shuffle.i 104*75268812SMikhail Maltsev} 105*75268812SMikhail Maltsev 106*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vget_low_bf16(<8 x bfloat> %a) { 107*75268812SMikhail Maltsev; CHECK-LABEL: test_vget_low_bf16: 108*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 109*75268812SMikhail Maltsev; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 110*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 111*75268812SMikhail Maltseventry: 112*75268812SMikhail Maltsev %shuffle.i = shufflevector <8 x bfloat> %a, <8 x bfloat> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 113*75268812SMikhail Maltsev ret <4 x bfloat> %shuffle.i 114*75268812SMikhail Maltsev} 115*75268812SMikhail Maltsev 116*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc bfloat @test_vgetq_lane_bf16_even(<8 x bfloat> %v) { 117*75268812SMikhail Maltsev; CHECK-LABEL: test_vgetq_lane_bf16_even: 118*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 119*75268812SMikhail Maltsev; CHECK-NEXT: vmov.f32 s0, s3 120*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 121*75268812SMikhail Maltseventry: 122*75268812SMikhail Maltsev %0 = extractelement <8 x bfloat> %v, i32 6 123*75268812SMikhail Maltsev ret bfloat %0 124*75268812SMikhail Maltsev} 125*75268812SMikhail Maltsev 126*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc bfloat @test_vgetq_lane_bf16_odd(<8 x bfloat> %v) { 127*75268812SMikhail Maltsev; CHECK-LABEL: test_vgetq_lane_bf16_odd: 128*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 129*75268812SMikhail Maltsev; CHECK-NEXT: vmovx.f16 s0, s3 130*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 131*75268812SMikhail Maltseventry: 132*75268812SMikhail Maltsev %0 = extractelement <8 x bfloat> %v, i32 7 133*75268812SMikhail Maltsev ret bfloat %0 134*75268812SMikhail Maltsev} 135*75268812SMikhail Maltsev 136*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc bfloat @test_vget_lane_bf16_even(<4 x bfloat> %v) { 137*75268812SMikhail Maltsev; CHECK-LABEL: test_vget_lane_bf16_even: 138*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 139*75268812SMikhail Maltsev; CHECK-NEXT: vmov.f32 s0, s1 140*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 141*75268812SMikhail Maltseventry: 142*75268812SMikhail Maltsev %0 = extractelement <4 x bfloat> %v, i32 2 143*75268812SMikhail Maltsev ret bfloat %0 144*75268812SMikhail Maltsev} 145*75268812SMikhail Maltsev 146*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc bfloat @test_vget_lane_bf16_odd(<4 x bfloat> %v) { 147*75268812SMikhail Maltsev; CHECK-LABEL: test_vget_lane_bf16_odd: 148*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 149*75268812SMikhail Maltsev; CHECK-NEXT: vmovx.f16 s0, s0 150*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 151*75268812SMikhail Maltseventry: 152*75268812SMikhail Maltsev %0 = extractelement <4 x bfloat> %v, i32 1 153*75268812SMikhail Maltsev ret bfloat %0 154*75268812SMikhail Maltsev} 155*75268812SMikhail Maltsev 156*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vset_lane_bf16(bfloat %a, <4 x bfloat> %v) { 157*75268812SMikhail Maltsev; CHECK-LABEL: test_vset_lane_bf16: 158*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 159*75268812SMikhail Maltsev; CHECK-NEXT: vmov r0, s0 160*75268812SMikhail Maltsev; CHECK-NEXT: vmov.16 d1[1], r0 161*75268812SMikhail Maltsev; CHECK-NEXT: vorr d0, d1, d1 162*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 163*75268812SMikhail Maltseventry: 164*75268812SMikhail Maltsev %0 = insertelement <4 x bfloat> %v, bfloat %a, i32 1 165*75268812SMikhail Maltsev ret <4 x bfloat> %0 166*75268812SMikhail Maltsev} 167*75268812SMikhail Maltsev 168*75268812SMikhail Maltsevdefine arm_aapcs_vfpcc <8 x bfloat> @test_vsetq_lane_bf16(bfloat %a, <8 x bfloat> %v) { 169*75268812SMikhail Maltsev; CHECK-LABEL: test_vsetq_lane_bf16: 170*75268812SMikhail Maltsev; CHECK: @ %bb.0: @ %entry 171*75268812SMikhail Maltsev; CHECK-NEXT: vmov r0, s0 172*75268812SMikhail Maltsev; CHECK-NEXT: vmov.16 d3[3], r0 173*75268812SMikhail Maltsev; CHECK-NEXT: vorr q0, q1, q1 174*75268812SMikhail Maltsev; CHECK-NEXT: bx lr 175*75268812SMikhail Maltseventry: 176*75268812SMikhail Maltsev %0 = insertelement <8 x bfloat> %v, bfloat %a, i32 7 177*75268812SMikhail Maltsev ret <8 x bfloat> %0 178*75268812SMikhail Maltsev} 179