[llvm] e87fb92 - [NFC][LLVM][AArch64] Add test coverage for scalar bfloat constrained intrinsics. (#222076)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 02:58:52 PDT 2026


Author: Paul Walker
Date: 2026-09-09T10:58:47+01:00
New Revision: e87fb92a9719c1f1f0112e108f9444bb5b99ac49

URL: https://github.com/llvm/llvm-project/commit/e87fb92a9719c1f1f0112e108f9444bb5b99ac49
DIFF: https://github.com/llvm/llvm-project/commit/e87fb92a9719c1f1f0112e108f9444bb5b99ac49.diff

LOG: [NFC][LLVM][AArch64] Add test coverage for scalar bfloat constrained intrinsics. (#222076)

Tests are a clone of fp-intrinsics-fp16.ll with s/half/bfloat/ applied
and failing tests (fcmp and i128 variants) removed.

Added: 
    llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll b/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll
new file mode 100644
index 0000000000000..c17670391483f
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll
@@ -0,0 +1,1544 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOBF16
+; RUN: llc -mtriple=aarch64 -mattr=+bf16 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-BF16
+
+; Check that constrained fp intrinsics are correctly lowered.
+
+; Half-precision intrinsics
+
+define bfloat @add_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: add_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fadd s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: add_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fadd s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fadd.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @sub_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: sub_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fsub s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sub_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fsub s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fsub.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @mul_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: mul_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fmul s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: mul_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fmul s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fmul.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @div_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: div_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fdiv s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: div_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fdiv s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fdiv.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @frem_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: frem_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-NOBF16-NEXT:    bl fmodf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: frem_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-NEXT:    bl fmodf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.frem.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @fma_bf16(bfloat %x, bfloat %y, bfloat %z) #0 {
+; CHECK-NOBF16-LABEL: fma_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h2 killed $h2 def $d2
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w10, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v2.4s, v2.4h, #16
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fmadd s0, s0, s1, s2
+; CHECK-NOBF16-NEXT:    fmov w8, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-NOBF16-NEXT:    add w10, w8, w10
+; CHECK-NOBF16-NEXT:    orr w8, w8, #0x400000
+; CHECK-NOBF16-NEXT:    add w9, w9, w10
+; CHECK-NOBF16-NEXT:    csel w8, w8, w9, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: fma_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h2 killed $h2 def $d2
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v2.4s, v2.4h, #16
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fmadd s0, s0, s1, s2
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fma.bf16(bfloat %x, bfloat %y, bfloat %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define i32 @fptosi_i32_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fptosi_i32_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtzs w0, s0
+; CHECK-NEXT:    ret
+  %val = call i32 @llvm.experimental.constrained.fptosi.i32.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i32 %val
+}
+
+define i32 @fptoui_i32_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fptoui_i32_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtzu w0, s0
+; CHECK-NEXT:    ret
+  %val = call i32 @llvm.experimental.constrained.fptoui.i32.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i32 %val
+}
+
+define i64 @fptosi_i64_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fptosi_i64_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtzs x0, s0
+; CHECK-NEXT:    ret
+  %val = call i64 @llvm.experimental.constrained.fptosi.i64.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i64 %val
+}
+
+define i64 @fptoui_i64_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fptoui_i64_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtzu x0, s0
+; CHECK-NEXT:    ret
+  %val = call i64 @llvm.experimental.constrained.fptoui.i64.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i64 %val
+}
+
+define bfloat @sitofp_bf16_i32(i32 %x) #0 {
+; CHECK-NOBF16-LABEL: sitofp_bf16_i32:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    scvtf d0, w0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcvtxn s0, d0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sitofp_bf16_i32:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    scvtf d0, w0
+; CHECK-BF16-NEXT:    fcvtxn s0, d0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.sitofp.bf16.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @uitofp_bf16_i32(i32 %x) #0 {
+; CHECK-NOBF16-LABEL: uitofp_bf16_i32:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    ucvtf d0, w0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcvtxn s0, d0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: uitofp_bf16_i32:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    ucvtf d0, w0
+; CHECK-BF16-NEXT:    fcvtxn s0, d0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.uitofp.bf16.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @sitofp_bf16_i64(i64 %x) #0 {
+; CHECK-NOBF16-LABEL: sitofp_bf16_i64:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    cmp x0, #0
+; CHECK-NOBF16-NEXT:    and x11, x0, #0x8000000000000000
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    cneg x9, x0, mi
+; CHECK-NOBF16-NEXT:    lsr x10, x9, #53
+; CHECK-NOBF16-NEXT:    cmp x10, #0
+; CHECK-NOBF16-NEXT:    and x10, x9, #0xfffffffffffff000
+; CHECK-NOBF16-NEXT:    csel x10, x10, x9, ne
+; CHECK-NOBF16-NEXT:    scvtf d0, x10
+; CHECK-NOBF16-NEXT:    cset w10, ne
+; CHECK-NOBF16-NEXT:    tst x9, #0xfff
+; CHECK-NOBF16-NEXT:    csel w10, wzr, w10, eq
+; CHECK-NOBF16-NEXT:    fmov x9, d0
+; CHECK-NOBF16-NEXT:    orr x9, x9, x11
+; CHECK-NOBF16-NEXT:    orr x9, x9, x10
+; CHECK-NOBF16-NEXT:    fmov d0, x9
+; CHECK-NOBF16-NEXT:    fcvtxn s0, d0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sitofp_bf16_i64:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    cmp x0, #0
+; CHECK-BF16-NEXT:    cneg x8, x0, mi
+; CHECK-BF16-NEXT:    lsr x9, x8, #53
+; CHECK-BF16-NEXT:    and x10, x8, #0xfffffffffffff000
+; CHECK-BF16-NEXT:    cmp x9, #0
+; CHECK-BF16-NEXT:    csel x9, x10, x8, ne
+; CHECK-BF16-NEXT:    and x10, x0, #0x8000000000000000
+; CHECK-BF16-NEXT:    cset w11, ne
+; CHECK-BF16-NEXT:    scvtf d0, x9
+; CHECK-BF16-NEXT:    tst x8, #0xfff
+; CHECK-BF16-NEXT:    fmov x9, d0
+; CHECK-BF16-NEXT:    orr x8, x9, x10
+; CHECK-BF16-NEXT:    csel w9, wzr, w11, eq
+; CHECK-BF16-NEXT:    orr x8, x8, x9
+; CHECK-BF16-NEXT:    fmov d0, x8
+; CHECK-BF16-NEXT:    fcvtxn s0, d0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.sitofp.bf16.i64(i64 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @uitofp_bf16_i64(i64 %x) #0 {
+; CHECK-NOBF16-LABEL: uitofp_bf16_i64:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    lsr x9, x0, #53
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    cmp x9, #0
+; CHECK-NOBF16-NEXT:    and x9, x0, #0xfffffffffffff000
+; CHECK-NOBF16-NEXT:    csel x9, x9, x0, ne
+; CHECK-NOBF16-NEXT:    ucvtf d0, x9
+; CHECK-NOBF16-NEXT:    cset w9, ne
+; CHECK-NOBF16-NEXT:    tst x0, #0xfff
+; CHECK-NOBF16-NEXT:    csel w9, wzr, w9, eq
+; CHECK-NOBF16-NEXT:    fmov x10, d0
+; CHECK-NOBF16-NEXT:    orr x9, x10, x9
+; CHECK-NOBF16-NEXT:    fmov d0, x9
+; CHECK-NOBF16-NEXT:    fcvtxn s0, d0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: uitofp_bf16_i64:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    lsr x8, x0, #53
+; CHECK-BF16-NEXT:    and x9, x0, #0xfffffffffffff000
+; CHECK-BF16-NEXT:    cmp x8, #0
+; CHECK-BF16-NEXT:    csel x8, x9, x0, ne
+; CHECK-BF16-NEXT:    ucvtf d0, x8
+; CHECK-BF16-NEXT:    cset w8, ne
+; CHECK-BF16-NEXT:    tst x0, #0xfff
+; CHECK-BF16-NEXT:    csel w8, wzr, w8, eq
+; CHECK-BF16-NEXT:    fmov x9, d0
+; CHECK-BF16-NEXT:    orr x8, x9, x8
+; CHECK-BF16-NEXT:    fmov d0, x8
+; CHECK-BF16-NEXT:    fcvtxn s0, d0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.uitofp.bf16.i64(i64 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @sqrt_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: sqrt_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fsqrt s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sqrt_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fsqrt s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.sqrt.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @powi_bf16(bfloat %x, i32 %y) #0 {
+; CHECK-NOBF16-LABEL: powi_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl __powisf2
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: powi_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl __powisf2
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.powi.bf16(bfloat %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @sin_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: sin_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl sinf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sin_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl sinf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.sin.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @cos_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: cos_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl cosf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: cos_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl cosf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.cos.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @tan_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: tan_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl tanf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: tan_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl tanf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.tan.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @asin_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: asin_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl asinf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: asin_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl asinf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.asin.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @acos_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: acos_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl acosf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: acos_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl acosf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.acos.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @atan_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: atan_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl atanf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: atan_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl atanf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.atan.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @atan2_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: atan2_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-NOBF16-NEXT:    bl atan2f
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: atan2_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-NEXT:    bl atan2f
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.atan2.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @sinh_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: sinh_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl sinhf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: sinh_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl sinhf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.sinh.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @cosh_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: cosh_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl coshf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: cosh_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl coshf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.cosh.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @tanh_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: tanh_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl tanhf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: tanh_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl tanhf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.tanh.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @pow_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: pow_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-NOBF16-NEXT:    bl powf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: pow_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-NEXT:    bl powf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.pow.bf16(bfloat %x, bfloat %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @log_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: log_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl logf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: log_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl logf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.log.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @log10_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: log10_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl log10f
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: log10_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl log10f
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.log10.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @log2_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: log2_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl log2f
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: log2_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl log2f
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.log2.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @exp_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: exp_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl expf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: exp_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl expf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.exp.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @exp2_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: exp2_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl exp2f
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: exp2_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl exp2f
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.exp2.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @rint_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: rint_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frintx s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: rint_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frintx s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.rint.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @nearbyint_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: nearbyint_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frinti s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: nearbyint_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frinti s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.nearbyint.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define i32 @lrint_bf16(bfloat %x) #0 {
+; CHECK-LABEL: lrint_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    frintx s0, s0
+; CHECK-NEXT:    fcvtzs w0, s0
+; CHECK-NEXT:    ret
+  %val = call i32 @llvm.experimental.constrained.lrint.i32.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret i32 %val
+}
+
+define i64 @llrint_bf16(bfloat %x) #0 {
+; CHECK-LABEL: llrint_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    frintx s0, s0
+; CHECK-NEXT:    fcvtzs x0, s0
+; CHECK-NEXT:    ret
+  %val = call i64 @llvm.experimental.constrained.llrint.i64.bf16(bfloat %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret i64 %val
+}
+
+define bfloat @maxnum_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: maxnum_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fmaxnm s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: maxnum_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fmaxnm s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.maxnum.bf16(bfloat %x, bfloat %y, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @minnum_bf16(bfloat %x, bfloat %y) #0 {
+; CHECK-NOBF16-LABEL: minnum_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    fminnm s0, s0, s1
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: minnum_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    fminnm s0, s0, s1
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.minnum.bf16(bfloat %x, bfloat %y, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @ceil_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: ceil_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frintp s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: ceil_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frintp s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.ceil.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @floor_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: floor_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frintm s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: floor_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frintm s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.floor.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define i32 @lround_bf16(bfloat %x) #0 {
+; CHECK-LABEL: lround_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtas w0, s0
+; CHECK-NEXT:    ret
+  %val = call i32 @llvm.experimental.constrained.lround.i32.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i32 %val
+}
+
+define i64 @llround_bf16(bfloat %x) #0 {
+; CHECK-LABEL: llround_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvtas x0, s0
+; CHECK-NEXT:    ret
+  %val = call i64 @llvm.experimental.constrained.llround.i64.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret i64 %val
+}
+
+define bfloat @round_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: round_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frinta s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: round_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frinta s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.round.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @roundeven_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: roundeven_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frintn s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: roundeven_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frintn s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.roundeven.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @trunc_bf16(bfloat %x) #0 {
+; CHECK-NOBF16-LABEL: trunc_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    frintz s0, s0
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: trunc_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    frintz s0, s0
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.trunc.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define bfloat @ldexp_bf16(bfloat %x, i32 %y) #0 {
+; CHECK-NOBF16-LABEL: ldexp_bf16:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NOBF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NOBF16-NEXT:    .cfi_offset w30, -16
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NOBF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NOBF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NOBF16-NEXT:    bl ldexpf
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: ldexp_bf16:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-BF16-NEXT:    .cfi_offset w30, -16
+; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-NEXT:    bl ldexpf
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.ldexp.bf16.i32(bfloat %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+; Intrinsics to convert between floating-point types
+
+define bfloat @fptrunc_bf16_f32(float %x) #0 {
+; CHECK-NOBF16-LABEL: fptrunc_bf16_f32:
+; CHECK-NOBF16:       // %bb.0:
+; CHECK-NOBF16-NEXT:    fmov w9, s0
+; CHECK-NOBF16-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-NOBF16-NEXT:    fcmp s0, s0
+; CHECK-NOBF16-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-NOBF16-NEXT:    add w8, w9, w8
+; CHECK-NOBF16-NEXT:    orr w9, w9, #0x400000
+; CHECK-NOBF16-NEXT:    add w8, w10, w8
+; CHECK-NOBF16-NEXT:    csel w8, w9, w8, vs
+; CHECK-NOBF16-NEXT:    lsr w8, w8, #16
+; CHECK-NOBF16-NEXT:    fmov s0, w8
+; CHECK-NOBF16-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-NOBF16-NEXT:    ret
+;
+; CHECK-BF16-LABEL: fptrunc_bf16_f32:
+; CHECK-BF16:       // %bb.0:
+; CHECK-BF16-NEXT:    bfcvt h0, s0
+; CHECK-BF16-NEXT:    ret
+  %val = call bfloat @llvm.experimental.constrained.fptrunc.bf16.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
+  ret bfloat %val
+}
+
+define float @fpext_f32_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fpext_f32_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-NEXT:    ret
+  %val = call float @llvm.experimental.constrained.fpext.f32.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret float %val
+}
+
+attributes #0 = { strictfp }


        


More information about the llvm-commits mailing list