brintos

brintos / llvm-project-archived public Read only

0
0
Text · 72.1 KiB · 313d237 Raw
2432 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple thumbv8.1m.main-none-eabi | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP3; RUN: llc < %s -mtriple thumbv8.1m.main-none-eabihf -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-FP,CHECK-FPNO644; RUN: llc < %s -mtriple thumbv8.1m.main-none-eabihf -mattr=+fullfp16,+fp64 | FileCheck %s --check-prefixes=CHECK,CHECK-FP,CHECK-FP645 6define bfloat @test_fadd(bfloat %a, bfloat %b) {7; CHECK-NOFP-LABEL: test_fadd:8; CHECK-NOFP:       @ %bb.0:9; CHECK-NOFP-NEXT:    .save {r7, lr}10; CHECK-NOFP-NEXT:    push {r7, lr}11; CHECK-NOFP-NEXT:    lsls r0, r0, #1612; CHECK-NOFP-NEXT:    lsls r1, r1, #1613; CHECK-NOFP-NEXT:    bl __aeabi_fadd14; CHECK-NOFP-NEXT:    bl __truncsfbf215; CHECK-NOFP-NEXT:    pop {r7, pc}16;17; CHECK-FP-LABEL: test_fadd:18; CHECK-FP:       @ %bb.0:19; CHECK-FP-NEXT:    .save {r7, lr}20; CHECK-FP-NEXT:    push {r7, lr}21; CHECK-FP-NEXT:    vmov r0, s122; CHECK-FP-NEXT:    vmov r1, s023; CHECK-FP-NEXT:    lsls r0, r0, #1624; CHECK-FP-NEXT:    vmov s0, r025; CHECK-FP-NEXT:    lsls r0, r1, #1626; CHECK-FP-NEXT:    vmov s2, r027; CHECK-FP-NEXT:    vadd.f32 s0, s2, s028; CHECK-FP-NEXT:    bl __truncsfbf229; CHECK-FP-NEXT:    vmov.f16 r0, s030; CHECK-FP-NEXT:    vmov s0, r031; CHECK-FP-NEXT:    pop {r7, pc}32  %r = fadd bfloat %a, %b33  ret bfloat %r34}35 36define bfloat @test_fsub(bfloat %a, bfloat %b) {37;38; CHECK-NOFP-LABEL: test_fsub:39; CHECK-NOFP:       @ %bb.0:40; CHECK-NOFP-NEXT:    .save {r7, lr}41; CHECK-NOFP-NEXT:    push {r7, lr}42; CHECK-NOFP-NEXT:    lsls r0, r0, #1643; CHECK-NOFP-NEXT:    lsls r1, r1, #1644; CHECK-NOFP-NEXT:    bl __aeabi_fsub45; CHECK-NOFP-NEXT:    bl __truncsfbf246; CHECK-NOFP-NEXT:    pop {r7, pc}47;48; CHECK-FP-LABEL: test_fsub:49; CHECK-FP:       @ %bb.0:50; CHECK-FP-NEXT:    .save {r7, lr}51; CHECK-FP-NEXT:    push {r7, lr}52; CHECK-FP-NEXT:    vmov r0, s153; CHECK-FP-NEXT:    vmov r1, s054; CHECK-FP-NEXT:    lsls r0, r0, #1655; CHECK-FP-NEXT:    vmov s0, r056; CHECK-FP-NEXT:    lsls r0, r1, #1657; CHECK-FP-NEXT:    vmov s2, r058; CHECK-FP-NEXT:    vsub.f32 s0, s2, s059; CHECK-FP-NEXT:    bl __truncsfbf260; CHECK-FP-NEXT:    vmov.f16 r0, s061; CHECK-FP-NEXT:    vmov s0, r062; CHECK-FP-NEXT:    pop {r7, pc}63  %r = fsub bfloat %a, %b64  ret bfloat %r65}66 67define bfloat @test_fmul(bfloat %a, bfloat %b) {68;69; CHECK-NOFP-LABEL: test_fmul:70; CHECK-NOFP:       @ %bb.0:71; CHECK-NOFP-NEXT:    .save {r7, lr}72; CHECK-NOFP-NEXT:    push {r7, lr}73; CHECK-NOFP-NEXT:    lsls r0, r0, #1674; CHECK-NOFP-NEXT:    lsls r1, r1, #1675; CHECK-NOFP-NEXT:    bl __aeabi_fmul76; CHECK-NOFP-NEXT:    bl __truncsfbf277; CHECK-NOFP-NEXT:    pop {r7, pc}78;79; CHECK-FP-LABEL: test_fmul:80; CHECK-FP:       @ %bb.0:81; CHECK-FP-NEXT:    .save {r7, lr}82; CHECK-FP-NEXT:    push {r7, lr}83; CHECK-FP-NEXT:    vmov r0, s184; CHECK-FP-NEXT:    vmov r1, s085; CHECK-FP-NEXT:    lsls r0, r0, #1686; CHECK-FP-NEXT:    vmov s0, r087; CHECK-FP-NEXT:    lsls r0, r1, #1688; CHECK-FP-NEXT:    vmov s2, r089; CHECK-FP-NEXT:    vmul.f32 s0, s2, s090; CHECK-FP-NEXT:    bl __truncsfbf291; CHECK-FP-NEXT:    vmov.f16 r0, s092; CHECK-FP-NEXT:    vmov s0, r093; CHECK-FP-NEXT:    pop {r7, pc}94  %r = fmul bfloat %a, %b95  ret bfloat %r96}97 98define bfloat @test_fmadd(bfloat %a, bfloat %b, bfloat %c) {99;100; CHECK-NOFP-LABEL: test_fmadd:101; CHECK-NOFP:       @ %bb.0:102; CHECK-NOFP-NEXT:    .save {r4, lr}103; CHECK-NOFP-NEXT:    push {r4, lr}104; CHECK-NOFP-NEXT:    lsls r0, r0, #16105; CHECK-NOFP-NEXT:    lsls r1, r1, #16106; CHECK-NOFP-NEXT:    mov r4, r2107; CHECK-NOFP-NEXT:    bl __aeabi_fmul108; CHECK-NOFP-NEXT:    bl __truncsfbf2109; CHECK-NOFP-NEXT:    lsls r0, r0, #16110; CHECK-NOFP-NEXT:    lsls r1, r4, #16111; CHECK-NOFP-NEXT:    bl __aeabi_fadd112; CHECK-NOFP-NEXT:    bl __truncsfbf2113; CHECK-NOFP-NEXT:    pop {r4, pc}114;115; CHECK-FP-LABEL: test_fmadd:116; CHECK-FP:       @ %bb.0:117; CHECK-FP-NEXT:    .save {r7, lr}118; CHECK-FP-NEXT:    push {r7, lr}119; CHECK-FP-NEXT:    vmov r0, s0120; CHECK-FP-NEXT:    vmov r1, s1121; CHECK-FP-NEXT:    vmov r2, s2122; CHECK-FP-NEXT:    lsls r0, r0, #16123; CHECK-FP-NEXT:    lsls r1, r1, #16124; CHECK-FP-NEXT:    vmov s4, r0125; CHECK-FP-NEXT:    lsls r0, r2, #16126; CHECK-FP-NEXT:    vmov s2, r1127; CHECK-FP-NEXT:    vmov s0, r0128; CHECK-FP-NEXT:    vfma.f32 s0, s4, s2129; CHECK-FP-NEXT:    bl __truncsfbf2130; CHECK-FP-NEXT:    vmov.f16 r0, s0131; CHECK-FP-NEXT:    vmov s0, r0132; CHECK-FP-NEXT:    pop {r7, pc}133  %mul = fmul fast bfloat %a, %b134  %r = fadd fast bfloat %mul, %c135  ret bfloat %r136}137 138define bfloat @test_fdiv(bfloat %a, bfloat %b) {139;140; CHECK-NOFP-LABEL: test_fdiv:141; CHECK-NOFP:       @ %bb.0:142; CHECK-NOFP-NEXT:    .save {r7, lr}143; CHECK-NOFP-NEXT:    push {r7, lr}144; CHECK-NOFP-NEXT:    lsls r0, r0, #16145; CHECK-NOFP-NEXT:    lsls r1, r1, #16146; CHECK-NOFP-NEXT:    bl __aeabi_fdiv147; CHECK-NOFP-NEXT:    bl __truncsfbf2148; CHECK-NOFP-NEXT:    pop {r7, pc}149;150; CHECK-FP-LABEL: test_fdiv:151; CHECK-FP:       @ %bb.0:152; CHECK-FP-NEXT:    .save {r7, lr}153; CHECK-FP-NEXT:    push {r7, lr}154; CHECK-FP-NEXT:    vmov r0, s1155; CHECK-FP-NEXT:    vmov r1, s0156; CHECK-FP-NEXT:    lsls r0, r0, #16157; CHECK-FP-NEXT:    vmov s0, r0158; CHECK-FP-NEXT:    lsls r0, r1, #16159; CHECK-FP-NEXT:    vmov s2, r0160; CHECK-FP-NEXT:    vdiv.f32 s0, s2, s0161; CHECK-FP-NEXT:    bl __truncsfbf2162; CHECK-FP-NEXT:    vmov.f16 r0, s0163; CHECK-FP-NEXT:    vmov s0, r0164; CHECK-FP-NEXT:    pop {r7, pc}165  %r = fdiv bfloat %a, %b166  ret bfloat %r167}168 169define bfloat @test_frem(bfloat %a, bfloat %b) {170;171; CHECK-NOFP-LABEL: test_frem:172; CHECK-NOFP:       @ %bb.0:173; CHECK-NOFP-NEXT:    .save {r7, lr}174; CHECK-NOFP-NEXT:    push {r7, lr}175; CHECK-NOFP-NEXT:    lsls r0, r0, #16176; CHECK-NOFP-NEXT:    lsls r1, r1, #16177; CHECK-NOFP-NEXT:    bl fmodf178; CHECK-NOFP-NEXT:    bl __truncsfbf2179; CHECK-NOFP-NEXT:    pop {r7, pc}180;181; CHECK-FP-LABEL: test_frem:182; CHECK-FP:       @ %bb.0:183; CHECK-FP-NEXT:    .save {r7, lr}184; CHECK-FP-NEXT:    push {r7, lr}185; CHECK-FP-NEXT:    vmov r0, s1186; CHECK-FP-NEXT:    vmov r1, s0187; CHECK-FP-NEXT:    lsls r0, r0, #16188; CHECK-FP-NEXT:    lsls r1, r1, #16189; CHECK-FP-NEXT:    vmov s1, r0190; CHECK-FP-NEXT:    vmov s0, r1191; CHECK-FP-NEXT:    bl fmodf192; CHECK-FP-NEXT:    bl __truncsfbf2193; CHECK-FP-NEXT:    vmov.f16 r0, s0194; CHECK-FP-NEXT:    vmov s0, r0195; CHECK-FP-NEXT:    pop {r7, pc}196  %r = frem bfloat %a, %b197  ret bfloat %r198}199 200define void @test_store(bfloat %a, ptr %b) {201; CHECK-NOFP-LABEL: test_store:202; CHECK-NOFP:       @ %bb.0:203; CHECK-NOFP-NEXT:    strh r0, [r1]204; CHECK-NOFP-NEXT:    bx lr205;206; CHECK-FP-LABEL: test_store:207; CHECK-FP:       @ %bb.0:208; CHECK-FP-NEXT:    vmov r1, s0209; CHECK-FP-NEXT:    strh r1, [r0]210; CHECK-FP-NEXT:    bx lr211  store bfloat %a, ptr %b212  ret void213}214 215define void @test_truncstore32(float %a, ptr %b) {216; CHECK-NOFP-LABEL: test_truncstore32:217; CHECK-NOFP:       @ %bb.0:218; CHECK-NOFP-NEXT:    .save {r4, lr}219; CHECK-NOFP-NEXT:    push {r4, lr}220; CHECK-NOFP-NEXT:    mov r4, r1221; CHECK-NOFP-NEXT:    bl __truncsfbf2222; CHECK-NOFP-NEXT:    strh r0, [r4]223; CHECK-NOFP-NEXT:    pop {r4, pc}224;225; CHECK-FP-LABEL: test_truncstore32:226; CHECK-FP:       @ %bb.0:227; CHECK-FP-NEXT:    .save {r4, lr}228; CHECK-FP-NEXT:    push {r4, lr}229; CHECK-FP-NEXT:    mov r4, r0230; CHECK-FP-NEXT:    bl __truncsfbf2231; CHECK-FP-NEXT:    vmov r0, s0232; CHECK-FP-NEXT:    strh r0, [r4]233; CHECK-FP-NEXT:    pop {r4, pc}234  %r = fptrunc float %a to bfloat235  store bfloat %r, ptr %b236  ret void237}238 239define void @test_truncstore64(double %a, ptr %b) {240; CHECK-NOFP-LABEL: test_truncstore64:241; CHECK-NOFP:       @ %bb.0:242; CHECK-NOFP-NEXT:    .save {r4, lr}243; CHECK-NOFP-NEXT:    push {r4, lr}244; CHECK-NOFP-NEXT:    mov r4, r2245; CHECK-NOFP-NEXT:    bl __truncdfbf2246; CHECK-NOFP-NEXT:    strh r0, [r4]247; CHECK-NOFP-NEXT:    pop {r4, pc}248;249; CHECK-FP-LABEL: test_truncstore64:250; CHECK-FP:       @ %bb.0:251; CHECK-FP-NEXT:    .save {r4, lr}252; CHECK-FP-NEXT:    push {r4, lr}253; CHECK-FP-NEXT:    mov r4, r0254; CHECK-FP-NEXT:    bl __truncdfbf2255; CHECK-FP-NEXT:    vmov r0, s0256; CHECK-FP-NEXT:    strh r0, [r4]257; CHECK-FP-NEXT:    pop {r4, pc}258  %r = fptrunc double %a to bfloat259  store bfloat %r, ptr %b260  ret void261}262 263define bfloat @test_load(ptr %a) {264; CHECK-NOFP-LABEL: test_load:265; CHECK-NOFP:       @ %bb.0:266; CHECK-NOFP-NEXT:    ldrh r0, [r0]267; CHECK-NOFP-NEXT:    bx lr268;269; CHECK-FP-LABEL: test_load:270; CHECK-FP:       @ %bb.0:271; CHECK-FP-NEXT:    ldrh r0, [r0]272; CHECK-FP-NEXT:    vmov s0, r0273; CHECK-FP-NEXT:    bx lr274  %r = load bfloat, ptr %a275  ret bfloat %r276}277 278define float @test_loadext32(ptr %a) {279; CHECK-NOFP-LABEL: test_loadext32:280; CHECK-NOFP:       @ %bb.0:281; CHECK-NOFP-NEXT:    ldrh r0, [r0]282; CHECK-NOFP-NEXT:    lsls r0, r0, #16283; CHECK-NOFP-NEXT:    bx lr284;285; CHECK-FP-LABEL: test_loadext32:286; CHECK-FP:       @ %bb.0:287; CHECK-FP-NEXT:    ldrh r0, [r0]288; CHECK-FP-NEXT:    lsls r0, r0, #16289; CHECK-FP-NEXT:    vmov s0, r0290; CHECK-FP-NEXT:    bx lr291  %r = load bfloat, ptr %a292  %d = fpext bfloat %r to float293  ret float %d294}295 296define double @test_loadext64(ptr %a) {297; CHECK-NOFP-LABEL: test_loadext64:298; CHECK-NOFP:       @ %bb.0:299; CHECK-NOFP-NEXT:    .save {r7, lr}300; CHECK-NOFP-NEXT:    push {r7, lr}301; CHECK-NOFP-NEXT:    ldrh r0, [r0]302; CHECK-NOFP-NEXT:    lsls r0, r0, #16303; CHECK-NOFP-NEXT:    bl __aeabi_f2d304; CHECK-NOFP-NEXT:    pop {r7, pc}305;306; CHECK-FPNO64-LABEL: test_loadext64:307; CHECK-FPNO64:       @ %bb.0:308; CHECK-FPNO64-NEXT:    .save {r7, lr}309; CHECK-FPNO64-NEXT:    push {r7, lr}310; CHECK-FPNO64-NEXT:    ldrh r0, [r0]311; CHECK-FPNO64-NEXT:    lsls r0, r0, #16312; CHECK-FPNO64-NEXT:    bl __aeabi_f2d313; CHECK-FPNO64-NEXT:    vmov d0, r0, r1314; CHECK-FPNO64-NEXT:    pop {r7, pc}315;316; CHECK-FP64-LABEL: test_loadext64:317; CHECK-FP64:       @ %bb.0:318; CHECK-FP64-NEXT:    ldrh r0, [r0]319; CHECK-FP64-NEXT:    lsls r0, r0, #16320; CHECK-FP64-NEXT:    vmov s0, r0321; CHECK-FP64-NEXT:    vcvt.f64.f32 d0, s0322; CHECK-FP64-NEXT:    bx lr323  %r = load bfloat, ptr %a324  %d = fpext bfloat %r to double325  ret double %d326}327 328declare bfloat @test_callee(bfloat %a, bfloat %b)329 330define bfloat @test_call(bfloat %a, bfloat %b) {331; CHECK-LABEL: test_call:332; CHECK:       @ %bb.0:333; CHECK-NEXT:    .save {r7, lr}334; CHECK-NEXT:    push {r7, lr}335; CHECK-NEXT:    bl test_callee336; CHECK-NEXT:    pop {r7, pc}337  %r = call bfloat @test_callee(bfloat %a, bfloat %b)338  ret bfloat %r339}340 341define void @test_call_store(bfloat %a, bfloat %b, ptr %p) {342; CHECK-NOFP-LABEL: test_call_store:343; CHECK-NOFP:       @ %bb.0:344; CHECK-NOFP-NEXT:    .save {r4, lr}345; CHECK-NOFP-NEXT:    push {r4, lr}346; CHECK-NOFP-NEXT:    mov r4, r2347; CHECK-NOFP-NEXT:    bl test_callee348; CHECK-NOFP-NEXT:    strh r0, [r4]349; CHECK-NOFP-NEXT:    pop {r4, pc}350;351; CHECK-FP-LABEL: test_call_store:352; CHECK-FP:       @ %bb.0:353; CHECK-FP-NEXT:    .save {r4, lr}354; CHECK-FP-NEXT:    push {r4, lr}355; CHECK-FP-NEXT:    mov r4, r0356; CHECK-FP-NEXT:    bl test_callee357; CHECK-FP-NEXT:    vmov r0, s0358; CHECK-FP-NEXT:    strh r0, [r4]359; CHECK-FP-NEXT:    pop {r4, pc}360  %r = call bfloat @test_callee(bfloat %a, bfloat %b)361  store bfloat %r, ptr %p362  ret void363}364 365define bfloat @test_call_flipped(bfloat %a, bfloat %b) {366; CHECK-NOFP-LABEL: test_call_flipped:367; CHECK-NOFP:       @ %bb.0:368; CHECK-NOFP-NEXT:    .save {r7, lr}369; CHECK-NOFP-NEXT:    push {r7, lr}370; CHECK-NOFP-NEXT:    mov r2, r0371; CHECK-NOFP-NEXT:    mov r0, r1372; CHECK-NOFP-NEXT:    mov r1, r2373; CHECK-NOFP-NEXT:    bl test_callee374; CHECK-NOFP-NEXT:    pop {r7, pc}375;376; CHECK-FP-LABEL: test_call_flipped:377; CHECK-FP:       @ %bb.0:378; CHECK-FP-NEXT:    .save {r7, lr}379; CHECK-FP-NEXT:    push {r7, lr}380; CHECK-FP-NEXT:    vmov.f32 s2, s0381; CHECK-FP-NEXT:    vmov.f32 s0, s1382; CHECK-FP-NEXT:    vmov.f32 s1, s2383; CHECK-FP-NEXT:    bl test_callee384; CHECK-FP-NEXT:    pop {r7, pc}385  %r = call bfloat @test_callee(bfloat %b, bfloat %a)386  ret bfloat %r387}388 389define bfloat @test_tailcall_flipped(bfloat %a, bfloat %b) {390; CHECK-NOFP-LABEL: test_tailcall_flipped:391; CHECK-NOFP:       @ %bb.0:392; CHECK-NOFP-NEXT:    mov r2, r0393; CHECK-NOFP-NEXT:    mov r0, r1394; CHECK-NOFP-NEXT:    mov r1, r2395; CHECK-NOFP-NEXT:    b test_callee396;397; CHECK-FP-LABEL: test_tailcall_flipped:398; CHECK-FP:       @ %bb.0:399; CHECK-FP-NEXT:    vmov.f32 s2, s0400; CHECK-FP-NEXT:    vmov.f32 s0, s1401; CHECK-FP-NEXT:    vmov.f32 s1, s2402; CHECK-FP-NEXT:    b test_callee403  %r = tail call bfloat @test_callee(bfloat %b, bfloat %a)404  ret bfloat %r405}406 407define bfloat @test_select(bfloat %a, bfloat %b, i1 zeroext %c) {408; CHECK-NOFP-LABEL: test_select:409; CHECK-NOFP:       @ %bb.0:410; CHECK-NOFP-NEXT:    cmp r2, #0411; CHECK-NOFP-NEXT:    csel r0, r0, r1, ne412; CHECK-NOFP-NEXT:    bx lr413;414; CHECK-FP-LABEL: test_select:415; CHECK-FP:       @ %bb.0:416; CHECK-FP-NEXT:    vmov r1, s1417; CHECK-FP-NEXT:    cmp r0, #0418; CHECK-FP-NEXT:    it ne419; CHECK-FP-NEXT:    vmovne r1, s0420; CHECK-FP-NEXT:    vmov.f16 s0, r1421; CHECK-FP-NEXT:    vmov.f16 r0, s0422; CHECK-FP-NEXT:    vmov s0, r0423; CHECK-FP-NEXT:    bx lr424  %r = select i1 %c, bfloat %a, bfloat %b425  ret bfloat %r426}427 428define bfloat @test_select_cc(bfloat %a, bfloat %b, bfloat %c, bfloat %d) {429; CHECK-NOFP-LABEL: test_select_cc:430; CHECK-NOFP:       @ %bb.0:431; CHECK-NOFP-NEXT:    .save {r4, r5, r7, lr}432; CHECK-NOFP-NEXT:    push {r4, r5, r7, lr}433; CHECK-NOFP-NEXT:    mov r4, r1434; CHECK-NOFP-NEXT:    mov r5, r0435; CHECK-NOFP-NEXT:    lsls r0, r2, #16436; CHECK-NOFP-NEXT:    lsls r1, r3, #16437; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq438; CHECK-NOFP-NEXT:    cmp r0, #0439; CHECK-NOFP-NEXT:    csel r0, r5, r4, eq440; CHECK-NOFP-NEXT:    pop {r4, r5, r7, pc}441;442; CHECK-FP-LABEL: test_select_cc:443; CHECK-FP:       @ %bb.0:444; CHECK-FP-NEXT:    vmov r0, s3445; CHECK-FP-NEXT:    vmov r1, s2446; CHECK-FP-NEXT:    lsls r0, r0, #16447; CHECK-FP-NEXT:    vmov s2, r0448; CHECK-FP-NEXT:    lsls r0, r1, #16449; CHECK-FP-NEXT:    vmov s4, r0450; CHECK-FP-NEXT:    vmov r0, s1451; CHECK-FP-NEXT:    vcmp.f32 s4, s2452; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr453; CHECK-FP-NEXT:    it ne454; CHECK-FP-NEXT:    vmovne r0, s0455; CHECK-FP-NEXT:    vmov.f16 s0, r0456; CHECK-FP-NEXT:    vmov.f16 r0, s0457; CHECK-FP-NEXT:    vmov s0, r0458; CHECK-FP-NEXT:    bx lr459  %cc = fcmp une bfloat %c, %d460  %r = select i1 %cc, bfloat %a, bfloat %b461  ret bfloat %r462}463 464define float @test_select_cc_f32_f16(float %a, float %b, bfloat %c, bfloat %d) {465; CHECK-NOFP-LABEL: test_select_cc_f32_f16:466; CHECK-NOFP:       @ %bb.0:467; CHECK-NOFP-NEXT:    .save {r4, r5, r7, lr}468; CHECK-NOFP-NEXT:    push {r4, r5, r7, lr}469; CHECK-NOFP-NEXT:    mov r4, r1470; CHECK-NOFP-NEXT:    mov r5, r0471; CHECK-NOFP-NEXT:    lsls r0, r2, #16472; CHECK-NOFP-NEXT:    lsls r1, r3, #16473; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq474; CHECK-NOFP-NEXT:    cmp r0, #0475; CHECK-NOFP-NEXT:    csel r0, r5, r4, eq476; CHECK-NOFP-NEXT:    pop {r4, r5, r7, pc}477;478; CHECK-FP-LABEL: test_select_cc_f32_f16:479; CHECK-FP:       @ %bb.0:480; CHECK-FP-NEXT:    vmov r0, s3481; CHECK-FP-NEXT:    vmov r1, s2482; CHECK-FP-NEXT:    lsls r0, r0, #16483; CHECK-FP-NEXT:    vmov s2, r0484; CHECK-FP-NEXT:    lsls r0, r1, #16485; CHECK-FP-NEXT:    vmov s4, r0486; CHECK-FP-NEXT:    vcmp.f32 s4, s2487; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr488; CHECK-FP-NEXT:    vseleq.f32 s0, s1, s0489; CHECK-FP-NEXT:    bx lr490  %cc = fcmp une bfloat %c, %d491  %r = select i1 %cc, float %a, float %b492  ret float %r493}494 495define bfloat @test_select_cc_f16_f32(bfloat %a, bfloat %b, float %c, float %d) {496; CHECK-NOFP-LABEL: test_select_cc_f16_f32:497; CHECK-NOFP:       @ %bb.0:498; CHECK-NOFP-NEXT:    .save {r4, r5, r7, lr}499; CHECK-NOFP-NEXT:    push {r4, r5, r7, lr}500; CHECK-NOFP-NEXT:    mov r4, r1501; CHECK-NOFP-NEXT:    mov r5, r0502; CHECK-NOFP-NEXT:    mov r0, r2503; CHECK-NOFP-NEXT:    mov r1, r3504; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq505; CHECK-NOFP-NEXT:    cmp r0, #0506; CHECK-NOFP-NEXT:    csel r0, r5, r4, eq507; CHECK-NOFP-NEXT:    pop {r4, r5, r7, pc}508;509; CHECK-FP-LABEL: test_select_cc_f16_f32:510; CHECK-FP:       @ %bb.0:511; CHECK-FP-NEXT:    vcmp.f32 s2, s3512; CHECK-FP-NEXT:    vmov r0, s1513; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr514; CHECK-FP-NEXT:    it ne515; CHECK-FP-NEXT:    vmovne r0, s0516; CHECK-FP-NEXT:    vmov.f16 s0, r0517; CHECK-FP-NEXT:    vmov.f16 r0, s0518; CHECK-FP-NEXT:    vmov s0, r0519; CHECK-FP-NEXT:    bx lr520  %cc = fcmp une float %c, %d521  %r = select i1 %cc, bfloat %a, bfloat %b522  ret bfloat %r523}524 525define i1 @test_fcmp_une(bfloat %a, bfloat %b) {526; CHECK-NOFP-LABEL: test_fcmp_une:527; CHECK-NOFP:       @ %bb.0:528; CHECK-NOFP-NEXT:    .save {r7, lr}529; CHECK-NOFP-NEXT:    push {r7, lr}530; CHECK-NOFP-NEXT:    lsls r0, r0, #16531; CHECK-NOFP-NEXT:    lsls r1, r1, #16532; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq533; CHECK-NOFP-NEXT:    cmp r0, #0534; CHECK-NOFP-NEXT:    cset r0, eq535; CHECK-NOFP-NEXT:    pop {r7, pc}536;537; CHECK-FP-LABEL: test_fcmp_une:538; CHECK-FP:       @ %bb.0:539; CHECK-FP-NEXT:    vmov r0, s1540; CHECK-FP-NEXT:    vmov r1, s0541; CHECK-FP-NEXT:    lsls r0, r0, #16542; CHECK-FP-NEXT:    vmov s0, r0543; CHECK-FP-NEXT:    lsls r0, r1, #16544; CHECK-FP-NEXT:    vmov s2, r0545; CHECK-FP-NEXT:    vcmp.f32 s2, s0546; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr547; CHECK-FP-NEXT:    cset r0, ne548; CHECK-FP-NEXT:    bx lr549  %r = fcmp une bfloat %a, %b550  ret i1 %r551}552 553define i1 @test_fcmp_ueq(bfloat %a, bfloat %b) {554; CHECK-NOFP-LABEL: test_fcmp_ueq:555; CHECK-NOFP:       @ %bb.0:556; CHECK-NOFP-NEXT:    .save {r4, r5, r6, lr}557; CHECK-NOFP-NEXT:    push {r4, r5, r6, lr}558; CHECK-NOFP-NEXT:    lsls r4, r0, #16559; CHECK-NOFP-NEXT:    lsls r5, r1, #16560; CHECK-NOFP-NEXT:    mov r0, r4561; CHECK-NOFP-NEXT:    mov r1, r5562; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq563; CHECK-NOFP-NEXT:    mov r6, r0564; CHECK-NOFP-NEXT:    mov r0, r4565; CHECK-NOFP-NEXT:    mov r1, r5566; CHECK-NOFP-NEXT:    bl __aeabi_fcmpun567; CHECK-NOFP-NEXT:    orrs r0, r6568; CHECK-NOFP-NEXT:    cset r0, ne569; CHECK-NOFP-NEXT:    pop {r4, r5, r6, pc}570;571; CHECK-FP-LABEL: test_fcmp_ueq:572; CHECK-FP:       @ %bb.0:573; CHECK-FP-NEXT:    vmov r0, s1574; CHECK-FP-NEXT:    vmov r1, s0575; CHECK-FP-NEXT:    lsls r0, r0, #16576; CHECK-FP-NEXT:    vmov s0, r0577; CHECK-FP-NEXT:    lsls r0, r1, #16578; CHECK-FP-NEXT:    vmov s2, r0579; CHECK-FP-NEXT:    vcmp.f32 s2, s0580; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr581; CHECK-FP-NEXT:    cset r0, eq582; CHECK-FP-NEXT:    csinc r0, r0, zr, vc583; CHECK-FP-NEXT:    bx lr584  %r = fcmp ueq bfloat %a, %b585  ret i1 %r586}587 588define i1 @test_fcmp_ugt(bfloat %a, bfloat %b) {589; CHECK-NOFP-LABEL: test_fcmp_ugt:590; CHECK-NOFP:       @ %bb.0:591; CHECK-NOFP-NEXT:    .save {r7, lr}592; CHECK-NOFP-NEXT:    push {r7, lr}593; CHECK-NOFP-NEXT:    lsls r0, r0, #16594; CHECK-NOFP-NEXT:    lsls r1, r1, #16595; CHECK-NOFP-NEXT:    bl __aeabi_fcmple596; CHECK-NOFP-NEXT:    cmp r0, #0597; CHECK-NOFP-NEXT:    cset r0, eq598; CHECK-NOFP-NEXT:    pop {r7, pc}599;600; CHECK-FP-LABEL: test_fcmp_ugt:601; CHECK-FP:       @ %bb.0:602; CHECK-FP-NEXT:    vmov r0, s1603; CHECK-FP-NEXT:    vmov r1, s0604; CHECK-FP-NEXT:    lsls r0, r0, #16605; CHECK-FP-NEXT:    vmov s0, r0606; CHECK-FP-NEXT:    lsls r0, r1, #16607; CHECK-FP-NEXT:    vmov s2, r0608; CHECK-FP-NEXT:    vcmp.f32 s2, s0609; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr610; CHECK-FP-NEXT:    cset r0, hi611; CHECK-FP-NEXT:    bx lr612  %r = fcmp ugt bfloat %a, %b613  ret i1 %r614}615 616define i1 @test_fcmp_uge(bfloat %a, bfloat %b) {617; CHECK-NOFP-LABEL: test_fcmp_uge:618; CHECK-NOFP:       @ %bb.0:619; CHECK-NOFP-NEXT:    .save {r7, lr}620; CHECK-NOFP-NEXT:    push {r7, lr}621; CHECK-NOFP-NEXT:    lsls r0, r0, #16622; CHECK-NOFP-NEXT:    lsls r1, r1, #16623; CHECK-NOFP-NEXT:    bl __aeabi_fcmplt624; CHECK-NOFP-NEXT:    cmp r0, #0625; CHECK-NOFP-NEXT:    cset r0, eq626; CHECK-NOFP-NEXT:    pop {r7, pc}627;628; CHECK-FP-LABEL: test_fcmp_uge:629; CHECK-FP:       @ %bb.0:630; CHECK-FP-NEXT:    vmov r0, s1631; CHECK-FP-NEXT:    vmov r1, s0632; CHECK-FP-NEXT:    lsls r0, r0, #16633; CHECK-FP-NEXT:    vmov s0, r0634; CHECK-FP-NEXT:    lsls r0, r1, #16635; CHECK-FP-NEXT:    vmov s2, r0636; CHECK-FP-NEXT:    vcmp.f32 s2, s0637; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr638; CHECK-FP-NEXT:    cset r0, pl639; CHECK-FP-NEXT:    bx lr640  %r = fcmp uge bfloat %a, %b641  ret i1 %r642}643 644define i1 @test_fcmp_ult(bfloat %a, bfloat %b) {645; CHECK-NOFP-LABEL: test_fcmp_ult:646; CHECK-NOFP:       @ %bb.0:647; CHECK-NOFP-NEXT:    .save {r7, lr}648; CHECK-NOFP-NEXT:    push {r7, lr}649; CHECK-NOFP-NEXT:    lsls r0, r0, #16650; CHECK-NOFP-NEXT:    lsls r1, r1, #16651; CHECK-NOFP-NEXT:    bl __aeabi_fcmpge652; CHECK-NOFP-NEXT:    cmp r0, #0653; CHECK-NOFP-NEXT:    cset r0, eq654; CHECK-NOFP-NEXT:    pop {r7, pc}655;656; CHECK-FP-LABEL: test_fcmp_ult:657; CHECK-FP:       @ %bb.0:658; CHECK-FP-NEXT:    vmov r0, s1659; CHECK-FP-NEXT:    vmov r1, s0660; CHECK-FP-NEXT:    lsls r0, r0, #16661; CHECK-FP-NEXT:    vmov s0, r0662; CHECK-FP-NEXT:    lsls r0, r1, #16663; CHECK-FP-NEXT:    vmov s2, r0664; CHECK-FP-NEXT:    vcmp.f32 s2, s0665; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr666; CHECK-FP-NEXT:    cset r0, lt667; CHECK-FP-NEXT:    bx lr668  %r = fcmp ult bfloat %a, %b669  ret i1 %r670}671 672define i1 @test_fcmp_ule(bfloat %a, bfloat %b) {673; CHECK-NOFP-LABEL: test_fcmp_ule:674; CHECK-NOFP:       @ %bb.0:675; CHECK-NOFP-NEXT:    .save {r7, lr}676; CHECK-NOFP-NEXT:    push {r7, lr}677; CHECK-NOFP-NEXT:    lsls r0, r0, #16678; CHECK-NOFP-NEXT:    lsls r1, r1, #16679; CHECK-NOFP-NEXT:    bl __aeabi_fcmpgt680; CHECK-NOFP-NEXT:    cmp r0, #0681; CHECK-NOFP-NEXT:    cset r0, eq682; CHECK-NOFP-NEXT:    pop {r7, pc}683;684; CHECK-FP-LABEL: test_fcmp_ule:685; CHECK-FP:       @ %bb.0:686; CHECK-FP-NEXT:    vmov r0, s1687; CHECK-FP-NEXT:    vmov r1, s0688; CHECK-FP-NEXT:    lsls r0, r0, #16689; CHECK-FP-NEXT:    vmov s0, r0690; CHECK-FP-NEXT:    lsls r0, r1, #16691; CHECK-FP-NEXT:    vmov s2, r0692; CHECK-FP-NEXT:    vcmp.f32 s2, s0693; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr694; CHECK-FP-NEXT:    cset r0, le695; CHECK-FP-NEXT:    bx lr696  %r = fcmp ule bfloat %a, %b697  ret i1 %r698}699 700define i1 @test_fcmp_uno(bfloat %a, bfloat %b) {701; CHECK-NOFP-LABEL: test_fcmp_uno:702; CHECK-NOFP:       @ %bb.0:703; CHECK-NOFP-NEXT:    .save {r7, lr}704; CHECK-NOFP-NEXT:    push {r7, lr}705; CHECK-NOFP-NEXT:    lsls r0, r0, #16706; CHECK-NOFP-NEXT:    lsls r1, r1, #16707; CHECK-NOFP-NEXT:    bl __aeabi_fcmpun708; CHECK-NOFP-NEXT:    cmp r0, #0709; CHECK-NOFP-NEXT:    cset r0, ne710; CHECK-NOFP-NEXT:    pop {r7, pc}711;712; CHECK-FP-LABEL: test_fcmp_uno:713; CHECK-FP:       @ %bb.0:714; CHECK-FP-NEXT:    vmov r0, s1715; CHECK-FP-NEXT:    vmov r1, s0716; CHECK-FP-NEXT:    lsls r0, r0, #16717; CHECK-FP-NEXT:    vmov s0, r0718; CHECK-FP-NEXT:    lsls r0, r1, #16719; CHECK-FP-NEXT:    vmov s2, r0720; CHECK-FP-NEXT:    vcmp.f32 s2, s0721; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr722; CHECK-FP-NEXT:    cset r0, vs723; CHECK-FP-NEXT:    bx lr724  %r = fcmp uno bfloat %a, %b725  ret i1 %r726}727 728define i1 @test_fcmp_one(bfloat %a, bfloat %b) {729; CHECK-NOFP-LABEL: test_fcmp_one:730; CHECK-NOFP:       @ %bb.0:731; CHECK-NOFP-NEXT:    .save {r4, r5, r6, lr}732; CHECK-NOFP-NEXT:    push {r4, r5, r6, lr}733; CHECK-NOFP-NEXT:    lsls r4, r0, #16734; CHECK-NOFP-NEXT:    lsls r5, r1, #16735; CHECK-NOFP-NEXT:    mov r0, r4736; CHECK-NOFP-NEXT:    mov r1, r5737; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq738; CHECK-NOFP-NEXT:    mov r6, r0739; CHECK-NOFP-NEXT:    mov r0, r4740; CHECK-NOFP-NEXT:    mov r1, r5741; CHECK-NOFP-NEXT:    bl __aeabi_fcmpun742; CHECK-NOFP-NEXT:    orrs r0, r6743; CHECK-NOFP-NEXT:    cset r0, eq744; CHECK-NOFP-NEXT:    pop {r4, r5, r6, pc}745;746; CHECK-FP-LABEL: test_fcmp_one:747; CHECK-FP:       @ %bb.0:748; CHECK-FP-NEXT:    vmov r0, s1749; CHECK-FP-NEXT:    vmov r1, s0750; CHECK-FP-NEXT:    lsls r0, r0, #16751; CHECK-FP-NEXT:    vmov s0, r0752; CHECK-FP-NEXT:    lsls r0, r1, #16753; CHECK-FP-NEXT:    vmov s2, r0754; CHECK-FP-NEXT:    vcmp.f32 s2, s0755; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr756; CHECK-FP-NEXT:    cset r0, mi757; CHECK-FP-NEXT:    csinc r0, r0, zr, le758; CHECK-FP-NEXT:    bx lr759  %r = fcmp one bfloat %a, %b760  ret i1 %r761}762 763define i1 @test_fcmp_oeq(bfloat %a, bfloat %b) {764; CHECK-NOFP-LABEL: test_fcmp_oeq:765; CHECK-NOFP:       @ %bb.0:766; CHECK-NOFP-NEXT:    .save {r7, lr}767; CHECK-NOFP-NEXT:    push {r7, lr}768; CHECK-NOFP-NEXT:    lsls r0, r0, #16769; CHECK-NOFP-NEXT:    lsls r1, r1, #16770; CHECK-NOFP-NEXT:    bl __aeabi_fcmpeq771; CHECK-NOFP-NEXT:    cmp r0, #0772; CHECK-NOFP-NEXT:    cset r0, ne773; CHECK-NOFP-NEXT:    pop {r7, pc}774;775; CHECK-FP-LABEL: test_fcmp_oeq:776; CHECK-FP:       @ %bb.0:777; CHECK-FP-NEXT:    vmov r0, s1778; CHECK-FP-NEXT:    vmov r1, s0779; CHECK-FP-NEXT:    lsls r0, r0, #16780; CHECK-FP-NEXT:    vmov s0, r0781; CHECK-FP-NEXT:    lsls r0, r1, #16782; CHECK-FP-NEXT:    vmov s2, r0783; CHECK-FP-NEXT:    vcmp.f32 s2, s0784; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr785; CHECK-FP-NEXT:    cset r0, eq786; CHECK-FP-NEXT:    bx lr787  %r = fcmp oeq bfloat %a, %b788  ret i1 %r789}790 791define i1 @test_fcmp_ogt(bfloat %a, bfloat %b) {792; CHECK-NOFP-LABEL: test_fcmp_ogt:793; CHECK-NOFP:       @ %bb.0:794; CHECK-NOFP-NEXT:    .save {r7, lr}795; CHECK-NOFP-NEXT:    push {r7, lr}796; CHECK-NOFP-NEXT:    lsls r0, r0, #16797; CHECK-NOFP-NEXT:    lsls r1, r1, #16798; CHECK-NOFP-NEXT:    bl __aeabi_fcmpgt799; CHECK-NOFP-NEXT:    cmp r0, #0800; CHECK-NOFP-NEXT:    cset r0, ne801; CHECK-NOFP-NEXT:    pop {r7, pc}802;803; CHECK-FP-LABEL: test_fcmp_ogt:804; CHECK-FP:       @ %bb.0:805; CHECK-FP-NEXT:    vmov r0, s1806; CHECK-FP-NEXT:    vmov r1, s0807; CHECK-FP-NEXT:    lsls r0, r0, #16808; CHECK-FP-NEXT:    vmov s0, r0809; CHECK-FP-NEXT:    lsls r0, r1, #16810; CHECK-FP-NEXT:    vmov s2, r0811; CHECK-FP-NEXT:    vcmp.f32 s2, s0812; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr813; CHECK-FP-NEXT:    cset r0, gt814; CHECK-FP-NEXT:    bx lr815  %r = fcmp ogt bfloat %a, %b816  ret i1 %r817}818 819define i1 @test_fcmp_oge(bfloat %a, bfloat %b) {820; CHECK-NOFP-LABEL: test_fcmp_oge:821; CHECK-NOFP:       @ %bb.0:822; CHECK-NOFP-NEXT:    .save {r7, lr}823; CHECK-NOFP-NEXT:    push {r7, lr}824; CHECK-NOFP-NEXT:    lsls r0, r0, #16825; CHECK-NOFP-NEXT:    lsls r1, r1, #16826; CHECK-NOFP-NEXT:    bl __aeabi_fcmpge827; CHECK-NOFP-NEXT:    cmp r0, #0828; CHECK-NOFP-NEXT:    cset r0, ne829; CHECK-NOFP-NEXT:    pop {r7, pc}830;831; CHECK-FP-LABEL: test_fcmp_oge:832; CHECK-FP:       @ %bb.0:833; CHECK-FP-NEXT:    vmov r0, s1834; CHECK-FP-NEXT:    vmov r1, s0835; CHECK-FP-NEXT:    lsls r0, r0, #16836; CHECK-FP-NEXT:    vmov s0, r0837; CHECK-FP-NEXT:    lsls r0, r1, #16838; CHECK-FP-NEXT:    vmov s2, r0839; CHECK-FP-NEXT:    vcmp.f32 s2, s0840; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr841; CHECK-FP-NEXT:    cset r0, ge842; CHECK-FP-NEXT:    bx lr843  %r = fcmp oge bfloat %a, %b844  ret i1 %r845}846 847define i1 @test_fcmp_olt(bfloat %a, bfloat %b) {848; CHECK-NOFP-LABEL: test_fcmp_olt:849; CHECK-NOFP:       @ %bb.0:850; CHECK-NOFP-NEXT:    .save {r7, lr}851; CHECK-NOFP-NEXT:    push {r7, lr}852; CHECK-NOFP-NEXT:    lsls r0, r0, #16853; CHECK-NOFP-NEXT:    lsls r1, r1, #16854; CHECK-NOFP-NEXT:    bl __aeabi_fcmplt855; CHECK-NOFP-NEXT:    cmp r0, #0856; CHECK-NOFP-NEXT:    cset r0, ne857; CHECK-NOFP-NEXT:    pop {r7, pc}858;859; CHECK-FP-LABEL: test_fcmp_olt:860; CHECK-FP:       @ %bb.0:861; CHECK-FP-NEXT:    vmov r0, s1862; CHECK-FP-NEXT:    vmov r1, s0863; CHECK-FP-NEXT:    lsls r0, r0, #16864; CHECK-FP-NEXT:    vmov s0, r0865; CHECK-FP-NEXT:    lsls r0, r1, #16866; CHECK-FP-NEXT:    vmov s2, r0867; CHECK-FP-NEXT:    vcmp.f32 s2, s0868; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr869; CHECK-FP-NEXT:    cset r0, mi870; CHECK-FP-NEXT:    bx lr871  %r = fcmp olt bfloat %a, %b872  ret i1 %r873}874 875define i1 @test_fcmp_ole(bfloat %a, bfloat %b) {876; CHECK-NOFP-LABEL: test_fcmp_ole:877; CHECK-NOFP:       @ %bb.0:878; CHECK-NOFP-NEXT:    .save {r7, lr}879; CHECK-NOFP-NEXT:    push {r7, lr}880; CHECK-NOFP-NEXT:    lsls r0, r0, #16881; CHECK-NOFP-NEXT:    lsls r1, r1, #16882; CHECK-NOFP-NEXT:    bl __aeabi_fcmple883; CHECK-NOFP-NEXT:    cmp r0, #0884; CHECK-NOFP-NEXT:    cset r0, ne885; CHECK-NOFP-NEXT:    pop {r7, pc}886;887; CHECK-FP-LABEL: test_fcmp_ole:888; CHECK-FP:       @ %bb.0:889; CHECK-FP-NEXT:    vmov r0, s1890; CHECK-FP-NEXT:    vmov r1, s0891; CHECK-FP-NEXT:    lsls r0, r0, #16892; CHECK-FP-NEXT:    vmov s0, r0893; CHECK-FP-NEXT:    lsls r0, r1, #16894; CHECK-FP-NEXT:    vmov s2, r0895; CHECK-FP-NEXT:    vcmp.f32 s2, s0896; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr897; CHECK-FP-NEXT:    cset r0, ls898; CHECK-FP-NEXT:    bx lr899  %r = fcmp ole bfloat %a, %b900  ret i1 %r901}902 903define i1 @test_fcmp_ord(bfloat %a, bfloat %b) {904; CHECK-NOFP-LABEL: test_fcmp_ord:905; CHECK-NOFP:       @ %bb.0:906; CHECK-NOFP-NEXT:    .save {r7, lr}907; CHECK-NOFP-NEXT:    push {r7, lr}908; CHECK-NOFP-NEXT:    lsls r0, r0, #16909; CHECK-NOFP-NEXT:    lsls r1, r1, #16910; CHECK-NOFP-NEXT:    bl __aeabi_fcmpun911; CHECK-NOFP-NEXT:    cmp r0, #0912; CHECK-NOFP-NEXT:    cset r0, eq913; CHECK-NOFP-NEXT:    pop {r7, pc}914;915; CHECK-FP-LABEL: test_fcmp_ord:916; CHECK-FP:       @ %bb.0:917; CHECK-FP-NEXT:    vmov r0, s1918; CHECK-FP-NEXT:    vmov r1, s0919; CHECK-FP-NEXT:    lsls r0, r0, #16920; CHECK-FP-NEXT:    vmov s0, r0921; CHECK-FP-NEXT:    lsls r0, r1, #16922; CHECK-FP-NEXT:    vmov s2, r0923; CHECK-FP-NEXT:    vcmp.f32 s2, s0924; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr925; CHECK-FP-NEXT:    cset r0, vc926; CHECK-FP-NEXT:    bx lr927  %r = fcmp ord bfloat %a, %b928  ret i1 %r929}930 931define void @test_fccmp(bfloat %in, ptr %out) {932; CHECK-NOFP-LABEL: test_fccmp:933; CHECK-NOFP:       @ %bb.0:934; CHECK-NOFP-NEXT:    .save {r4, r5, r6, r7, lr}935; CHECK-NOFP-NEXT:    push {r4, r5, r6, r7, lr}936; CHECK-NOFP-NEXT:    .pad #4937; CHECK-NOFP-NEXT:    sub sp, #4938; CHECK-NOFP-NEXT:    lsls r6, r0, #16939; CHECK-NOFP-NEXT:    mov r4, r1940; CHECK-NOFP-NEXT:    mov r5, r0941; CHECK-NOFP-NEXT:    mov r0, r6942; CHECK-NOFP-NEXT:    mov.w r1, #1207959552943; CHECK-NOFP-NEXT:    bl __aeabi_fcmpgt944; CHECK-NOFP-NEXT:    mov r7, r0945; CHECK-NOFP-NEXT:    mov r0, r6946; CHECK-NOFP-NEXT:    mov.w r1, #1157627904947; CHECK-NOFP-NEXT:    bl __aeabi_fcmplt948; CHECK-NOFP-NEXT:    mov.w r1, #17664949; CHECK-NOFP-NEXT:    cmp r0, #0950; CHECK-NOFP-NEXT:    csel r0, r5, r1, ne951; CHECK-NOFP-NEXT:    cmp r7, #0952; CHECK-NOFP-NEXT:    csel r0, r0, r1, ne953; CHECK-NOFP-NEXT:    strh r0, [r4]954; CHECK-NOFP-NEXT:    add sp, #4955; CHECK-NOFP-NEXT:    pop {r4, r5, r6, r7, pc}956;957; CHECK-FP-LABEL: test_fccmp:958; CHECK-FP:       @ %bb.0:959; CHECK-FP-NEXT:    vmov r1, s0960; CHECK-FP-NEXT:    vldr s0, .LCPI34_0961; CHECK-FP-NEXT:    vldr s4, .LCPI34_1962; CHECK-FP-NEXT:    lsls r2, r1, #16963; CHECK-FP-NEXT:    vmov s2, r2964; CHECK-FP-NEXT:    mov.w r2, #17664965; CHECK-FP-NEXT:    vcmp.f32 s2, s0966; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr967; CHECK-FP-NEXT:    vcmp.f32 s2, s4968; CHECK-FP-NEXT:    csel r1, r1, r2, mi969; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr970; CHECK-FP-NEXT:    csel r1, r1, r2, gt971; CHECK-FP-NEXT:    strh r1, [r0]972; CHECK-FP-NEXT:    bx lr973; CHECK-FP-NEXT:    .p2align 2974; CHECK-FP-NEXT:  @ %bb.1:975; CHECK-FP-NEXT:  .LCPI34_0:976; CHECK-FP-NEXT:    .long 0x45000000 @ float 2048977; CHECK-FP-NEXT:  .LCPI34_1:978; CHECK-FP-NEXT:    .long 0x48000000 @ float 131072979  %cmp1 = fcmp ogt bfloat %in, 0xR4800980  %cmp2 = fcmp olt bfloat %in, 0xR4500981  %cond = and i1 %cmp1, %cmp2982  %result = select i1 %cond, bfloat %in, bfloat 0xR4500983  store bfloat %result, ptr %out984  ret void985}986 987define void @test_br_cc(bfloat %a, bfloat %b, ptr %p1, ptr %p2) {988; CHECK-NOFP-LABEL: test_br_cc:989; CHECK-NOFP:       @ %bb.0: @ %common.ret990; CHECK-NOFP-NEXT:    .save {r4, r5, r7, lr}991; CHECK-NOFP-NEXT:    push {r4, r5, r7, lr}992; CHECK-NOFP-NEXT:    lsls r0, r0, #16993; CHECK-NOFP-NEXT:    lsls r1, r1, #16994; CHECK-NOFP-NEXT:    mov r4, r3995; CHECK-NOFP-NEXT:    mov r5, r2996; CHECK-NOFP-NEXT:    bl __aeabi_fcmplt997; CHECK-NOFP-NEXT:    cmp r0, #0998; CHECK-NOFP-NEXT:    mov.w r1, #0999; CHECK-NOFP-NEXT:    csel r0, r5, r4, eq1000; CHECK-NOFP-NEXT:    str r1, [r0]1001; CHECK-NOFP-NEXT:    pop {r4, r5, r7, pc}1002;1003; CHECK-FP-LABEL: test_br_cc:1004; CHECK-FP:       @ %bb.0: @ %common.ret1005; CHECK-FP-NEXT:    vmov r2, s11006; CHECK-FP-NEXT:    vmov r3, s01007; CHECK-FP-NEXT:    lsls r2, r2, #161008; CHECK-FP-NEXT:    vmov s0, r21009; CHECK-FP-NEXT:    lsls r2, r3, #161010; CHECK-FP-NEXT:    vmov s2, r21011; CHECK-FP-NEXT:    vcmp.f32 s2, s01012; CHECK-FP-NEXT:    vmrs APSR_nzcv, fpscr1013; CHECK-FP-NEXT:    csel r0, r0, r1, pl1014; CHECK-FP-NEXT:    movs r1, #01015; CHECK-FP-NEXT:    str r1, [r0]1016; CHECK-FP-NEXT:    bx lr1017  %c = fcmp uge bfloat %a, %b1018  br i1 %c, label %then, label %else1019then:1020  store i32 0, ptr %p11021  ret void1022else:1023  store i32 0, ptr %p21024  ret void1025}1026 1027define bfloat @test_phi(ptr %p1) {1028; CHECK-NOFP-LABEL: test_phi:1029; CHECK-NOFP:       @ %bb.0: @ %entry1030; CHECK-NOFP-NEXT:    .save {r4, r5, r6, lr}1031; CHECK-NOFP-NEXT:    push {r4, r5, r6, lr}1032; CHECK-NOFP-NEXT:    ldrh r6, [r0]1033; CHECK-NOFP-NEXT:    mov r4, r01034; CHECK-NOFP-NEXT:  .LBB36_1: @ %loop1035; CHECK-NOFP-NEXT:    @ =>This Inner Loop Header: Depth=11036; CHECK-NOFP-NEXT:    mov r0, r41037; CHECK-NOFP-NEXT:    mov r5, r61038; CHECK-NOFP-NEXT:    ldrh r6, [r4]1039; CHECK-NOFP-NEXT:    bl test_dummy1040; CHECK-NOFP-NEXT:    lsls r0, r0, #311041; CHECK-NOFP-NEXT:    bne .LBB36_11042; CHECK-NOFP-NEXT:  @ %bb.2: @ %return1043; CHECK-NOFP-NEXT:    mov r0, r51044; CHECK-NOFP-NEXT:    pop {r4, r5, r6, pc}1045;1046; CHECK-FP-LABEL: test_phi:1047; CHECK-FP:       @ %bb.0: @ %entry1048; CHECK-FP-NEXT:    .save {r4, lr}1049; CHECK-FP-NEXT:    push {r4, lr}1050; CHECK-FP-NEXT:    .vsave {d8, d9}1051; CHECK-FP-NEXT:    vpush {d8, d9}1052; CHECK-FP-NEXT:    mov r4, r01053; CHECK-FP-NEXT:    ldrh r0, [r0]1054; CHECK-FP-NEXT:    vmov s18, r01055; CHECK-FP-NEXT:  .LBB36_1: @ %loop1056; CHECK-FP-NEXT:    @ =>This Inner Loop Header: Depth=11057; CHECK-FP-NEXT:    ldrh r0, [r4]1058; CHECK-FP-NEXT:    vmov.f32 s16, s181059; CHECK-FP-NEXT:    vmov s18, r01060; CHECK-FP-NEXT:    mov r0, r41061; CHECK-FP-NEXT:    bl test_dummy1062; CHECK-FP-NEXT:    lsls r0, r0, #311063; CHECK-FP-NEXT:    bne .LBB36_11064; CHECK-FP-NEXT:  @ %bb.2: @ %return1065; CHECK-FP-NEXT:    vmov.f32 s0, s161066; CHECK-FP-NEXT:    vpop {d8, d9}1067; CHECK-FP-NEXT:    pop {r4, pc}1068entry:1069  %a = load bfloat, ptr %p11070  br label %loop1071loop:1072  %r = phi bfloat [%a, %entry], [%b, %loop]1073  %b = load bfloat, ptr %p11074  %c = call i1 @test_dummy(ptr %p1)1075  br i1 %c, label %loop, label %return1076return:1077  ret bfloat %r1078}1079 1080declare i1 @test_dummy(ptr %p1) #01081 1082define i32 @test_fptosi_i32(bfloat %a) {1083; CHECK-NOFP-LABEL: test_fptosi_i32:1084; CHECK-NOFP:       @ %bb.0:1085; CHECK-NOFP-NEXT:    .save {r7, lr}1086; CHECK-NOFP-NEXT:    push {r7, lr}1087; CHECK-NOFP-NEXT:    lsls r0, r0, #161088; CHECK-NOFP-NEXT:    bl __aeabi_f2iz1089; CHECK-NOFP-NEXT:    pop {r7, pc}1090;1091; CHECK-FP-LABEL: test_fptosi_i32:1092; CHECK-FP:       @ %bb.0:1093; CHECK-FP-NEXT:    vmov r0, s01094; CHECK-FP-NEXT:    lsls r0, r0, #161095; CHECK-FP-NEXT:    vmov s0, r01096; CHECK-FP-NEXT:    vcvt.s32.f32 s0, s01097; CHECK-FP-NEXT:    vmov r0, s01098; CHECK-FP-NEXT:    bx lr1099  %r = fptosi bfloat %a to i321100  ret i32 %r1101}1102 1103define i64 @test_fptosi_i64(bfloat %a) {1104; CHECK-NOFP-LABEL: test_fptosi_i64:1105; CHECK-NOFP:       @ %bb.0:1106; CHECK-NOFP-NEXT:    .save {r7, lr}1107; CHECK-NOFP-NEXT:    push {r7, lr}1108; CHECK-NOFP-NEXT:    lsls r0, r0, #161109; CHECK-NOFP-NEXT:    bl __aeabi_f2lz1110; CHECK-NOFP-NEXT:    pop {r7, pc}1111;1112; CHECK-FP-LABEL: test_fptosi_i64:1113; CHECK-FP:       @ %bb.0:1114; CHECK-FP-NEXT:    .save {r7, lr}1115; CHECK-FP-NEXT:    push {r7, lr}1116; CHECK-FP-NEXT:    vmov r0, s01117; CHECK-FP-NEXT:    lsls r0, r0, #161118; CHECK-FP-NEXT:    bl __aeabi_f2lz1119; CHECK-FP-NEXT:    pop {r7, pc}1120  %r = fptosi bfloat %a to i641121  ret i64 %r1122}1123 1124define i32 @test_fptoui_i32(bfloat %a) {1125; CHECK-NOFP-LABEL: test_fptoui_i32:1126; CHECK-NOFP:       @ %bb.0:1127; CHECK-NOFP-NEXT:    .save {r7, lr}1128; CHECK-NOFP-NEXT:    push {r7, lr}1129; CHECK-NOFP-NEXT:    lsls r0, r0, #161130; CHECK-NOFP-NEXT:    bl __aeabi_f2uiz1131; CHECK-NOFP-NEXT:    pop {r7, pc}1132;1133; CHECK-FP-LABEL: test_fptoui_i32:1134; CHECK-FP:       @ %bb.0:1135; CHECK-FP-NEXT:    vmov r0, s01136; CHECK-FP-NEXT:    lsls r0, r0, #161137; CHECK-FP-NEXT:    vmov s0, r01138; CHECK-FP-NEXT:    vcvt.u32.f32 s0, s01139; CHECK-FP-NEXT:    vmov r0, s01140; CHECK-FP-NEXT:    bx lr1141  %r = fptoui bfloat %a to i321142  ret i32 %r1143}1144 1145define i64 @test_fptoui_i64(bfloat %a) {1146; CHECK-NOFP-LABEL: test_fptoui_i64:1147; CHECK-NOFP:       @ %bb.0:1148; CHECK-NOFP-NEXT:    .save {r7, lr}1149; CHECK-NOFP-NEXT:    push {r7, lr}1150; CHECK-NOFP-NEXT:    lsls r0, r0, #161151; CHECK-NOFP-NEXT:    bl __aeabi_f2ulz1152; CHECK-NOFP-NEXT:    pop {r7, pc}1153;1154; CHECK-FP-LABEL: test_fptoui_i64:1155; CHECK-FP:       @ %bb.0:1156; CHECK-FP-NEXT:    .save {r7, lr}1157; CHECK-FP-NEXT:    push {r7, lr}1158; CHECK-FP-NEXT:    vmov r0, s01159; CHECK-FP-NEXT:    lsls r0, r0, #161160; CHECK-FP-NEXT:    bl __aeabi_f2ulz1161; CHECK-FP-NEXT:    pop {r7, pc}1162  %r = fptoui bfloat %a to i641163  ret i64 %r1164}1165 1166define bfloat @test_uitofp_i32(i32 %a) {1167;1168; CHECK-NOFP-LABEL: test_uitofp_i32:1169; CHECK-NOFP:       @ %bb.0:1170; CHECK-NOFP-NEXT:    .save {r7, lr}1171; CHECK-NOFP-NEXT:    push {r7, lr}1172; CHECK-NOFP-NEXT:    bl __aeabi_ui2f1173; CHECK-NOFP-NEXT:    bl __truncsfbf21174; CHECK-NOFP-NEXT:    pop {r7, pc}1175;1176; CHECK-FP-LABEL: test_uitofp_i32:1177; CHECK-FP:       @ %bb.0:1178; CHECK-FP-NEXT:    .save {r7, lr}1179; CHECK-FP-NEXT:    push {r7, lr}1180; CHECK-FP-NEXT:    vmov s0, r01181; CHECK-FP-NEXT:    vcvt.f32.u32 s0, s01182; CHECK-FP-NEXT:    bl __truncsfbf21183; CHECK-FP-NEXT:    vmov.f16 r0, s01184; CHECK-FP-NEXT:    vmov s0, r01185; CHECK-FP-NEXT:    pop {r7, pc}1186  %r = uitofp i32 %a to bfloat1187  ret bfloat %r1188}1189 1190define bfloat @test_uitofp_i64(i64 %a) {1191;1192; CHECK-NOFP-LABEL: test_uitofp_i64:1193; CHECK-NOFP:       @ %bb.0:1194; CHECK-NOFP-NEXT:    .save {r7, lr}1195; CHECK-NOFP-NEXT:    push {r7, lr}1196; CHECK-NOFP-NEXT:    bl __aeabi_ul2f1197; CHECK-NOFP-NEXT:    bl __truncsfbf21198; CHECK-NOFP-NEXT:    pop {r7, pc}1199;1200; CHECK-FP-LABEL: test_uitofp_i64:1201; CHECK-FP:       @ %bb.0:1202; CHECK-FP-NEXT:    .save {r7, lr}1203; CHECK-FP-NEXT:    push {r7, lr}1204; CHECK-FP-NEXT:    bl __aeabi_ul2f1205; CHECK-FP-NEXT:    vmov s0, r01206; CHECK-FP-NEXT:    bl __truncsfbf21207; CHECK-FP-NEXT:    vmov.f16 r0, s01208; CHECK-FP-NEXT:    vmov s0, r01209; CHECK-FP-NEXT:    pop {r7, pc}1210  %r = uitofp i64 %a to bfloat1211  ret bfloat %r1212}1213 1214define bfloat @test_sitofp_i32(i32 %a) {1215;1216; CHECK-NOFP-LABEL: test_sitofp_i32:1217; CHECK-NOFP:       @ %bb.0:1218; CHECK-NOFP-NEXT:    .save {r7, lr}1219; CHECK-NOFP-NEXT:    push {r7, lr}1220; CHECK-NOFP-NEXT:    bl __aeabi_i2f1221; CHECK-NOFP-NEXT:    bl __truncsfbf21222; CHECK-NOFP-NEXT:    pop {r7, pc}1223;1224; CHECK-FP-LABEL: test_sitofp_i32:1225; CHECK-FP:       @ %bb.0:1226; CHECK-FP-NEXT:    .save {r7, lr}1227; CHECK-FP-NEXT:    push {r7, lr}1228; CHECK-FP-NEXT:    vmov s0, r01229; CHECK-FP-NEXT:    vcvt.f32.s32 s0, s01230; CHECK-FP-NEXT:    bl __truncsfbf21231; CHECK-FP-NEXT:    vmov.f16 r0, s01232; CHECK-FP-NEXT:    vmov s0, r01233; CHECK-FP-NEXT:    pop {r7, pc}1234  %r = sitofp i32 %a to bfloat1235  ret bfloat %r1236}1237 1238define bfloat @test_sitofp_i64(i64 %a) {1239;1240; CHECK-NOFP-LABEL: test_sitofp_i64:1241; CHECK-NOFP:       @ %bb.0:1242; CHECK-NOFP-NEXT:    .save {r7, lr}1243; CHECK-NOFP-NEXT:    push {r7, lr}1244; CHECK-NOFP-NEXT:    bl __aeabi_l2f1245; CHECK-NOFP-NEXT:    bl __truncsfbf21246; CHECK-NOFP-NEXT:    pop {r7, pc}1247;1248; CHECK-FP-LABEL: test_sitofp_i64:1249; CHECK-FP:       @ %bb.0:1250; CHECK-FP-NEXT:    .save {r7, lr}1251; CHECK-FP-NEXT:    push {r7, lr}1252; CHECK-FP-NEXT:    bl __aeabi_l2f1253; CHECK-FP-NEXT:    vmov s0, r01254; CHECK-FP-NEXT:    bl __truncsfbf21255; CHECK-FP-NEXT:    vmov.f16 r0, s01256; CHECK-FP-NEXT:    vmov s0, r01257; CHECK-FP-NEXT:    pop {r7, pc}1258  %r = sitofp i64 %a to bfloat1259  ret bfloat %r1260}1261 1262define bfloat @test_uitofp_i32_fadd(i32 %a, bfloat %b) {1263;1264; CHECK-NOFP-LABEL: test_uitofp_i32_fadd:1265; CHECK-NOFP:       @ %bb.0:1266; CHECK-NOFP-NEXT:    .save {r4, lr}1267; CHECK-NOFP-NEXT:    push {r4, lr}1268; CHECK-NOFP-NEXT:    mov r4, r11269; CHECK-NOFP-NEXT:    bl __aeabi_ui2f1270; CHECK-NOFP-NEXT:    bl __truncsfbf21271; CHECK-NOFP-NEXT:    lsls r2, r4, #161272; CHECK-NOFP-NEXT:    lsls r1, r0, #161273; CHECK-NOFP-NEXT:    mov r0, r21274; CHECK-NOFP-NEXT:    bl __aeabi_fadd1275; CHECK-NOFP-NEXT:    bl __truncsfbf21276; CHECK-NOFP-NEXT:    pop {r4, pc}1277;1278; CHECK-FP-LABEL: test_uitofp_i32_fadd:1279; CHECK-FP:       @ %bb.0:1280; CHECK-FP-NEXT:    .save {r4, lr}1281; CHECK-FP-NEXT:    push {r4, lr}1282; CHECK-FP-NEXT:    vmov s2, r01283; CHECK-FP-NEXT:    vmov r4, s01284; CHECK-FP-NEXT:    vcvt.f32.u32 s2, s21285; CHECK-FP-NEXT:    vmov.f32 s0, s21286; CHECK-FP-NEXT:    bl __truncsfbf21287; CHECK-FP-NEXT:    vmov r0, s01288; CHECK-FP-NEXT:    lsls r1, r4, #161289; CHECK-FP-NEXT:    vmov s0, r11290; CHECK-FP-NEXT:    lsls r0, r0, #161291; CHECK-FP-NEXT:    vmov s2, r01292; CHECK-FP-NEXT:    vadd.f32 s0, s0, s21293; CHECK-FP-NEXT:    bl __truncsfbf21294; CHECK-FP-NEXT:    vmov.f16 r0, s01295; CHECK-FP-NEXT:    vmov s0, r01296; CHECK-FP-NEXT:    pop {r4, pc}1297  %c = uitofp i32 %a to bfloat1298  %r = fadd bfloat %b, %c1299  ret bfloat %r1300}1301 1302define bfloat @test_sitofp_i32_fadd(i32 %a, bfloat %b) {1303;1304; CHECK-NOFP-LABEL: test_sitofp_i32_fadd:1305; CHECK-NOFP:       @ %bb.0:1306; CHECK-NOFP-NEXT:    .save {r4, lr}1307; CHECK-NOFP-NEXT:    push {r4, lr}1308; CHECK-NOFP-NEXT:    mov r4, r11309; CHECK-NOFP-NEXT:    bl __aeabi_i2f1310; CHECK-NOFP-NEXT:    bl __truncsfbf21311; CHECK-NOFP-NEXT:    lsls r2, r4, #161312; CHECK-NOFP-NEXT:    lsls r1, r0, #161313; CHECK-NOFP-NEXT:    mov r0, r21314; CHECK-NOFP-NEXT:    bl __aeabi_fadd1315; CHECK-NOFP-NEXT:    bl __truncsfbf21316; CHECK-NOFP-NEXT:    pop {r4, pc}1317;1318; CHECK-FP-LABEL: test_sitofp_i32_fadd:1319; CHECK-FP:       @ %bb.0:1320; CHECK-FP-NEXT:    .save {r4, lr}1321; CHECK-FP-NEXT:    push {r4, lr}1322; CHECK-FP-NEXT:    vmov s2, r01323; CHECK-FP-NEXT:    vmov r4, s01324; CHECK-FP-NEXT:    vcvt.f32.s32 s2, s21325; CHECK-FP-NEXT:    vmov.f32 s0, s21326; CHECK-FP-NEXT:    bl __truncsfbf21327; CHECK-FP-NEXT:    vmov r0, s01328; CHECK-FP-NEXT:    lsls r1, r4, #161329; CHECK-FP-NEXT:    vmov s0, r11330; CHECK-FP-NEXT:    lsls r0, r0, #161331; CHECK-FP-NEXT:    vmov s2, r01332; CHECK-FP-NEXT:    vadd.f32 s0, s0, s21333; CHECK-FP-NEXT:    bl __truncsfbf21334; CHECK-FP-NEXT:    vmov.f16 r0, s01335; CHECK-FP-NEXT:    vmov s0, r01336; CHECK-FP-NEXT:    pop {r4, pc}1337  %c = sitofp i32 %a to bfloat1338  %r = fadd bfloat %b, %c1339  ret bfloat %r1340}1341 1342define bfloat @test_fptrunc_float(float %a) {1343;1344; CHECK-NOFP-LABEL: test_fptrunc_float:1345; CHECK-NOFP:       @ %bb.0:1346; CHECK-NOFP-NEXT:    .save {r7, lr}1347; CHECK-NOFP-NEXT:    push {r7, lr}1348; CHECK-NOFP-NEXT:    bl __truncsfbf21349; CHECK-NOFP-NEXT:    pop {r7, pc}1350;1351; CHECK-FP-LABEL: test_fptrunc_float:1352; CHECK-FP:       @ %bb.0:1353; CHECK-FP-NEXT:    .save {r7, lr}1354; CHECK-FP-NEXT:    push {r7, lr}1355; CHECK-FP-NEXT:    bl __truncsfbf21356; CHECK-FP-NEXT:    vmov.f16 r0, s01357; CHECK-FP-NEXT:    vmov s0, r01358; CHECK-FP-NEXT:    pop {r7, pc}1359  %r = fptrunc float %a to bfloat1360  ret bfloat %r1361}1362 1363define bfloat @test_fptrunc_double(double %a) {1364;1365; CHECK-NOFP-LABEL: test_fptrunc_double:1366; CHECK-NOFP:       @ %bb.0:1367; CHECK-NOFP-NEXT:    .save {r7, lr}1368; CHECK-NOFP-NEXT:    push {r7, lr}1369; CHECK-NOFP-NEXT:    bl __truncdfbf21370; CHECK-NOFP-NEXT:    pop {r7, pc}1371;1372; CHECK-FP-LABEL: test_fptrunc_double:1373; CHECK-FP:       @ %bb.0:1374; CHECK-FP-NEXT:    .save {r7, lr}1375; CHECK-FP-NEXT:    push {r7, lr}1376; CHECK-FP-NEXT:    bl __truncdfbf21377; CHECK-FP-NEXT:    vmov.f16 r0, s01378; CHECK-FP-NEXT:    vmov s0, r01379; CHECK-FP-NEXT:    pop {r7, pc}1380  %r = fptrunc double %a to bfloat1381  ret bfloat %r1382}1383 1384define float @test_fpext_float(bfloat %a) {1385; CHECK-NOFP-LABEL: test_fpext_float:1386; CHECK-NOFP:       @ %bb.0:1387; CHECK-NOFP-NEXT:    lsls r0, r0, #161388; CHECK-NOFP-NEXT:    bx lr1389;1390; CHECK-FP-LABEL: test_fpext_float:1391; CHECK-FP:       @ %bb.0:1392; CHECK-FP-NEXT:    vmov r0, s01393; CHECK-FP-NEXT:    lsls r0, r0, #161394; CHECK-FP-NEXT:    vmov s0, r01395; CHECK-FP-NEXT:    bx lr1396  %r = fpext bfloat %a to float1397  ret float %r1398}1399 1400define double @test_fpext_double(bfloat %a) {1401; CHECK-NOFP-LABEL: test_fpext_double:1402; CHECK-NOFP:       @ %bb.0:1403; CHECK-NOFP-NEXT:    .save {r7, lr}1404; CHECK-NOFP-NEXT:    push {r7, lr}1405; CHECK-NOFP-NEXT:    lsls r0, r0, #161406; CHECK-NOFP-NEXT:    bl __aeabi_f2d1407; CHECK-NOFP-NEXT:    pop {r7, pc}1408;1409; CHECK-FPNO64-LABEL: test_fpext_double:1410; CHECK-FPNO64:       @ %bb.0:1411; CHECK-FPNO64-NEXT:    .save {r7, lr}1412; CHECK-FPNO64-NEXT:    push {r7, lr}1413; CHECK-FPNO64-NEXT:    vmov r0, s01414; CHECK-FPNO64-NEXT:    lsls r0, r0, #161415; CHECK-FPNO64-NEXT:    bl __aeabi_f2d1416; CHECK-FPNO64-NEXT:    vmov d0, r0, r11417; CHECK-FPNO64-NEXT:    pop {r7, pc}1418;1419; CHECK-FP64-LABEL: test_fpext_double:1420; CHECK-FP64:       @ %bb.0:1421; CHECK-FP64-NEXT:    vmov r0, s01422; CHECK-FP64-NEXT:    lsls r0, r0, #161423; CHECK-FP64-NEXT:    vmov s0, r01424; CHECK-FP64-NEXT:    vcvt.f64.f32 d0, s01425; CHECK-FP64-NEXT:    bx lr1426  %r = fpext bfloat %a to double1427  ret double %r1428}1429 1430define i16 @test_bitcast_bfloattoi16(bfloat %a) {1431; CHECK-NOFP-LABEL: test_bitcast_bfloattoi16:1432; CHECK-NOFP:       @ %bb.0:1433; CHECK-NOFP-NEXT:    bx lr1434;1435; CHECK-FP-LABEL: test_bitcast_bfloattoi16:1436; CHECK-FP:       @ %bb.0:1437; CHECK-FP-NEXT:    vmov r0, s01438; CHECK-FP-NEXT:    bx lr1439  %r = bitcast bfloat %a to i161440  ret i16 %r1441}1442 1443define bfloat @test_bitcast_i16tobfloat(i16 %a) {1444; CHECK-NOFP-LABEL: test_bitcast_i16tobfloat:1445; CHECK-NOFP:       @ %bb.0:1446; CHECK-NOFP-NEXT:    bx lr1447;1448; CHECK-FP-LABEL: test_bitcast_i16tobfloat:1449; CHECK-FP:       @ %bb.0:1450; CHECK-FP-NEXT:    vmov s0, r01451; CHECK-FP-NEXT:    bx lr1452  %r = bitcast i16 %a to bfloat1453  ret bfloat %r1454}1455 1456declare bfloat @llvm.sqrt.f16(bfloat %a) #01457declare bfloat @llvm.powi.f16.i32(bfloat %a, i32 %b) #01458declare bfloat @llvm.sin.f16(bfloat %a) #01459declare bfloat @llvm.cos.f16(bfloat %a) #01460declare bfloat @llvm.tan.f16(bfloat %a) #01461declare bfloat @llvm.asin.f16(bfloat %a) #01462declare bfloat @llvm.acos.f16(bfloat %a) #01463declare bfloat @llvm.atan.f16(bfloat %a) #01464declare bfloat @llvm.atan2.f16(bfloat %a, bfloat %b) #01465declare bfloat @llvm.sinh.f16(bfloat %a) #01466declare bfloat @llvm.cosh.f16(bfloat %a) #01467declare bfloat @llvm.tanh.f16(bfloat %a) #01468declare bfloat @llvm.pow.f16(bfloat %a, bfloat %b) #01469declare bfloat @llvm.exp.f16(bfloat %a) #01470declare bfloat @llvm.exp2.f16(bfloat %a) #01471declare bfloat @llvm.log.f16(bfloat %a) #01472declare bfloat @llvm.log10.f16(bfloat %a) #01473declare bfloat @llvm.log2.f16(bfloat %a) #01474declare bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c) #01475declare bfloat @llvm.fabs.f16(bfloat %a) #01476declare bfloat @llvm.minnum.f16(bfloat %a, bfloat %b) #01477declare bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b) #01478declare bfloat @llvm.copysign.f16(bfloat %a, bfloat %b) #01479declare bfloat @llvm.floor.f16(bfloat %a) #01480declare bfloat @llvm.ceil.f16(bfloat %a) #01481declare bfloat @llvm.trunc.f16(bfloat %a) #01482declare bfloat @llvm.rint.f16(bfloat %a) #01483declare bfloat @llvm.nearbyint.f16(bfloat %a) #01484declare bfloat @llvm.round.f16(bfloat %a) #01485declare bfloat @llvm.roundeven.f16(bfloat %a) #01486declare bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c) #01487 1488 1489define bfloat @test_sqrt(bfloat %a) {1490;1491; CHECK-NOFP-LABEL: test_sqrt:1492; CHECK-NOFP:       @ %bb.0:1493; CHECK-NOFP-NEXT:    .save {r7, lr}1494; CHECK-NOFP-NEXT:    push {r7, lr}1495; CHECK-NOFP-NEXT:    lsls r0, r0, #161496; CHECK-NOFP-NEXT:    bl sqrtf1497; CHECK-NOFP-NEXT:    bl __truncsfbf21498; CHECK-NOFP-NEXT:    pop {r7, pc}1499;1500; CHECK-FP-LABEL: test_sqrt:1501; CHECK-FP:       @ %bb.0:1502; CHECK-FP-NEXT:    .save {r7, lr}1503; CHECK-FP-NEXT:    push {r7, lr}1504; CHECK-FP-NEXT:    vmov r0, s01505; CHECK-FP-NEXT:    lsls r0, r0, #161506; CHECK-FP-NEXT:    vmov s0, r01507; CHECK-FP-NEXT:    vsqrt.f32 s0, s01508; CHECK-FP-NEXT:    bl __truncsfbf21509; CHECK-FP-NEXT:    vmov.f16 r0, s01510; CHECK-FP-NEXT:    vmov s0, r01511; CHECK-FP-NEXT:    pop {r7, pc}1512  %r = call bfloat @llvm.sqrt.f16(bfloat %a)1513  ret bfloat %r1514}1515 1516define bfloat @test_powi(bfloat %a, i32 %b) {1517;1518; CHECK-NOFP-LABEL: test_powi:1519; CHECK-NOFP:       @ %bb.0:1520; CHECK-NOFP-NEXT:    .save {r7, lr}1521; CHECK-NOFP-NEXT:    push {r7, lr}1522; CHECK-NOFP-NEXT:    lsls r0, r0, #161523; CHECK-NOFP-NEXT:    bl __powisf21524; CHECK-NOFP-NEXT:    bl __truncsfbf21525; CHECK-NOFP-NEXT:    pop {r7, pc}1526;1527; CHECK-FP-LABEL: test_powi:1528; CHECK-FP:       @ %bb.0:1529; CHECK-FP-NEXT:    .save {r7, lr}1530; CHECK-FP-NEXT:    push {r7, lr}1531; CHECK-FP-NEXT:    vmov r1, s01532; CHECK-FP-NEXT:    lsls r1, r1, #161533; CHECK-FP-NEXT:    vmov s0, r11534; CHECK-FP-NEXT:    bl __powisf21535; CHECK-FP-NEXT:    bl __truncsfbf21536; CHECK-FP-NEXT:    vmov.f16 r0, s01537; CHECK-FP-NEXT:    vmov s0, r01538; CHECK-FP-NEXT:    pop {r7, pc}1539  %r = call bfloat @llvm.powi.f16.i32(bfloat %a, i32 %b)1540  ret bfloat %r1541}1542 1543 1544define bfloat @test_sin(bfloat %a) {1545;1546; CHECK-NOFP-LABEL: test_sin:1547; CHECK-NOFP:       @ %bb.0:1548; CHECK-NOFP-NEXT:    .save {r7, lr}1549; CHECK-NOFP-NEXT:    push {r7, lr}1550; CHECK-NOFP-NEXT:    lsls r0, r0, #161551; CHECK-NOFP-NEXT:    bl sinf1552; CHECK-NOFP-NEXT:    bl __truncsfbf21553; CHECK-NOFP-NEXT:    pop {r7, pc}1554;1555; CHECK-FP-LABEL: test_sin:1556; CHECK-FP:       @ %bb.0:1557; CHECK-FP-NEXT:    .save {r7, lr}1558; CHECK-FP-NEXT:    push {r7, lr}1559; CHECK-FP-NEXT:    vmov r0, s01560; CHECK-FP-NEXT:    lsls r0, r0, #161561; CHECK-FP-NEXT:    vmov s0, r01562; CHECK-FP-NEXT:    bl sinf1563; CHECK-FP-NEXT:    bl __truncsfbf21564; CHECK-FP-NEXT:    vmov.f16 r0, s01565; CHECK-FP-NEXT:    vmov s0, r01566; CHECK-FP-NEXT:    pop {r7, pc}1567  %r = call bfloat @llvm.sin.f16(bfloat %a)1568  ret bfloat %r1569}1570 1571define bfloat @test_cos(bfloat %a) {1572;1573; CHECK-NOFP-LABEL: test_cos:1574; CHECK-NOFP:       @ %bb.0:1575; CHECK-NOFP-NEXT:    .save {r7, lr}1576; CHECK-NOFP-NEXT:    push {r7, lr}1577; CHECK-NOFP-NEXT:    lsls r0, r0, #161578; CHECK-NOFP-NEXT:    bl cosf1579; CHECK-NOFP-NEXT:    bl __truncsfbf21580; CHECK-NOFP-NEXT:    pop {r7, pc}1581;1582; CHECK-FP-LABEL: test_cos:1583; CHECK-FP:       @ %bb.0:1584; CHECK-FP-NEXT:    .save {r7, lr}1585; CHECK-FP-NEXT:    push {r7, lr}1586; CHECK-FP-NEXT:    vmov r0, s01587; CHECK-FP-NEXT:    lsls r0, r0, #161588; CHECK-FP-NEXT:    vmov s0, r01589; CHECK-FP-NEXT:    bl cosf1590; CHECK-FP-NEXT:    bl __truncsfbf21591; CHECK-FP-NEXT:    vmov.f16 r0, s01592; CHECK-FP-NEXT:    vmov s0, r01593; CHECK-FP-NEXT:    pop {r7, pc}1594  %r = call bfloat @llvm.cos.f16(bfloat %a)1595  ret bfloat %r1596}1597 1598define bfloat @test_tan(bfloat %a) {1599;1600; CHECK-NOFP-LABEL: test_tan:1601; CHECK-NOFP:       @ %bb.0:1602; CHECK-NOFP-NEXT:    .save {r7, lr}1603; CHECK-NOFP-NEXT:    push {r7, lr}1604; CHECK-NOFP-NEXT:    lsls r0, r0, #161605; CHECK-NOFP-NEXT:    bl tanf1606; CHECK-NOFP-NEXT:    bl __truncsfbf21607; CHECK-NOFP-NEXT:    pop {r7, pc}1608;1609; CHECK-FP-LABEL: test_tan:1610; CHECK-FP:       @ %bb.0:1611; CHECK-FP-NEXT:    .save {r7, lr}1612; CHECK-FP-NEXT:    push {r7, lr}1613; CHECK-FP-NEXT:    vmov r0, s01614; CHECK-FP-NEXT:    lsls r0, r0, #161615; CHECK-FP-NEXT:    vmov s0, r01616; CHECK-FP-NEXT:    bl tanf1617; CHECK-FP-NEXT:    bl __truncsfbf21618; CHECK-FP-NEXT:    vmov.f16 r0, s01619; CHECK-FP-NEXT:    vmov s0, r01620; CHECK-FP-NEXT:    pop {r7, pc}1621  %r = call bfloat @llvm.tan.f16(bfloat %a)1622  ret bfloat %r1623}1624 1625define bfloat @test_acos(bfloat %a) {1626;1627; CHECK-NOFP-LABEL: test_acos:1628; CHECK-NOFP:       @ %bb.0:1629; CHECK-NOFP-NEXT:    .save {r7, lr}1630; CHECK-NOFP-NEXT:    push {r7, lr}1631; CHECK-NOFP-NEXT:    lsls r0, r0, #161632; CHECK-NOFP-NEXT:    bl acosf1633; CHECK-NOFP-NEXT:    bl __truncsfbf21634; CHECK-NOFP-NEXT:    pop {r7, pc}1635;1636; CHECK-FP-LABEL: test_acos:1637; CHECK-FP:       @ %bb.0:1638; CHECK-FP-NEXT:    .save {r7, lr}1639; CHECK-FP-NEXT:    push {r7, lr}1640; CHECK-FP-NEXT:    vmov r0, s01641; CHECK-FP-NEXT:    lsls r0, r0, #161642; CHECK-FP-NEXT:    vmov s0, r01643; CHECK-FP-NEXT:    bl acosf1644; CHECK-FP-NEXT:    bl __truncsfbf21645; CHECK-FP-NEXT:    vmov.f16 r0, s01646; CHECK-FP-NEXT:    vmov s0, r01647; CHECK-FP-NEXT:    pop {r7, pc}1648  %r = call bfloat @llvm.acos.f16(bfloat %a)1649  ret bfloat %r1650}1651 1652define bfloat @test_asin(bfloat %a) {1653;1654; CHECK-NOFP-LABEL: test_asin:1655; CHECK-NOFP:       @ %bb.0:1656; CHECK-NOFP-NEXT:    .save {r7, lr}1657; CHECK-NOFP-NEXT:    push {r7, lr}1658; CHECK-NOFP-NEXT:    lsls r0, r0, #161659; CHECK-NOFP-NEXT:    bl asinf1660; CHECK-NOFP-NEXT:    bl __truncsfbf21661; CHECK-NOFP-NEXT:    pop {r7, pc}1662;1663; CHECK-FP-LABEL: test_asin:1664; CHECK-FP:       @ %bb.0:1665; CHECK-FP-NEXT:    .save {r7, lr}1666; CHECK-FP-NEXT:    push {r7, lr}1667; CHECK-FP-NEXT:    vmov r0, s01668; CHECK-FP-NEXT:    lsls r0, r0, #161669; CHECK-FP-NEXT:    vmov s0, r01670; CHECK-FP-NEXT:    bl asinf1671; CHECK-FP-NEXT:    bl __truncsfbf21672; CHECK-FP-NEXT:    vmov.f16 r0, s01673; CHECK-FP-NEXT:    vmov s0, r01674; CHECK-FP-NEXT:    pop {r7, pc}1675  %r = call bfloat @llvm.asin.f16(bfloat %a)1676  ret bfloat %r1677}1678 1679define bfloat @test_atan(bfloat %a) {1680;1681; CHECK-NOFP-LABEL: test_atan:1682; CHECK-NOFP:       @ %bb.0:1683; CHECK-NOFP-NEXT:    .save {r7, lr}1684; CHECK-NOFP-NEXT:    push {r7, lr}1685; CHECK-NOFP-NEXT:    lsls r0, r0, #161686; CHECK-NOFP-NEXT:    bl atanf1687; CHECK-NOFP-NEXT:    bl __truncsfbf21688; CHECK-NOFP-NEXT:    pop {r7, pc}1689;1690; CHECK-FP-LABEL: test_atan:1691; CHECK-FP:       @ %bb.0:1692; CHECK-FP-NEXT:    .save {r7, lr}1693; CHECK-FP-NEXT:    push {r7, lr}1694; CHECK-FP-NEXT:    vmov r0, s01695; CHECK-FP-NEXT:    lsls r0, r0, #161696; CHECK-FP-NEXT:    vmov s0, r01697; CHECK-FP-NEXT:    bl atanf1698; CHECK-FP-NEXT:    bl __truncsfbf21699; CHECK-FP-NEXT:    vmov.f16 r0, s01700; CHECK-FP-NEXT:    vmov s0, r01701; CHECK-FP-NEXT:    pop {r7, pc}1702  %r = call bfloat @llvm.atan.f16(bfloat %a)1703  ret bfloat %r1704}1705 1706define bfloat @test_atan2(bfloat %a, bfloat %b) {1707;1708; CHECK-NOFP-LABEL: test_atan2:1709; CHECK-NOFP:       @ %bb.0:1710; CHECK-NOFP-NEXT:    .save {r7, lr}1711; CHECK-NOFP-NEXT:    push {r7, lr}1712; CHECK-NOFP-NEXT:    lsls r0, r0, #161713; CHECK-NOFP-NEXT:    lsls r1, r1, #161714; CHECK-NOFP-NEXT:    bl atan2f1715; CHECK-NOFP-NEXT:    bl __truncsfbf21716; CHECK-NOFP-NEXT:    pop {r7, pc}1717;1718; CHECK-FP-LABEL: test_atan2:1719; CHECK-FP:       @ %bb.0:1720; CHECK-FP-NEXT:    .save {r7, lr}1721; CHECK-FP-NEXT:    push {r7, lr}1722; CHECK-FP-NEXT:    vmov r0, s11723; CHECK-FP-NEXT:    vmov r1, s01724; CHECK-FP-NEXT:    lsls r0, r0, #161725; CHECK-FP-NEXT:    lsls r1, r1, #161726; CHECK-FP-NEXT:    vmov s1, r01727; CHECK-FP-NEXT:    vmov s0, r11728; CHECK-FP-NEXT:    bl atan2f1729; CHECK-FP-NEXT:    bl __truncsfbf21730; CHECK-FP-NEXT:    vmov.f16 r0, s01731; CHECK-FP-NEXT:    vmov s0, r01732; CHECK-FP-NEXT:    pop {r7, pc}1733  %r = call bfloat @llvm.atan2.f16(bfloat %a, bfloat %b)1734  ret bfloat %r1735}1736 1737define bfloat @test_cosh(bfloat %a) {1738;1739; CHECK-NOFP-LABEL: test_cosh:1740; CHECK-NOFP:       @ %bb.0:1741; CHECK-NOFP-NEXT:    .save {r7, lr}1742; CHECK-NOFP-NEXT:    push {r7, lr}1743; CHECK-NOFP-NEXT:    lsls r0, r0, #161744; CHECK-NOFP-NEXT:    bl coshf1745; CHECK-NOFP-NEXT:    bl __truncsfbf21746; CHECK-NOFP-NEXT:    pop {r7, pc}1747;1748; CHECK-FP-LABEL: test_cosh:1749; CHECK-FP:       @ %bb.0:1750; CHECK-FP-NEXT:    .save {r7, lr}1751; CHECK-FP-NEXT:    push {r7, lr}1752; CHECK-FP-NEXT:    vmov r0, s01753; CHECK-FP-NEXT:    lsls r0, r0, #161754; CHECK-FP-NEXT:    vmov s0, r01755; CHECK-FP-NEXT:    bl coshf1756; CHECK-FP-NEXT:    bl __truncsfbf21757; CHECK-FP-NEXT:    vmov.f16 r0, s01758; CHECK-FP-NEXT:    vmov s0, r01759; CHECK-FP-NEXT:    pop {r7, pc}1760  %r = call bfloat @llvm.cosh.f16(bfloat %a)1761  ret bfloat %r1762}1763 1764define bfloat @test_sinh(bfloat %a) {1765;1766; CHECK-NOFP-LABEL: test_sinh:1767; CHECK-NOFP:       @ %bb.0:1768; CHECK-NOFP-NEXT:    .save {r7, lr}1769; CHECK-NOFP-NEXT:    push {r7, lr}1770; CHECK-NOFP-NEXT:    lsls r0, r0, #161771; CHECK-NOFP-NEXT:    bl sinhf1772; CHECK-NOFP-NEXT:    bl __truncsfbf21773; CHECK-NOFP-NEXT:    pop {r7, pc}1774;1775; CHECK-FP-LABEL: test_sinh:1776; CHECK-FP:       @ %bb.0:1777; CHECK-FP-NEXT:    .save {r7, lr}1778; CHECK-FP-NEXT:    push {r7, lr}1779; CHECK-FP-NEXT:    vmov r0, s01780; CHECK-FP-NEXT:    lsls r0, r0, #161781; CHECK-FP-NEXT:    vmov s0, r01782; CHECK-FP-NEXT:    bl sinhf1783; CHECK-FP-NEXT:    bl __truncsfbf21784; CHECK-FP-NEXT:    vmov.f16 r0, s01785; CHECK-FP-NEXT:    vmov s0, r01786; CHECK-FP-NEXT:    pop {r7, pc}1787  %r = call bfloat @llvm.sinh.f16(bfloat %a)1788  ret bfloat %r1789}1790 1791define bfloat @test_tanh(bfloat %a) {1792;1793; CHECK-NOFP-LABEL: test_tanh:1794; CHECK-NOFP:       @ %bb.0:1795; CHECK-NOFP-NEXT:    .save {r7, lr}1796; CHECK-NOFP-NEXT:    push {r7, lr}1797; CHECK-NOFP-NEXT:    lsls r0, r0, #161798; CHECK-NOFP-NEXT:    bl tanhf1799; CHECK-NOFP-NEXT:    bl __truncsfbf21800; CHECK-NOFP-NEXT:    pop {r7, pc}1801;1802; CHECK-FP-LABEL: test_tanh:1803; CHECK-FP:       @ %bb.0:1804; CHECK-FP-NEXT:    .save {r7, lr}1805; CHECK-FP-NEXT:    push {r7, lr}1806; CHECK-FP-NEXT:    vmov r0, s01807; CHECK-FP-NEXT:    lsls r0, r0, #161808; CHECK-FP-NEXT:    vmov s0, r01809; CHECK-FP-NEXT:    bl tanhf1810; CHECK-FP-NEXT:    bl __truncsfbf21811; CHECK-FP-NEXT:    vmov.f16 r0, s01812; CHECK-FP-NEXT:    vmov s0, r01813; CHECK-FP-NEXT:    pop {r7, pc}1814  %r = call bfloat @llvm.tanh.f16(bfloat %a)1815  ret bfloat %r1816}1817 1818define bfloat @test_pow(bfloat %a, bfloat %b) {1819;1820; CHECK-NOFP-LABEL: test_pow:1821; CHECK-NOFP:       @ %bb.0:1822; CHECK-NOFP-NEXT:    .save {r7, lr}1823; CHECK-NOFP-NEXT:    push {r7, lr}1824; CHECK-NOFP-NEXT:    lsls r0, r0, #161825; CHECK-NOFP-NEXT:    lsls r1, r1, #161826; CHECK-NOFP-NEXT:    bl powf1827; CHECK-NOFP-NEXT:    bl __truncsfbf21828; CHECK-NOFP-NEXT:    pop {r7, pc}1829;1830; CHECK-FP-LABEL: test_pow:1831; CHECK-FP:       @ %bb.0:1832; CHECK-FP-NEXT:    .save {r7, lr}1833; CHECK-FP-NEXT:    push {r7, lr}1834; CHECK-FP-NEXT:    vmov r0, s11835; CHECK-FP-NEXT:    vmov r1, s01836; CHECK-FP-NEXT:    lsls r0, r0, #161837; CHECK-FP-NEXT:    lsls r1, r1, #161838; CHECK-FP-NEXT:    vmov s1, r01839; CHECK-FP-NEXT:    vmov s0, r11840; CHECK-FP-NEXT:    bl powf1841; CHECK-FP-NEXT:    bl __truncsfbf21842; CHECK-FP-NEXT:    vmov.f16 r0, s01843; CHECK-FP-NEXT:    vmov s0, r01844; CHECK-FP-NEXT:    pop {r7, pc}1845  %r = call bfloat @llvm.pow.f16(bfloat %a, bfloat %b)1846  ret bfloat %r1847}1848 1849define bfloat @test_exp(bfloat %a) {1850;1851; CHECK-NOFP-LABEL: test_exp:1852; CHECK-NOFP:       @ %bb.0:1853; CHECK-NOFP-NEXT:    .save {r7, lr}1854; CHECK-NOFP-NEXT:    push {r7, lr}1855; CHECK-NOFP-NEXT:    lsls r0, r0, #161856; CHECK-NOFP-NEXT:    bl expf1857; CHECK-NOFP-NEXT:    bl __truncsfbf21858; CHECK-NOFP-NEXT:    pop {r7, pc}1859;1860; CHECK-FP-LABEL: test_exp:1861; CHECK-FP:       @ %bb.0:1862; CHECK-FP-NEXT:    .save {r7, lr}1863; CHECK-FP-NEXT:    push {r7, lr}1864; CHECK-FP-NEXT:    vmov r0, s01865; CHECK-FP-NEXT:    lsls r0, r0, #161866; CHECK-FP-NEXT:    vmov s0, r01867; CHECK-FP-NEXT:    bl expf1868; CHECK-FP-NEXT:    bl __truncsfbf21869; CHECK-FP-NEXT:    vmov.f16 r0, s01870; CHECK-FP-NEXT:    vmov s0, r01871; CHECK-FP-NEXT:    pop {r7, pc}1872  %r = call bfloat @llvm.exp.f16(bfloat %a)1873  ret bfloat %r1874}1875 1876define bfloat @test_exp2(bfloat %a) {1877;1878; CHECK-NOFP-LABEL: test_exp2:1879; CHECK-NOFP:       @ %bb.0:1880; CHECK-NOFP-NEXT:    .save {r7, lr}1881; CHECK-NOFP-NEXT:    push {r7, lr}1882; CHECK-NOFP-NEXT:    lsls r0, r0, #161883; CHECK-NOFP-NEXT:    bl exp2f1884; CHECK-NOFP-NEXT:    bl __truncsfbf21885; CHECK-NOFP-NEXT:    pop {r7, pc}1886;1887; CHECK-FP-LABEL: test_exp2:1888; CHECK-FP:       @ %bb.0:1889; CHECK-FP-NEXT:    .save {r7, lr}1890; CHECK-FP-NEXT:    push {r7, lr}1891; CHECK-FP-NEXT:    vmov r0, s01892; CHECK-FP-NEXT:    lsls r0, r0, #161893; CHECK-FP-NEXT:    vmov s0, r01894; CHECK-FP-NEXT:    bl exp2f1895; CHECK-FP-NEXT:    bl __truncsfbf21896; CHECK-FP-NEXT:    vmov.f16 r0, s01897; CHECK-FP-NEXT:    vmov s0, r01898; CHECK-FP-NEXT:    pop {r7, pc}1899  %r = call bfloat @llvm.exp2.f16(bfloat %a)1900  ret bfloat %r1901}1902 1903define bfloat @test_log(bfloat %a) {1904;1905; CHECK-NOFP-LABEL: test_log:1906; CHECK-NOFP:       @ %bb.0:1907; CHECK-NOFP-NEXT:    .save {r7, lr}1908; CHECK-NOFP-NEXT:    push {r7, lr}1909; CHECK-NOFP-NEXT:    lsls r0, r0, #161910; CHECK-NOFP-NEXT:    bl logf1911; CHECK-NOFP-NEXT:    bl __truncsfbf21912; CHECK-NOFP-NEXT:    pop {r7, pc}1913;1914; CHECK-FP-LABEL: test_log:1915; CHECK-FP:       @ %bb.0:1916; CHECK-FP-NEXT:    .save {r7, lr}1917; CHECK-FP-NEXT:    push {r7, lr}1918; CHECK-FP-NEXT:    vmov r0, s01919; CHECK-FP-NEXT:    lsls r0, r0, #161920; CHECK-FP-NEXT:    vmov s0, r01921; CHECK-FP-NEXT:    bl logf1922; CHECK-FP-NEXT:    bl __truncsfbf21923; CHECK-FP-NEXT:    vmov.f16 r0, s01924; CHECK-FP-NEXT:    vmov s0, r01925; CHECK-FP-NEXT:    pop {r7, pc}1926  %r = call bfloat @llvm.log.f16(bfloat %a)1927  ret bfloat %r1928}1929 1930define bfloat @test_log10(bfloat %a) {1931;1932; CHECK-NOFP-LABEL: test_log10:1933; CHECK-NOFP:       @ %bb.0:1934; CHECK-NOFP-NEXT:    .save {r7, lr}1935; CHECK-NOFP-NEXT:    push {r7, lr}1936; CHECK-NOFP-NEXT:    lsls r0, r0, #161937; CHECK-NOFP-NEXT:    bl log10f1938; CHECK-NOFP-NEXT:    bl __truncsfbf21939; CHECK-NOFP-NEXT:    pop {r7, pc}1940;1941; CHECK-FP-LABEL: test_log10:1942; CHECK-FP:       @ %bb.0:1943; CHECK-FP-NEXT:    .save {r7, lr}1944; CHECK-FP-NEXT:    push {r7, lr}1945; CHECK-FP-NEXT:    vmov r0, s01946; CHECK-FP-NEXT:    lsls r0, r0, #161947; CHECK-FP-NEXT:    vmov s0, r01948; CHECK-FP-NEXT:    bl log10f1949; CHECK-FP-NEXT:    bl __truncsfbf21950; CHECK-FP-NEXT:    vmov.f16 r0, s01951; CHECK-FP-NEXT:    vmov s0, r01952; CHECK-FP-NEXT:    pop {r7, pc}1953  %r = call bfloat @llvm.log10.f16(bfloat %a)1954  ret bfloat %r1955}1956 1957define bfloat @test_log2(bfloat %a) {1958;1959; CHECK-NOFP-LABEL: test_log2:1960; CHECK-NOFP:       @ %bb.0:1961; CHECK-NOFP-NEXT:    .save {r7, lr}1962; CHECK-NOFP-NEXT:    push {r7, lr}1963; CHECK-NOFP-NEXT:    lsls r0, r0, #161964; CHECK-NOFP-NEXT:    bl log2f1965; CHECK-NOFP-NEXT:    bl __truncsfbf21966; CHECK-NOFP-NEXT:    pop {r7, pc}1967;1968; CHECK-FP-LABEL: test_log2:1969; CHECK-FP:       @ %bb.0:1970; CHECK-FP-NEXT:    .save {r7, lr}1971; CHECK-FP-NEXT:    push {r7, lr}1972; CHECK-FP-NEXT:    vmov r0, s01973; CHECK-FP-NEXT:    lsls r0, r0, #161974; CHECK-FP-NEXT:    vmov s0, r01975; CHECK-FP-NEXT:    bl log2f1976; CHECK-FP-NEXT:    bl __truncsfbf21977; CHECK-FP-NEXT:    vmov.f16 r0, s01978; CHECK-FP-NEXT:    vmov s0, r01979; CHECK-FP-NEXT:    pop {r7, pc}1980  %r = call bfloat @llvm.log2.f16(bfloat %a)1981  ret bfloat %r1982}1983 1984define bfloat @test_fma(bfloat %a, bfloat %b, bfloat %c) {1985;1986; CHECK-NOFP-LABEL: test_fma:1987; CHECK-NOFP:       @ %bb.0:1988; CHECK-NOFP-NEXT:    .save {r7, lr}1989; CHECK-NOFP-NEXT:    push {r7, lr}1990; CHECK-NOFP-NEXT:    lsls r0, r0, #161991; CHECK-NOFP-NEXT:    lsls r1, r1, #161992; CHECK-NOFP-NEXT:    lsls r2, r2, #161993; CHECK-NOFP-NEXT:    bl fmaf1994; CHECK-NOFP-NEXT:    bl __truncsfbf21995; CHECK-NOFP-NEXT:    pop {r7, pc}1996;1997; CHECK-FP-LABEL: test_fma:1998; CHECK-FP:       @ %bb.0:1999; CHECK-FP-NEXT:    .save {r7, lr}2000; CHECK-FP-NEXT:    push {r7, lr}2001; CHECK-FP-NEXT:    vmov r0, s02002; CHECK-FP-NEXT:    vmov r1, s12003; CHECK-FP-NEXT:    vmov r2, s22004; CHECK-FP-NEXT:    lsls r0, r0, #162005; CHECK-FP-NEXT:    lsls r1, r1, #162006; CHECK-FP-NEXT:    vmov s4, r02007; CHECK-FP-NEXT:    lsls r0, r2, #162008; CHECK-FP-NEXT:    vmov s2, r12009; CHECK-FP-NEXT:    vmov s0, r02010; CHECK-FP-NEXT:    vfma.f32 s0, s4, s22011; CHECK-FP-NEXT:    bl __truncsfbf22012; CHECK-FP-NEXT:    vmov.f16 r0, s02013; CHECK-FP-NEXT:    vmov s0, r02014; CHECK-FP-NEXT:    pop {r7, pc}2015  %r = call bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c)2016  ret bfloat %r2017}2018 2019define bfloat @test_fabs(bfloat %a) {2020; CHECK-NOFP-LABEL: test_fabs:2021; CHECK-NOFP:       @ %bb.0:2022; CHECK-NOFP-NEXT:    bfc r0, #15, #172023; CHECK-NOFP-NEXT:    bx lr2024;2025; CHECK-FP-LABEL: test_fabs:2026; CHECK-FP:       @ %bb.0:2027; CHECK-FP-NEXT:    vmov r0, s02028; CHECK-FP-NEXT:    bfc r0, #15, #172029; CHECK-FP-NEXT:    vmov s0, r02030; CHECK-FP-NEXT:    bx lr2031  %r = call bfloat @llvm.fabs.f16(bfloat %a)2032  ret bfloat %r2033}2034 2035define bfloat @test_minnum(bfloat %a, bfloat %b) {2036;2037; CHECK-NOFP-LABEL: test_minnum:2038; CHECK-NOFP:       @ %bb.0:2039; CHECK-NOFP-NEXT:    .save {r7, lr}2040; CHECK-NOFP-NEXT:    push {r7, lr}2041; CHECK-NOFP-NEXT:    lsls r0, r0, #162042; CHECK-NOFP-NEXT:    lsls r1, r1, #162043; CHECK-NOFP-NEXT:    bl fminf2044; CHECK-NOFP-NEXT:    bl __truncsfbf22045; CHECK-NOFP-NEXT:    pop {r7, pc}2046;2047; CHECK-FP-LABEL: test_minnum:2048; CHECK-FP:       @ %bb.0:2049; CHECK-FP-NEXT:    .save {r7, lr}2050; CHECK-FP-NEXT:    push {r7, lr}2051; CHECK-FP-NEXT:    vmov r0, s12052; CHECK-FP-NEXT:    vmov r1, s02053; CHECK-FP-NEXT:    lsls r0, r0, #162054; CHECK-FP-NEXT:    vmov s0, r02055; CHECK-FP-NEXT:    lsls r0, r1, #162056; CHECK-FP-NEXT:    vmov s2, r02057; CHECK-FP-NEXT:    vminnm.f32 s0, s2, s02058; CHECK-FP-NEXT:    bl __truncsfbf22059; CHECK-FP-NEXT:    vmov.f16 r0, s02060; CHECK-FP-NEXT:    vmov s0, r02061; CHECK-FP-NEXT:    pop {r7, pc}2062  %r = call bfloat @llvm.minnum.f16(bfloat %a, bfloat %b)2063  ret bfloat %r2064}2065 2066define bfloat @test_maxnum(bfloat %a, bfloat %b) {2067;2068; CHECK-NOFP-LABEL: test_maxnum:2069; CHECK-NOFP:       @ %bb.0:2070; CHECK-NOFP-NEXT:    .save {r7, lr}2071; CHECK-NOFP-NEXT:    push {r7, lr}2072; CHECK-NOFP-NEXT:    lsls r0, r0, #162073; CHECK-NOFP-NEXT:    lsls r1, r1, #162074; CHECK-NOFP-NEXT:    bl fmaxf2075; CHECK-NOFP-NEXT:    bl __truncsfbf22076; CHECK-NOFP-NEXT:    pop {r7, pc}2077;2078; CHECK-FP-LABEL: test_maxnum:2079; CHECK-FP:       @ %bb.0:2080; CHECK-FP-NEXT:    .save {r7, lr}2081; CHECK-FP-NEXT:    push {r7, lr}2082; CHECK-FP-NEXT:    vmov r0, s12083; CHECK-FP-NEXT:    vmov r1, s02084; CHECK-FP-NEXT:    lsls r0, r0, #162085; CHECK-FP-NEXT:    vmov s0, r02086; CHECK-FP-NEXT:    lsls r0, r1, #162087; CHECK-FP-NEXT:    vmov s2, r02088; CHECK-FP-NEXT:    vmaxnm.f32 s0, s2, s02089; CHECK-FP-NEXT:    bl __truncsfbf22090; CHECK-FP-NEXT:    vmov.f16 r0, s02091; CHECK-FP-NEXT:    vmov s0, r02092; CHECK-FP-NEXT:    pop {r7, pc}2093  %r = call bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b)2094  ret bfloat %r2095}2096 2097define bfloat @test_copysign(bfloat %a, bfloat %b) {2098;2099; CHECK-NOFP-LABEL: test_copysign:2100; CHECK-NOFP:       @ %bb.0:2101; CHECK-NOFP-NEXT:    lsrs r1, r1, #152102; CHECK-NOFP-NEXT:    bfi r0, r1, #15, #172103; CHECK-NOFP-NEXT:    bx lr2104;2105; CHECK-FP-LABEL: test_copysign:2106; CHECK-FP:       @ %bb.0:2107; CHECK-FP-NEXT:    vmov r0, s02108; CHECK-FP-NEXT:    vmov r1, s12109; CHECK-FP-NEXT:    and r1, r1, #327682110; CHECK-FP-NEXT:    bfc r0, #15, #172111; CHECK-FP-NEXT:    add r0, r12112; CHECK-FP-NEXT:    vmov.f16 s0, r02113; CHECK-FP-NEXT:    vmov.f16 r0, s02114; CHECK-FP-NEXT:    vmov s0, r02115; CHECK-FP-NEXT:    bx lr2116  %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)2117  ret bfloat %r2118}2119 2120define bfloat @test_copysign_f32(bfloat %a, float %b) {2121;2122; CHECK-NOFP-LABEL: test_copysign_f32:2123; CHECK-NOFP:       @ %bb.0:2124; CHECK-NOFP-NEXT:    and r1, r1, #-21474836482125; CHECK-NOFP-NEXT:    bfc r0, #15, #172126; CHECK-NOFP-NEXT:    orr.w r0, r0, r1, lsr #162127; CHECK-NOFP-NEXT:    bx lr2128;2129; CHECK-FP-LABEL: test_copysign_f32:2130; CHECK-FP:       @ %bb.0:2131; CHECK-FP-NEXT:    vmov r0, s02132; CHECK-FP-NEXT:    vmov r1, s12133; CHECK-FP-NEXT:    and r1, r1, #-21474836482134; CHECK-FP-NEXT:    bfc r0, #15, #172135; CHECK-FP-NEXT:    orr.w r0, r0, r1, lsr #162136; CHECK-FP-NEXT:    vmov.f16 s0, r02137; CHECK-FP-NEXT:    vmov.f16 r0, s02138; CHECK-FP-NEXT:    vmov s0, r02139; CHECK-FP-NEXT:    bx lr2140  %tb = fptrunc float %b to bfloat2141  %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)2142  ret bfloat %r2143}2144 2145define bfloat @test_copysign_f64(bfloat %a, double %b) {2146;2147; CHECK-NOFP-LABEL: test_copysign_f64:2148; CHECK-NOFP:       @ %bb.0:2149; CHECK-NOFP-NEXT:    and r1, r3, #-21474836482150; CHECK-NOFP-NEXT:    bfc r0, #15, #172151; CHECK-NOFP-NEXT:    orr.w r0, r0, r1, lsr #162152; CHECK-NOFP-NEXT:    bx lr2153;2154; CHECK-FP-LABEL: test_copysign_f64:2155; CHECK-FP:       @ %bb.0:2156; CHECK-FP-NEXT:    vmov r0, s02157; CHECK-FP-NEXT:    vmov r1, r2, d12158; CHECK-FP-NEXT:    and r1, r2, #-21474836482159; CHECK-FP-NEXT:    bfc r0, #15, #172160; CHECK-FP-NEXT:    orr.w r0, r0, r1, lsr #162161; CHECK-FP-NEXT:    vmov.f16 s0, r02162; CHECK-FP-NEXT:    vmov.f16 r0, s02163; CHECK-FP-NEXT:    vmov s0, r02164; CHECK-FP-NEXT:    bx lr2165  %tb = fptrunc double %b to bfloat2166  %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)2167  ret bfloat %r2168}2169 2170; away the (fpext (fp_round <result>)) here.2171 2172define float @test_copysign_extended(bfloat %a, bfloat %b) {2173;2174; CHECK-NOFP-LABEL: test_copysign_extended:2175; CHECK-NOFP:       @ %bb.0:2176; CHECK-NOFP-NEXT:    lsrs r1, r1, #152177; CHECK-NOFP-NEXT:    bfi r0, r1, #15, #172178; CHECK-NOFP-NEXT:    lsls r0, r0, #162179; CHECK-NOFP-NEXT:    bx lr2180;2181; CHECK-FP-LABEL: test_copysign_extended:2182; CHECK-FP:       @ %bb.0:2183; CHECK-FP-NEXT:    vmov r0, s02184; CHECK-FP-NEXT:    vmov r1, s12185; CHECK-FP-NEXT:    and r1, r1, #327682186; CHECK-FP-NEXT:    bfc r0, #15, #172187; CHECK-FP-NEXT:    add r0, r12188; CHECK-FP-NEXT:    lsls r0, r0, #162189; CHECK-FP-NEXT:    vmov s0, r02190; CHECK-FP-NEXT:    bx lr2191  %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)2192  %xr = fpext bfloat %r to float2193  ret float %xr2194}2195 2196define bfloat @test_floor(bfloat %a) {2197;2198; CHECK-NOFP-LABEL: test_floor:2199; CHECK-NOFP:       @ %bb.0:2200; CHECK-NOFP-NEXT:    .save {r7, lr}2201; CHECK-NOFP-NEXT:    push {r7, lr}2202; CHECK-NOFP-NEXT:    lsls r0, r0, #162203; CHECK-NOFP-NEXT:    bl floorf2204; CHECK-NOFP-NEXT:    bl __truncsfbf22205; CHECK-NOFP-NEXT:    pop {r7, pc}2206;2207; CHECK-FP-LABEL: test_floor:2208; CHECK-FP:       @ %bb.0:2209; CHECK-FP-NEXT:    .save {r7, lr}2210; CHECK-FP-NEXT:    push {r7, lr}2211; CHECK-FP-NEXT:    vmov r0, s02212; CHECK-FP-NEXT:    lsls r0, r0, #162213; CHECK-FP-NEXT:    vmov s0, r02214; CHECK-FP-NEXT:    vrintm.f32 s0, s02215; CHECK-FP-NEXT:    bl __truncsfbf22216; CHECK-FP-NEXT:    vmov.f16 r0, s02217; CHECK-FP-NEXT:    vmov s0, r02218; CHECK-FP-NEXT:    pop {r7, pc}2219  %r = call bfloat @llvm.floor.f16(bfloat %a)2220  ret bfloat %r2221}2222 2223define bfloat @test_ceil(bfloat %a) {2224;2225; CHECK-NOFP-LABEL: test_ceil:2226; CHECK-NOFP:       @ %bb.0:2227; CHECK-NOFP-NEXT:    .save {r7, lr}2228; CHECK-NOFP-NEXT:    push {r7, lr}2229; CHECK-NOFP-NEXT:    lsls r0, r0, #162230; CHECK-NOFP-NEXT:    bl ceilf2231; CHECK-NOFP-NEXT:    bl __truncsfbf22232; CHECK-NOFP-NEXT:    pop {r7, pc}2233;2234; CHECK-FP-LABEL: test_ceil:2235; CHECK-FP:       @ %bb.0:2236; CHECK-FP-NEXT:    .save {r7, lr}2237; CHECK-FP-NEXT:    push {r7, lr}2238; CHECK-FP-NEXT:    vmov r0, s02239; CHECK-FP-NEXT:    lsls r0, r0, #162240; CHECK-FP-NEXT:    vmov s0, r02241; CHECK-FP-NEXT:    vrintp.f32 s0, s02242; CHECK-FP-NEXT:    bl __truncsfbf22243; CHECK-FP-NEXT:    vmov.f16 r0, s02244; CHECK-FP-NEXT:    vmov s0, r02245; CHECK-FP-NEXT:    pop {r7, pc}2246  %r = call bfloat @llvm.ceil.f16(bfloat %a)2247  ret bfloat %r2248}2249 2250define bfloat @test_trunc(bfloat %a) {2251;2252; CHECK-NOFP-LABEL: test_trunc:2253; CHECK-NOFP:       @ %bb.0:2254; CHECK-NOFP-NEXT:    .save {r7, lr}2255; CHECK-NOFP-NEXT:    push {r7, lr}2256; CHECK-NOFP-NEXT:    lsls r0, r0, #162257; CHECK-NOFP-NEXT:    bl truncf2258; CHECK-NOFP-NEXT:    bl __truncsfbf22259; CHECK-NOFP-NEXT:    pop {r7, pc}2260;2261; CHECK-FP-LABEL: test_trunc:2262; CHECK-FP:       @ %bb.0:2263; CHECK-FP-NEXT:    .save {r7, lr}2264; CHECK-FP-NEXT:    push {r7, lr}2265; CHECK-FP-NEXT:    vmov r0, s02266; CHECK-FP-NEXT:    lsls r0, r0, #162267; CHECK-FP-NEXT:    vmov s0, r02268; CHECK-FP-NEXT:    vrintz.f32 s0, s02269; CHECK-FP-NEXT:    bl __truncsfbf22270; CHECK-FP-NEXT:    vmov.f16 r0, s02271; CHECK-FP-NEXT:    vmov s0, r02272; CHECK-FP-NEXT:    pop {r7, pc}2273  %r = call bfloat @llvm.trunc.f16(bfloat %a)2274  ret bfloat %r2275}2276 2277define bfloat @test_rint(bfloat %a) {2278;2279; CHECK-NOFP-LABEL: test_rint:2280; CHECK-NOFP:       @ %bb.0:2281; CHECK-NOFP-NEXT:    .save {r7, lr}2282; CHECK-NOFP-NEXT:    push {r7, lr}2283; CHECK-NOFP-NEXT:    lsls r0, r0, #162284; CHECK-NOFP-NEXT:    bl rintf2285; CHECK-NOFP-NEXT:    bl __truncsfbf22286; CHECK-NOFP-NEXT:    pop {r7, pc}2287;2288; CHECK-FP-LABEL: test_rint:2289; CHECK-FP:       @ %bb.0:2290; CHECK-FP-NEXT:    .save {r7, lr}2291; CHECK-FP-NEXT:    push {r7, lr}2292; CHECK-FP-NEXT:    vmov r0, s02293; CHECK-FP-NEXT:    lsls r0, r0, #162294; CHECK-FP-NEXT:    vmov s0, r02295; CHECK-FP-NEXT:    vrintx.f32 s0, s02296; CHECK-FP-NEXT:    bl __truncsfbf22297; CHECK-FP-NEXT:    vmov.f16 r0, s02298; CHECK-FP-NEXT:    vmov s0, r02299; CHECK-FP-NEXT:    pop {r7, pc}2300  %r = call bfloat @llvm.rint.f16(bfloat %a)2301  ret bfloat %r2302}2303 2304define bfloat @test_nearbyint(bfloat %a) {2305;2306; CHECK-NOFP-LABEL: test_nearbyint:2307; CHECK-NOFP:       @ %bb.0:2308; CHECK-NOFP-NEXT:    .save {r7, lr}2309; CHECK-NOFP-NEXT:    push {r7, lr}2310; CHECK-NOFP-NEXT:    lsls r0, r0, #162311; CHECK-NOFP-NEXT:    bl nearbyintf2312; CHECK-NOFP-NEXT:    bl __truncsfbf22313; CHECK-NOFP-NEXT:    pop {r7, pc}2314;2315; CHECK-FP-LABEL: test_nearbyint:2316; CHECK-FP:       @ %bb.0:2317; CHECK-FP-NEXT:    .save {r7, lr}2318; CHECK-FP-NEXT:    push {r7, lr}2319; CHECK-FP-NEXT:    vmov r0, s02320; CHECK-FP-NEXT:    lsls r0, r0, #162321; CHECK-FP-NEXT:    vmov s0, r02322; CHECK-FP-NEXT:    vrintr.f32 s0, s02323; CHECK-FP-NEXT:    bl __truncsfbf22324; CHECK-FP-NEXT:    vmov.f16 r0, s02325; CHECK-FP-NEXT:    vmov s0, r02326; CHECK-FP-NEXT:    pop {r7, pc}2327  %r = call bfloat @llvm.nearbyint.f16(bfloat %a)2328  ret bfloat %r2329}2330 2331define bfloat @test_round(bfloat %a) {2332;2333; CHECK-NOFP-LABEL: test_round:2334; CHECK-NOFP:       @ %bb.0:2335; CHECK-NOFP-NEXT:    .save {r7, lr}2336; CHECK-NOFP-NEXT:    push {r7, lr}2337; CHECK-NOFP-NEXT:    lsls r0, r0, #162338; CHECK-NOFP-NEXT:    bl roundf2339; CHECK-NOFP-NEXT:    bl __truncsfbf22340; CHECK-NOFP-NEXT:    pop {r7, pc}2341;2342; CHECK-FP-LABEL: test_round:2343; CHECK-FP:       @ %bb.0:2344; CHECK-FP-NEXT:    .save {r7, lr}2345; CHECK-FP-NEXT:    push {r7, lr}2346; CHECK-FP-NEXT:    vmov r0, s02347; CHECK-FP-NEXT:    lsls r0, r0, #162348; CHECK-FP-NEXT:    vmov s0, r02349; CHECK-FP-NEXT:    vrinta.f32 s0, s02350; CHECK-FP-NEXT:    bl __truncsfbf22351; CHECK-FP-NEXT:    vmov.f16 r0, s02352; CHECK-FP-NEXT:    vmov s0, r02353; CHECK-FP-NEXT:    pop {r7, pc}2354  %r = call bfloat @llvm.round.f16(bfloat %a)2355  ret bfloat %r2356}2357 2358define bfloat @test_roundeven(bfloat %a) {2359;2360; CHECK-NOFP-LABEL: test_roundeven:2361; CHECK-NOFP:       @ %bb.0:2362; CHECK-NOFP-NEXT:    .save {r7, lr}2363; CHECK-NOFP-NEXT:    push {r7, lr}2364; CHECK-NOFP-NEXT:    lsls r0, r0, #162365; CHECK-NOFP-NEXT:    bl roundevenf2366; CHECK-NOFP-NEXT:    bl __truncsfbf22367; CHECK-NOFP-NEXT:    pop {r7, pc}2368;2369; CHECK-FP-LABEL: test_roundeven:2370; CHECK-FP:       @ %bb.0:2371; CHECK-FP-NEXT:    .save {r7, lr}2372; CHECK-FP-NEXT:    push {r7, lr}2373; CHECK-FP-NEXT:    vmov r0, s02374; CHECK-FP-NEXT:    lsls r0, r0, #162375; CHECK-FP-NEXT:    vmov s0, r02376; CHECK-FP-NEXT:    vrintn.f32 s0, s02377; CHECK-FP-NEXT:    bl __truncsfbf22378; CHECK-FP-NEXT:    vmov.f16 r0, s02379; CHECK-FP-NEXT:    vmov s0, r02380; CHECK-FP-NEXT:    pop {r7, pc}2381  %r = call bfloat @llvm.roundeven.f16(bfloat %a)2382  ret bfloat %r2383}2384 2385define bfloat @test_fmuladd(bfloat %a, bfloat %b, bfloat %c) {2386;2387; CHECK-NOFP-LABEL: test_fmuladd:2388; CHECK-NOFP:       @ %bb.0:2389; CHECK-NOFP-NEXT:    .save {r4, lr}2390; CHECK-NOFP-NEXT:    push {r4, lr}2391; CHECK-NOFP-NEXT:    lsls r0, r0, #162392; CHECK-NOFP-NEXT:    lsls r1, r1, #162393; CHECK-NOFP-NEXT:    mov r4, r22394; CHECK-NOFP-NEXT:    bl __aeabi_fmul2395; CHECK-NOFP-NEXT:    bl __truncsfbf22396; CHECK-NOFP-NEXT:    lsls r0, r0, #162397; CHECK-NOFP-NEXT:    lsls r1, r4, #162398; CHECK-NOFP-NEXT:    bl __aeabi_fadd2399; CHECK-NOFP-NEXT:    bl __truncsfbf22400; CHECK-NOFP-NEXT:    pop {r4, pc}2401;2402; CHECK-FP-LABEL: test_fmuladd:2403; CHECK-FP:       @ %bb.0:2404; CHECK-FP-NEXT:    .save {r7, lr}2405; CHECK-FP-NEXT:    push {r7, lr}2406; CHECK-FP-NEXT:    .vsave {d8}2407; CHECK-FP-NEXT:    vpush {d8}2408; CHECK-FP-NEXT:    vmov r0, s12409; CHECK-FP-NEXT:    vmov r1, s02410; CHECK-FP-NEXT:    vmov.f32 s16, s22411; CHECK-FP-NEXT:    lsls r0, r0, #162412; CHECK-FP-NEXT:    vmov s0, r02413; CHECK-FP-NEXT:    lsls r0, r1, #162414; CHECK-FP-NEXT:    vmov s2, r02415; CHECK-FP-NEXT:    vmul.f32 s0, s2, s02416; CHECK-FP-NEXT:    bl __truncsfbf22417; CHECK-FP-NEXT:    vmov r0, s162418; CHECK-FP-NEXT:    vmov r1, s02419; CHECK-FP-NEXT:    lsls r0, r0, #162420; CHECK-FP-NEXT:    vmov s0, r02421; CHECK-FP-NEXT:    lsls r0, r1, #162422; CHECK-FP-NEXT:    vmov s2, r02423; CHECK-FP-NEXT:    vadd.f32 s0, s2, s02424; CHECK-FP-NEXT:    bl __truncsfbf22425; CHECK-FP-NEXT:    vmov.f16 r0, s02426; CHECK-FP-NEXT:    vmov s0, r02427; CHECK-FP-NEXT:    vpop {d8}2428; CHECK-FP-NEXT:    pop {r7, pc}2429  %r = call bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c)2430  ret bfloat %r2431}2432