xref: /llvm-project/llvm/test/CodeGen/ARM/bf16-convert-intrinsics.ll (revision 3f353a2e5a98d19be2a4d7414b8eb258c32965fd)
1*3f353a2eSMikhail Maltsev; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*3f353a2eSMikhail Maltsev; RUN: llc < %s -verify-machineinstrs -mtriple=armv8.6a-arm-none-eabi -mattr=+neon,+bf16,+fullfp16 | FileCheck %s
3*3f353a2eSMikhail Maltsev
4*3f353a2eSMikhail Maltsevdeclare bfloat @llvm.arm.neon.vcvtbfp2bf(float)
5*3f353a2eSMikhail Maltsev
6*3f353a2eSMikhail Maltsev; Hard float ABI
7*3f353a2eSMikhail Maltsevdeclare <4 x bfloat> @llvm.arm.neon.vcvtfp2bf.v4bf16(<4 x float>)
8*3f353a2eSMikhail Maltsev
9*3f353a2eSMikhail Maltsevdefine arm_aapcs_vfpcc <4 x bfloat> @test_vcvt_bf16_f32_hardfp(<4 x float> %a) {
10*3f353a2eSMikhail Maltsev; CHECK-LABEL: test_vcvt_bf16_f32_hardfp:
11*3f353a2eSMikhail Maltsev; CHECK:       @ %bb.0: @ %entry
12*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vcvt.bf16.f32 d0, q0
13*3f353a2eSMikhail Maltsev; CHECK-NEXT:    bx lr
14*3f353a2eSMikhail Maltseventry:
15*3f353a2eSMikhail Maltsev  %vcvtfp2bf1.i.i = call <4 x bfloat> @llvm.arm.neon.vcvtfp2bf.v4bf16(<4 x float> %a)
16*3f353a2eSMikhail Maltsev  ret <4 x bfloat> %vcvtfp2bf1.i.i
17*3f353a2eSMikhail Maltsev}
18*3f353a2eSMikhail Maltsev
19*3f353a2eSMikhail Maltsevdefine arm_aapcs_vfpcc bfloat @test_vcvth_bf16_f32_hardfp(float %a) {
20*3f353a2eSMikhail Maltsev; CHECK-LABEL: test_vcvth_bf16_f32_hardfp:
21*3f353a2eSMikhail Maltsev; CHECK:       @ %bb.0: @ %entry
22*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vcvtb.bf16.f32 s0, s0
23*3f353a2eSMikhail Maltsev; CHECK-NEXT:    bx lr
24*3f353a2eSMikhail Maltseventry:
25*3f353a2eSMikhail Maltsev  %vcvtbfp2bf.i = call bfloat @llvm.arm.neon.vcvtbfp2bf(float %a)
26*3f353a2eSMikhail Maltsev  ret bfloat %vcvtbfp2bf.i
27*3f353a2eSMikhail Maltsev}
28*3f353a2eSMikhail Maltsev
29*3f353a2eSMikhail Maltsev; Soft float ABI
30*3f353a2eSMikhail Maltsevdeclare <4 x i16> @llvm.arm.neon.vcvtfp2bf.v4i16(<4 x float>)
31*3f353a2eSMikhail Maltsev
32*3f353a2eSMikhail Maltsevdefine <2 x i32> @test_vcvt_bf16_f32_softfp(<4 x float> %a) {
33*3f353a2eSMikhail Maltsev; CHECK-LABEL: test_vcvt_bf16_f32_softfp:
34*3f353a2eSMikhail Maltsev; CHECK:       @ %bb.0: @ %entry
35*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vmov d17, r2, r3
36*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vmov d16, r0, r1
37*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vcvt.bf16.f32 d16, q8
38*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vmov r0, r1, d16
39*3f353a2eSMikhail Maltsev; CHECK-NEXT:    bx lr
40*3f353a2eSMikhail Maltseventry:
41*3f353a2eSMikhail Maltsev  %vcvtfp2bf1.i.i = call <4 x i16> @llvm.arm.neon.vcvtfp2bf.v4i16(<4 x float> %a)
42*3f353a2eSMikhail Maltsev  %.cast = bitcast <4 x i16> %vcvtfp2bf1.i.i to <2 x i32>
43*3f353a2eSMikhail Maltsev  ret <2 x i32> %.cast
44*3f353a2eSMikhail Maltsev}
45*3f353a2eSMikhail Maltsev
46*3f353a2eSMikhail Maltsevdefine bfloat @test_vcvth_bf16_f32_softfp(float %a) #1 {
47*3f353a2eSMikhail Maltsev; CHECK-LABEL: test_vcvth_bf16_f32_softfp:
48*3f353a2eSMikhail Maltsev; CHECK:       @ %bb.0: @ %entry
49*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vmov s0, r0
50*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vcvtb.bf16.f32 s0, s0
51*3f353a2eSMikhail Maltsev; CHECK-NEXT:    vmov r0, s0
52*3f353a2eSMikhail Maltsev; CHECK-NEXT:    bx lr
53*3f353a2eSMikhail Maltseventry:
54*3f353a2eSMikhail Maltsev  %vcvtbfp2bf.i = call bfloat @llvm.arm.neon.vcvtbfp2bf(float %a) #3
55*3f353a2eSMikhail Maltsev  ret bfloat %vcvtbfp2bf.i
56*3f353a2eSMikhail Maltsev}
57