[llvm] 4662e71 - [AArch64][GlobalISel] BF16 libcalls operations. (#200740)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 9 06:52:16 PDT 2026


Author: David Green
Date: 2026-06-09T14:52:09+01:00
New Revision: 4662e7136d02accfeb11f5255eb1bcae10cff7ed

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

LOG: [AArch64][GlobalISel] BF16 libcalls operations. (#200740)

This fills in a number of bf16 instructions that lower through f32
libcall.

Added: 
    

Modified: 
    llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
    llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
    llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
    llvm/test/CodeGen/AArch64/bf16-instructions.ll
    llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
    llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
    llvm/test/CodeGen/AArch64/ldexp.ll

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
index 1d6a6cfb15a50..92ecd74f68482 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
@@ -854,6 +854,12 @@ class LegalizeRuleSet {
     markAllIdxsAsCovered();
     return actionIf(LegalizeAction::WidenScalar, Predicate, Mutation);
   }
+  /// Widen the scalar, specified in mutation, when type index 0 is any type in
+  /// the given list.
+  LegalizeRuleSet &widenScalarFor(std::initializer_list<LLT> Types,
+                                  LegalizeMutation Mutation) {
+    return actionFor(LegalizeAction::WidenScalar, Types, Mutation);
+  }
   /// Widen the scalar, specified in mutation, when type indexes 0 and 1 is any
   /// type pair in the given list.
   LegalizeRuleSet &

diff  --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 78c2268aac986..c0756ab66cb49 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -477,24 +477,17 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
       .moreElementsToNextPow2(0)
       .lowerFor({f16, bf16, v4f16, v4bf16, v8f16, v8bf16});
 
-  getActionDefinitionsBuilder(G_FREM)
-      .libcallFor({f32, f64, f128})
-      .minScalar(0, f32)
-      .scalarize(0);
-
-  getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FPOW, G_FLOG, G_FLOG2,
+  getActionDefinitionsBuilder({G_FREM, G_FCOS, G_FSIN, G_FPOW, G_FLOG, G_FLOG2,
                                G_FLOG10, G_FTAN, G_FEXP, G_FEXP2, G_FEXP10,
                                G_FACOS, G_FASIN, G_FATAN, G_FATAN2, G_FCOSH,
                                G_FSINH, G_FTANH, G_FMODF})
-      // We need a call for these, so we always need to scalarize.
-      .scalarize(0)
-      // Regardless of FP16 support, widen 16-bit elements to 32-bits.
-      .minScalar(0, f32)
-      .libcallFor({f32, f64, f128});
+      .libcallFor({f32, f64, f128})
+      .widenScalarFor({f16, bf16}, changeElementTo(0, f32))
+      .scalarize(0);
   getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})
-      .scalarize(0)
-      .minScalar(0, f32)
-      .libcallFor({{f32, i32}, {f64, i32}, {f128, i32}});
+      .libcallFor({{f32, i32}, {f64, i32}, {f128, i32}})
+      .widenScalarFor({f16, bf16}, changeElementTo(0, f32))
+      .scalarize(0);
 
   getActionDefinitionsBuilder({G_LROUND, G_INTRINSIC_LRINT})
       .legalFor({{i32, f32}, {i32, f64}, {i64, f32}, {i64, f64}})

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
index 6f04af9473073..c82627a1e8c8d 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
@@ -780,6 +780,7 @@
 # DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
 # DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
 # DEBUG-NEXT: G_FCOS (opcode {{[0-9]+}}): 1 type index, 0 imm indices
+# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
 # DEBUG-NEXT: .. the first uncovered type index: 1, OK
 # DEBUG-NEXT: .. the first uncovered imm index: 0, OK
 # DEBUG-NEXT: G_FSIN (opcode {{[0-9]+}}): 1 type index, 0 imm indices

diff  --git a/llvm/test/CodeGen/AArch64/bf16-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-instructions.ll
index 7e982d1142e8f..2ddfdeed09f85 100644
--- a/llvm/test/CodeGen/AArch64/bf16-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-instructions.ll
@@ -4,8 +4,7 @@
 ; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
 ; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
 
-; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
+; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_fptosi_i32
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i64
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptoui_i32
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptoui_i64
@@ -17,26 +16,8 @@
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sitofp_i32_fadd
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fpext_double
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fpext_double_fast
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
-;
-; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
+;
+; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_fptosi_i32
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i64
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptoui_i32
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptoui_i64
@@ -48,23 +29,7 @@
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sitofp_i32_fadd
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fpext_double
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fpext_double_fast
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
+;
 
 define bfloat @test_fadd(bfloat %a, bfloat %b) #0 {
 ; CHECK-CVT-SD-LABEL: test_fadd:
@@ -464,40 +429,78 @@ define bfloat @test_fdiv(bfloat %a, bfloat %b) #0 {
 }
 
 define bfloat @test_frem(bfloat %a, bfloat %b) #0 {
-; CHECK-CVT-LABEL: test_frem:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_frem:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_frem:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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
+; CHECK-BF16-SD-LABEL: test_frem:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_frem:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_frem:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ret
   %r = frem bfloat %a, %b
   ret bfloat %r
 }
@@ -2118,23 +2121,23 @@ define bfloat @test_sqrt(bfloat %a) #0 {
 }
 
 define bfloat @test_powi(bfloat %a, i32 %b) #0 {
-; CHECK-CVT-LABEL: test_powi:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_powi:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_powi:
 ; CHECK-BF16:       // %bb.0:
@@ -2146,28 +2149,49 @@ define bfloat @test_powi(bfloat %a, i32 %b) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_powi:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.powi.bf16.i32(bfloat %a, i32 %b)
   ret bfloat %r
 }
 
 define bfloat @test_sin(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_sin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_sin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_sin:
 ; CHECK-BF16:       // %bb.0:
@@ -2179,28 +2203,49 @@ define bfloat @test_sin(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.sin.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_cos(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_cos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_cos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_cos:
 ; CHECK-BF16:       // %bb.0:
@@ -2212,28 +2257,49 @@ define bfloat @test_cos(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.cos.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_tan(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_tan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_tan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_tan:
 ; CHECK-BF16:       // %bb.0:
@@ -2245,29 +2311,50 @@ define bfloat @test_tan(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.tan.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_acos(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_acos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
-;
+; CHECK-CVT-SD-LABEL: test_acos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
+;
 ; CHECK-BF16-LABEL: test_acos:
 ; CHECK-BF16:       // %bb.0:
 ; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
@@ -2278,28 +2365,49 @@ define bfloat @test_acos(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_acos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.acos.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_asin(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_asin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_asin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_asin:
 ; CHECK-BF16:       // %bb.0:
@@ -2311,28 +2419,49 @@ define bfloat @test_asin(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_asin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.asin.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_atan(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_atan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_atan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_atan:
 ; CHECK-BF16:       // %bb.0:
@@ -2344,67 +2473,126 @@ define bfloat @test_atan(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.atan.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_atan2(bfloat %a, bfloat %b) #0 {
-; CHECK-CVT-LABEL: test_atan2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_atan2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_atan2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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
+; CHECK-BF16-SD-LABEL: test_atan2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_atan2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ret
   %r = call bfloat @llvm.atan2.bf16(bfloat %a, bfloat %b)
   ret bfloat %r
 }
 
 define bfloat @test_cosh(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_cosh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_cosh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_cosh:
 ; CHECK-BF16:       // %bb.0:
@@ -2416,28 +2604,49 @@ define bfloat @test_cosh(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cosh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.cosh.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_sinh(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_sinh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_sinh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_sinh:
 ; CHECK-BF16:       // %bb.0:
@@ -2449,28 +2658,49 @@ define bfloat @test_sinh(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sinh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.sinh.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_tanh(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_tanh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_tanh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_tanh:
 ; CHECK-BF16:       // %bb.0:
@@ -2482,67 +2712,126 @@ define bfloat @test_tanh(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tanh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.tanh.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_pow(bfloat %a, bfloat %b) #0 {
-; CHECK-CVT-LABEL: test_pow:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_pow:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_pow:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-BF16-NEXT:    // kill: def $h1 killed $h1 def $d1
-; CHECK-BF16-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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
+; CHECK-BF16-SD-LABEL: test_pow:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_pow:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_pow:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-BF16-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ret
   %r = call bfloat @llvm.pow.bf16(bfloat %a, bfloat %b)
   ret bfloat %r
 }
 
 define bfloat @test_exp(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_exp:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_exp:
 ; CHECK-BF16:       // %bb.0:
@@ -2554,28 +2843,49 @@ define bfloat @test_exp(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_exp:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.exp.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_exp2(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_exp2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_exp2:
 ; CHECK-BF16:       // %bb.0:
@@ -2587,28 +2897,49 @@ define bfloat @test_exp2(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_exp2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.exp2.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_log(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_log:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_log:
 ; CHECK-BF16:       // %bb.0:
@@ -2620,28 +2951,49 @@ define bfloat @test_log(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.log.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_log10(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_log10:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log10:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_log10:
 ; CHECK-BF16:       // %bb.0:
@@ -2653,28 +3005,49 @@ define bfloat @test_log10(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log10:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.log10.bf16(bfloat %a)
   ret bfloat %r
 }
 
 define bfloat @test_log2(bfloat %a) #0 {
-; CHECK-CVT-LABEL: test_log2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 def $d0
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w9, s0
-; CHECK-CVT-NEXT:    mov w8, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w10, w9, #16, #1
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    add w8, w10, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $h0 killed $h0 killed $s0
-; CHECK-CVT-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w9, s0
+; CHECK-CVT-SD-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    add w8, w10, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ret
 ;
 ; CHECK-BF16-LABEL: test_log2:
 ; CHECK-BF16:       // %bb.0:
@@ -2686,6 +3059,27 @@ define bfloat @test_log2(bfloat %a) #0 {
 ; CHECK-BF16-NEXT:    bfcvt h0, s0
 ; CHECK-BF16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
 ; CHECK-BF16-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    fmov w9, s0
+; CHECK-CVT-GI-NEXT:    mov w8, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w10, w9, #16, #1
+; CHECK-CVT-GI-NEXT:    add w8, w9, w8
+; CHECK-CVT-GI-NEXT:    orr w9, w9, #0x400000
+; CHECK-CVT-GI-NEXT:    add w8, w8, w10
+; CHECK-CVT-GI-NEXT:    csel w8, w9, w8, vs
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    fmov s0, w8
+; CHECK-CVT-GI-NEXT:    // kill: def $h0 killed $h0 killed $s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
   %r = call bfloat @llvm.log2.bf16(bfloat %a)
   ret bfloat %r
 }

diff  --git a/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
index 4a59baa315be4..6c6a9714f7deb 100644
--- a/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
@@ -4,8 +4,7 @@
 ; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
 ; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
 
-; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i8
+; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_fptosi_i8
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i16
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i64
@@ -21,26 +20,8 @@
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i16
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i32
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i64
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
-;
-; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i8
+;
+; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_fptosi_i8
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i16
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i64
@@ -56,23 +37,7 @@
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i16
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i32
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i64
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
+;
 
 define <4 x bfloat> @test_build(<4 x bfloat> %a) {
 ; CHECK-CVT-SD-LABEL: test_build:
@@ -442,134 +407,272 @@ define <4 x bfloat> @test_fdiv(<4 x bfloat> %a, <4 x bfloat> %b) {
 }
 
 define <4 x bfloat> @test_frem(<4 x bfloat> %a, <4 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_frem:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s2, w8
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[2]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v3.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[3]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    str q3, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_frem:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s2, w8
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[2]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v3.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[3]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_frem:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h2, s0
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v2.h[1], v3.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; 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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov h2, v2.h[3]
-; CHECK-BF16-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-BF16-NEXT:    str q3, [sp] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_frem:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h2, s0
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v2.h[1], v3.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov h2, v2.h[3]
+; CHECK-BF16-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_frem:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #-96]! // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #16] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #16] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp], #96 // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_frem:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #112
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[2]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[1]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #96] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #112
+; CHECK-BF16-GI-NEXT:    ret
   %r = frem <4 x bfloat> %a, %b
   ret <4 x bfloat> %r
 }
@@ -1793,1852 +1896,3786 @@ define <4 x bfloat> @test_sqrt(<4 x bfloat> %a) #0 {
 }
 
 define <4 x bfloat> @test_powi(<4 x bfloat> %a, i32 %b) #0 {
-; CHECK-CVT-LABEL: test_powi:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-CVT-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    mov w19, w0
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w20, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_powi:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    mov w19, w0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w20, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_powi:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-BF16-NEXT:    mov w19, w0
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    mov w0, w19
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl __powisf2
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl __powisf2
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_powi:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    mov w19, w0
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_powi:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-80]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #16] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x30, x23, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov w19, w0
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w20, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    fmov s1, w21
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #16] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w22
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w23
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x30, x23, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #80 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_powi:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #96
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #64] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    stp x30, x19, [sp, #80] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov w19, w0
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp x30, x19, [sp, #80] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #64] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #96
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.powi.v4bf16.v4i32(<4 x bfloat> %a, i32 %b)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_sin(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_sin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_sin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_sin:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl sinf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl sinf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_sin:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_sin:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.sin.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_cos(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_cos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_cos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_cos:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl cosf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl cosf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_cos:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_cos:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.cos.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_tan(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_tan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_tan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_tan:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl tanf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl tanf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_tan:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_tan:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.tan.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_acos(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_acos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_acos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_acos:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl acosf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl acosf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_acos:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_acos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_acos:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.acos.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_asin(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_asin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
-;
-; CHECK-BF16-LABEL: test_asin:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl asinf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl asinf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <4 x bfloat> @llvm.asin.v4bf16(<4 x bfloat> %a)
-  ret <4 x bfloat> %r
-}
-
-define <4 x bfloat> @test_atan(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_atan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
-;
-; CHECK-BF16-LABEL: test_atan:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl atanf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl atanf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_asin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_asin:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_asin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_asin:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <4 x bfloat> @llvm.asin.v4bf16(<4 x bfloat> %a)
+  ret <4 x bfloat> %r
+}
+
+define <4 x bfloat> @test_atan(<4 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_atan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_atan:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_atan:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.atan.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_atan2(<4 x bfloat> %a, <4 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_atan2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s2, w8
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[2]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v3.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[3]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    str q3, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_atan2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s2, w8
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[2]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v3.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[3]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_atan2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h2, s0
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v2.h[1], v3.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; 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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov h2, v2.h[3]
-; CHECK-BF16-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-BF16-NEXT:    str q3, [sp] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_atan2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h2, s0
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v2.h[1], v3.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov h2, v2.h[3]
+; CHECK-BF16-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #-96]! // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #16] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #16] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp], #96 // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_atan2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #112
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[2]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[1]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #96] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #112
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.atan2.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_cosh(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_cosh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_cosh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_cosh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl coshf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl coshf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_cosh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cosh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_cosh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.cosh.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_sinh(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_sinh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_sinh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_sinh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl sinhf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl sinhf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_sinh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sinh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_sinh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.sinh.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_tanh(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_tanh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_tanh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_tanh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl tanhf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl tanhf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_tanh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tanh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_tanh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.tanh.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_pow(<4 x bfloat> %a, <4 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_pow:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s2, w8
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[2]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v3.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h2, v0.h[3]
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    str q3, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_pow:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s2, w8
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[2]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v3.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldp q3, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h2, v0.h[3]
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_pow:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    // kill: def $d1 killed $d1 def $q1
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h2, s0
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v2.h[1], v3.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; 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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    ldr q3, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov h2, v2.h[3]
-; CHECK-BF16-NEXT:    mov v3.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-BF16-NEXT:    str q3, [sp] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_pow:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h2, s0
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v2.h[1], v3.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    ldr q3, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov h2, v2.h[3]
+; CHECK-BF16-SD-NEXT:    mov v3.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    str q3, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_pow:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #-96]! // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #16] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #16] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp], #96 // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_pow:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #112
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[2]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[1]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #96] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #112
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.pow.v4bf16(<4 x bfloat> %a, <4 x bfloat> %b)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_exp(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_exp:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_exp:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl expf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl expf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_exp:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_exp:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_exp:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.exp.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_exp2(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_exp2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_exp2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl exp2f
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl exp2f
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_exp2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_exp2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_exp2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.exp2.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_log(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl logf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl logf
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.log.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_log10(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log10:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log10:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log10:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl log10f
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl log10f
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log10:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log10:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log10:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.log10.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }
 
 define <4 x bfloat> @test_log2(<4 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-CVT-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-CVT-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 def $q0
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    mov v1.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    str q1, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl log2f
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    mov v2.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q2, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl log2f
-; CHECK-BF16-NEXT:    bfcvt h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[3], v1.h[0]
-; CHECK-BF16-NEXT:    // kill: def $d0 killed $d0 killed $q0
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    str q1, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    mov v2.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q2, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[3], v1.h[0]
+; CHECK-BF16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d10, [sp, #-64]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w8
+; CHECK-CVT-GI-NEXT:    fmov d0, d1
+; CHECK-CVT-GI-NEXT:    ldr d10, [sp], #64 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #80
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-GI-NEXT:    str d10, [sp, #48] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[2]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #72] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
+; CHECK-BF16-GI-NEXT:    add sp, sp, #80
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <4 x bfloat> @llvm.log2.v4bf16(<4 x bfloat> %a)
   ret <4 x bfloat> %r
 }

diff  --git a/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
index 65730ea6f0195..971d9e2a6e2b5 100644
--- a/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
@@ -5,8 +5,7 @@
 ; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
 ; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
 
-; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i8
+; CHECK-CVT-GI:       warning: Instruction selection used fallback path for test_fptosi_i8
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_v16i8
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i16
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
@@ -26,26 +25,8 @@
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i16
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i32
 ; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i64
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-CVT-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
-;
-; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_frem
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i8
+;
+; CHECK-BF16-GI:       warning: Instruction selection used fallback path for test_fptosi_i8
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_v16i8
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i16
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_fptosi_i32
@@ -65,23 +46,7 @@
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i16
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i32
 ; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_uitofp_i64
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_powi
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_acos
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_asin
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_atan2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_cosh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_sinh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_tanh
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_pow
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_exp2
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log10
-; CHECK-BF16-GI-NEXT:  warning: Instruction selection used fallback path for test_log2
+;
 
 define <8 x bfloat> @test_build(<8 x bfloat> %a) {
 ; CHECK-CVT-SD-LABEL: test_build:
@@ -731,244 +696,617 @@ define <8 x bfloat> @test_fdiv(<8 x bfloat> %a, <8 x bfloat> %b) {
 }
 
 define <8 x bfloat> @test_frem(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_frem:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    mov h1, v1.h[4]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    mov h1, v1.h[5]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    mov h1, v1.h[6]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    mov h1, v1.h[7]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl fmodf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_frem:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl fmodf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_frem:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl fmodf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    mov h1, v1.h[4]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    mov h1, v1.h[5]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    mov h1, v1.h[6]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    mov h1, v1.h[7]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_frem:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl fmodf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_frem:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16SVE-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl fmodf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_frem:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    sub sp, sp, #192
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-CVT-GI-NEXT:    stp d15, d14, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h15, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #8] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h14, v1.h[4]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #112] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #128] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #144] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #160] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #176] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #16] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #32] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #120] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v15.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #8] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #16] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #32] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #120] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl fmodf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #112] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #176] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    ldp d15, d14, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #160] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #144] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #128] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    add sp, sp, #192
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_frem:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #240
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d15, d14, [sp, #160] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h15, v0.h[1]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #176] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #192] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v1.h[1]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[2]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #208] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #64] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[4]
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #224] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #232] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #104] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #152] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #128] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v15.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #64] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldp d1, d0, [sp, #104] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #152] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #112] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #232] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl fmodf
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #128] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #208] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #224] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #192] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #176] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d15, d14, [sp, #160] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #64] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #112] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #240
+; CHECK-BF16-GI-NEXT:    ret
   %r = frem <8 x bfloat> %a, %b
   ret <8 x bfloat> %r
 }
@@ -3350,3460 +3688,8385 @@ define <8 x bfloat> @test_sqrt(<8 x bfloat> %a) #0 {
 }
 
 define <8 x bfloat> @test_powi(<8 x bfloat> %a, i32 %b) #0 {
-; CHECK-CVT-LABEL: test_powi:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-CVT-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    mov w19, w0
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w20, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov w0, w19
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl __powisf2
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w20
-; CHECK-CVT-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
-;
-; CHECK-BF16-LABEL: test_powi:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-BF16-NEXT:    mov w19, w0
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    mov w0, w19
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov w0, w19
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.powi.v8bf16.v8i32(<8 x bfloat> %a, i32 %b)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_sin(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_sin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
-;
-; CHECK-BF16-LABEL: test_sin:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.sin.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_cos(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_cos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl cosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_powi:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    mov w19, w0
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w20, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov w0, w19
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl __powisf2
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w20
+; CHECK-CVT-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_cos:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.cos.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_tan(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_tan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_powi:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    mov w19, w0
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov w0, w19
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl __powisf2
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_tan:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.tan.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_acos(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_acos:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl acosf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-BF16SVE-SD-LABEL: test_powi:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-BF16SVE-SD-NEXT:    mov w19, w0
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov w0, w19
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl __powisf2
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_acos:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.acos.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_asin(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_asin:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl asinf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-GI-LABEL: test_powi:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-144]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #16] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x30, x27, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #128] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov w19, w0
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w20, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w0, w19
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w27, w8, #16
+; CHECK-CVT-GI-NEXT:    bl __powisf2
+; CHECK-CVT-GI-NEXT:    fmov s1, w21
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w22
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w20
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #128] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w23
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w27
+; CHECK-CVT-GI-NEXT:    ldp x30, x27, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #144 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_asin:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.asin.v8bf16(<8 x bfloat> %a)
+; CHECK-BF16-GI-LABEL: test_powi:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #192
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #128] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #144] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #160] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    stp x30, x19, [sp, #176] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov w19, w0
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    mov w0, w19
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl __powisf2
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp x30, x19, [sp, #176] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #160] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #144] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #128] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #192
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.powi.v8bf16.v8i32(<8 x bfloat> %a, i32 %b)
   ret <8 x bfloat> %r
 }
 
-define <8 x bfloat> @test_atan(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_atan:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atanf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
-;
-; CHECK-BF16-LABEL: test_atan:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.atan.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
+define <8 x bfloat> @test_sin(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_sin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_sin:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_sin:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_sin:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.sin.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_cos(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_cos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl cosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_cos:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl cosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_cos:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl cosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl cosf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_cos:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl cosf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.cos.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_tan(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_tan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_tan:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_tan:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_tan:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.tan.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_acos(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_acos:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl acosf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_acos:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl acosf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_acos:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl acosf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_acos:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl acosf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_acos:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl acosf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.acos.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_asin(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_asin:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl asinf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_asin:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl asinf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_asin:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl asinf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_asin:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl asinf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_asin:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl asinf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.asin.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_atan(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_atan:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atanf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_atan:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atanf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_atan:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atanf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atanf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_atan:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atanf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.atan.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_atan2(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
+; CHECK-CVT-SD-LABEL: test_atan2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl atan2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_atan2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl atan2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_atan2:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16SVE-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl atan2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_atan2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    sub sp, sp, #192
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-CVT-GI-NEXT:    stp d15, d14, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h15, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #8] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h14, v1.h[4]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #112] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #128] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #144] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #160] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #176] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #16] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #32] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #120] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v15.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #8] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #16] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #32] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #120] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl atan2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #112] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #176] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    ldp d15, d14, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #160] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #144] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #128] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    add sp, sp, #192
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_atan2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #240
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d15, d14, [sp, #160] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h15, v0.h[1]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #176] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #192] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v1.h[1]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[2]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #208] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #64] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[4]
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #224] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #232] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #104] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #152] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #128] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v15.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #64] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldp d1, d0, [sp, #104] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #152] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #112] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #232] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl atan2f
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #128] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #208] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #224] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #192] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #176] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d15, d14, [sp, #160] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #64] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #112] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #240
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.atan2.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_cosh(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_cosh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl coshf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_cosh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl coshf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_cosh:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl coshf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_cosh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl coshf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_cosh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl coshf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.cosh.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
 }
 
-define <8 x bfloat> @test_atan2(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_atan2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    mov h1, v1.h[4]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    mov h1, v1.h[5]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    mov h1, v1.h[6]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    mov h1, v1.h[7]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl atan2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+define <8 x bfloat> @test_sinh(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_sinh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl sinhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_atan2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl atan2f
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    mov h1, v1.h[4]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    mov h1, v1.h[5]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    mov h1, v1.h[6]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    mov h1, v1.h[7]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.atan2.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
+; CHECK-BF16-SD-LABEL: test_sinh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl sinhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_sinh:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl sinhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_sinh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl sinhf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_sinh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl sinhf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.sinh.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }
 
-define <8 x bfloat> @test_cosh(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_cosh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl coshf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+define <8 x bfloat> @test_tanh(<8 x bfloat> %a) #0 {
+; CHECK-CVT-SD-LABEL: test_tanh:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl tanhf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_tanh:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl tanhf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_tanh:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl tanhf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_tanh:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl tanhf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_tanh:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl tanhf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
+  %r = call <8 x bfloat> @llvm.tanh.v8bf16(<8 x bfloat> %a)
+  ret <8 x bfloat> %r
+}
+
+define <8 x bfloat> @test_pow(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
+; CHECK-CVT-SD-LABEL: test_pow:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #64
+; CHECK-CVT-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-CVT-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-CVT-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-SD-NEXT:    bl powf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #64
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_cosh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.cosh.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_sinh(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_sinh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl sinhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_pow:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-SD-NEXT:    bl powf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_sinh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.sinh.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_tanh(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_tanh:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl tanhf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-BF16SVE-SD-LABEL: test_pow:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    mov h3, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    mov h2, v1.h[1]
+; CHECK-BF16SVE-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #48] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v3.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v2.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[2]
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v2.h[0]
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[3]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[4]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[5]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[6]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #32] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v1.h[7]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16SVE-SD-NEXT:    bl powf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #64
+; CHECK-BF16SVE-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_tanh:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
-  %r = call <8 x bfloat> @llvm.tanh.v8bf16(<8 x bfloat> %a)
-  ret <8 x bfloat> %r
-}
-
-define <8 x bfloat> @test_pow(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
-; CHECK-CVT-LABEL: test_pow:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #64
-; CHECK-CVT-NEXT:    mov h3, v0.h[1]
-; CHECK-CVT-NEXT:    mov h2, v1.h[1]
-; CHECK-CVT-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v2.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    mov h1, v1.h[2]
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    mov h1, v1.h[3]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    mov h1, v1.h[4]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    mov h1, v1.h[5]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    mov h1, v1.h[6]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    mov h1, v1.h[7]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-CVT-NEXT:    bl powf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #64
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-GI-LABEL: test_pow:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    sub sp, sp, #192
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-CVT-GI-NEXT:    stp d15, d14, [sp, #48] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h15, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v1.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v1.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h8, v1.h[3]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #8] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h14, v1.h[4]
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #112] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #128] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #144] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #24] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #160] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #176] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #16] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #32] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    str d2, [sp, #120] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v15.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #8] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #16] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #24] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #32] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldr d0, [sp, #120] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    shll v2.4s, v1.4h, #16
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-CVT-GI-NEXT:    fmov s0, s2
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl powf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #112] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #176] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    ldp d15, d14, [sp, #48] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #160] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #144] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #128] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    add sp, sp, #192
+; CHECK-CVT-GI-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_pow:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #64
-; CHECK-BF16-NEXT:    mov h3, v0.h[1]
-; CHECK-BF16-NEXT:    mov h2, v1.h[1]
-; CHECK-BF16-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #48] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v3.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v2.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:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h1, v1.h[2]
-; CHECK-BF16-NEXT:    mov v0.h[1], v2.h[0]
-; CHECK-BF16-NEXT:    shll v1.4s, v1.4h, #16
-; CHECK-BF16-NEXT:    str q0, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    // kill: def $s1 killed $s1 killed $q1
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-BF16-NEXT:    bl powf
-; CHECK-BF16-NEXT:    bfcvt h0, s0
-; CHECK-BF16-NEXT:    ldr q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    mov h1, v1.h[3]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    mov h1, v1.h[4]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    mov h1, v1.h[5]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    mov h1, v1.h[6]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 q1, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    str q1, [sp, #32] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    mov h1, v1.h[7]
-; CHECK-BF16-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-BF16-NEXT:    shll v1.4s, v1.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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #32] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #48] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #64
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-GI-LABEL: test_pow:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #240
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d15, d14, [sp, #160] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h15, v0.h[1]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #176] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h12, v1.h[3]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #192] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v1.h[1]
+; CHECK-BF16-GI-NEXT:    mov h11, v1.h[2]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #208] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[3]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #64] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[6]
+; CHECK-BF16-GI-NEXT:    mov h13, v1.h[4]
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #224] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #232] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[5]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #40] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[6]
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #104] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h2, v1.h[7]
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str d2, [sp, #152] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #128] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v15.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #40] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #64] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldp d1, d0, [sp, #104] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldr d1, [sp, #152] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v1.4s, v1.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #112] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    ldr d0, [sp, #232] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl powf
+; CHECK-BF16-GI-NEXT:    ldr q1, [sp, #128] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #208] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #224] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #192] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #176] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d15, d14, [sp, #160] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #64] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp, #112] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #240
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.pow.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
   ret <8 x bfloat> %r
 }
 
 define <8 x bfloat> @test_exp(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_exp:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl expf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl expf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_exp:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_exp:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl expf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_exp:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl expf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_exp:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl expf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_exp:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl expf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.exp.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }
 
 define <8 x bfloat> @test_exp2(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_exp2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl exp2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_exp2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl exp2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
+;
+; CHECK-BF16-SD-LABEL: test_exp2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl exp2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_exp2:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl exp2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_exp2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-CVT-GI-LABEL: test_exp2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl exp2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_exp2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl exp2f
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.exp2.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }
 
 define <8 x bfloat> @test_log(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl logf
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl logf
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl logf
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_log:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl logf
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl logf
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl logf
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.log.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }
 
 define <8 x bfloat> @test_log10(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log10:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log10f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log10:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log10f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log10:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log10:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log10f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_log10:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log10f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log10:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log10f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log10:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log10f
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.log10.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }
 
 define <8 x bfloat> @test_log2(<8 x bfloat> %a) #0 {
-; CHECK-CVT-LABEL: test_log2:
-; CHECK-CVT:       // %bb.0:
-; CHECK-CVT-NEXT:    sub sp, sp, #48
-; CHECK-CVT-NEXT:    mov h1, v0.h[1]
-; CHECK-CVT-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-CVT-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v1.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    mov w19, #32767 // =0x7fff
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-CVT-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[2]
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[3]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[4]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[5]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[6]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s0, w8
-; CHECK-CVT-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-CVT-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-CVT-NEXT:    mov h0, v0.h[7]
-; CHECK-CVT-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; CHECK-CVT-NEXT:    shll v0.4s, v0.4h, #16
-; CHECK-CVT-NEXT:    // kill: def $s0 killed $s0 killed $q0
-; CHECK-CVT-NEXT:    bl log2f
-; CHECK-CVT-NEXT:    fmov w8, s0
-; CHECK-CVT-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-CVT-NEXT:    ubfx w9, w8, #16, #1
-; CHECK-CVT-NEXT:    add w8, w8, w19
-; CHECK-CVT-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
-; CHECK-CVT-NEXT:    add w8, w9, w8
-; CHECK-CVT-NEXT:    lsr w8, w8, #16
-; CHECK-CVT-NEXT:    fmov s1, w8
-; CHECK-CVT-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-CVT-NEXT:    add sp, sp, #48
-; CHECK-CVT-NEXT:    ret
+; CHECK-CVT-SD-LABEL: test_log2:
+; CHECK-CVT-SD:       // %bb.0:
+; CHECK-CVT-SD-NEXT:    sub sp, sp, #48
+; CHECK-CVT-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-CVT-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-CVT-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s0, w8
+; CHECK-CVT-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-CVT-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-CVT-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-SD-NEXT:    bl log2f
+; CHECK-CVT-SD-NEXT:    fmov w8, s0
+; CHECK-CVT-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-CVT-SD-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-SD-NEXT:    add w8, w8, w19
+; CHECK-CVT-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
+; CHECK-CVT-SD-NEXT:    add w8, w9, w8
+; CHECK-CVT-SD-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-SD-NEXT:    fmov s1, w8
+; CHECK-CVT-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-CVT-SD-NEXT:    add sp, sp, #48
+; CHECK-CVT-SD-NEXT:    ret
 ;
-; CHECK-BF16-LABEL: test_log2:
-; CHECK-BF16:       // %bb.0:
-; CHECK-BF16-NEXT:    sub sp, sp, #48
-; CHECK-BF16-NEXT:    mov h1, v0.h[1]
-; CHECK-BF16-NEXT:    str q0, [sp] // 16-byte Spill
-; CHECK-BF16-NEXT:    str x30, [sp, #32] // 8-byte Spill
-; CHECK-BF16-NEXT:    shll v0.4s, v1.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:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[1], v1.h[0]
-; CHECK-BF16-NEXT:    str q0, [sp, #16] // 16-byte Spill
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[2]
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[2], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[3]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[3], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[4]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[4], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[5]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[5], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[6]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 q1, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov v1.h[6], v0.h[0]
-; CHECK-BF16-NEXT:    ldr q0, [sp] // 16-byte Reload
-; CHECK-BF16-NEXT:    mov h0, v0.h[7]
-; CHECK-BF16-NEXT:    str q1, [sp, #16] // 16-byte Spill
-; 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 h1, s0
-; CHECK-BF16-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
-; CHECK-BF16-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
-; CHECK-BF16-NEXT:    mov v0.h[7], v1.h[0]
-; CHECK-BF16-NEXT:    add sp, sp, #48
-; CHECK-BF16-NEXT:    ret
+; CHECK-BF16-SD-LABEL: test_log2:
+; CHECK-BF16-SD:       // %bb.0:
+; CHECK-BF16-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-SD-NEXT:    bl log2f
+; CHECK-BF16-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16-SD-NEXT:    ret
+;
+; CHECK-BF16SVE-SD-LABEL: test_log2:
+; CHECK-BF16SVE-SD:       // %bb.0:
+; CHECK-BF16SVE-SD-NEXT:    sub sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    mov h1, v0.h[1]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v1.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[1], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[2]
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[2], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[3]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[3], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[4]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[4], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[5]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[5], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[6]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h0, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v1.h[6], v0.h[0]
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov h0, v0.h[7]
+; CHECK-BF16SVE-SD-NEXT:    str q1, [sp, #16] // 16-byte Spill
+; CHECK-BF16SVE-SD-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16SVE-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16SVE-SD-NEXT:    bl log2f
+; CHECK-BF16SVE-SD-NEXT:    bfcvt h1, s0
+; CHECK-BF16SVE-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload
+; CHECK-BF16SVE-SD-NEXT:    mov v0.h[7], v1.h[0]
+; CHECK-BF16SVE-SD-NEXT:    add sp, sp, #48
+; CHECK-BF16SVE-SD-NEXT:    ret
+;
+; CHECK-CVT-GI-LABEL: test_log2:
+; CHECK-CVT-GI:       // %bb.0:
+; CHECK-CVT-GI-NEXT:    str d14, [sp, #-128]! // 8-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp d13, d12, [sp, #8] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h12, v0.h[1]
+; CHECK-CVT-GI-NEXT:    mov h13, v0.h[2]
+; CHECK-CVT-GI-NEXT:    stp d11, d10, [sp, #24] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h14, v0.h[3]
+; CHECK-CVT-GI-NEXT:    mov h11, v0.h[4]
+; CHECK-CVT-GI-NEXT:    stp d9, d8, [sp, #40] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    mov h10, v0.h[5]
+; CHECK-CVT-GI-NEXT:    mov h9, v0.h[6]
+; CHECK-CVT-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT:    str x30, [sp, #56] // 8-byte Spill
+; CHECK-CVT-GI-NEXT:    stp x26, x25, [sp, #64] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    stp x24, x23, [sp, #80] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x22, x21, [sp, #96] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    stp x20, x19, [sp, #112] // 16-byte Folded Spill
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    mov w19, #32767 // =0x7fff
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-CVT-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w20, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v13.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w21, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v14.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w22, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v11.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w23, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v10.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w24, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v9.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w25, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    shll v1.4s, v8.4h, #16
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    fmov s0, s1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    lsr w26, w8, #16
+; CHECK-CVT-GI-NEXT:    bl log2f
+; CHECK-CVT-GI-NEXT:    fmov s1, w20
+; CHECK-CVT-GI-NEXT:    fmov w8, s0
+; CHECK-CVT-GI-NEXT:    ldr x30, [sp, #56] // 8-byte Reload
+; CHECK-CVT-GI-NEXT:    fcmp s0, #0.0
+; CHECK-CVT-GI-NEXT:    ldp d9, d8, [sp, #40] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ldp d11, d10, [sp, #24] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[1], w21
+; CHECK-CVT-GI-NEXT:    ubfx w9, w8, #16, #1
+; CHECK-CVT-GI-NEXT:    add w10, w8, w19
+; CHECK-CVT-GI-NEXT:    orr w8, w8, #0x400000
+; CHECK-CVT-GI-NEXT:    ldp x20, x19, [sp, #112] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    add w9, w10, w9
+; CHECK-CVT-GI-NEXT:    ldp d13, d12, [sp, #8] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    csel w8, w8, w9, vs
+; CHECK-CVT-GI-NEXT:    mov v1.h[2], w22
+; CHECK-CVT-GI-NEXT:    lsr w8, w8, #16
+; CHECK-CVT-GI-NEXT:    ldp x22, x21, [sp, #96] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[3], w23
+; CHECK-CVT-GI-NEXT:    mov v1.h[4], w24
+; CHECK-CVT-GI-NEXT:    ldp x24, x23, [sp, #80] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[5], w25
+; CHECK-CVT-GI-NEXT:    mov v1.h[6], w26
+; CHECK-CVT-GI-NEXT:    ldp x26, x25, [sp, #64] // 16-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    mov v1.h[7], w8
+; CHECK-CVT-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-CVT-GI-NEXT:    ldr d14, [sp], #128 // 8-byte Folded Reload
+; CHECK-CVT-GI-NEXT:    ret
+;
+; CHECK-BF16-GI-LABEL: test_log2:
+; CHECK-BF16-GI:       // %bb.0:
+; CHECK-BF16-GI-NEXT:    sub sp, sp, #176
+; CHECK-BF16-GI-NEXT:    str d14, [sp, #112] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    mov h14, v0.h[6]
+; CHECK-BF16-GI-NEXT:    stp d13, d12, [sp, #120] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h12, v0.h[4]
+; CHECK-BF16-GI-NEXT:    mov h13, v0.h[5]
+; CHECK-BF16-GI-NEXT:    stp d11, d10, [sp, #136] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h10, v0.h[2]
+; CHECK-BF16-GI-NEXT:    mov h11, v0.h[3]
+; CHECK-BF16-GI-NEXT:    stp d9, d8, [sp, #152] // 16-byte Folded Spill
+; CHECK-BF16-GI-NEXT:    mov h9, v0.h[1]
+; CHECK-BF16-GI-NEXT:    mov h8, v0.h[7]
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT:    str x30, [sp, #168] // 8-byte Spill
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #96] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v9.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #80] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v10.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #64] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v11.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #48] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v12.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #32] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v13.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v14.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    str q0, [sp] // 16-byte Spill
+; CHECK-BF16-GI-NEXT:    shll v0.4s, v8.4h, #16
+; CHECK-BF16-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
+; CHECK-BF16-GI-NEXT:    bl log2f
+; CHECK-BF16-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    bfcvt h0, s0
+; CHECK-BF16-GI-NEXT:    ldp d9, d8, [sp, #152] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr x30, [sp, #168] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    ldp d11, d10, [sp, #136] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[1], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    ldp d13, d12, [sp, #120] // 16-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[2], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[3], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[4], v3.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[5], v2.h[0]
+; CHECK-BF16-GI-NEXT:    ldr q2, [sp] // 16-byte Reload
+; CHECK-BF16-GI-NEXT:    mov v1.h[6], v2.h[0]
+; CHECK-BF16-GI-NEXT:    mov v1.h[7], v0.h[0]
+; CHECK-BF16-GI-NEXT:    mov v0.16b, v1.16b
+; CHECK-BF16-GI-NEXT:    add sp, sp, #176
+; CHECK-BF16-GI-NEXT:    ret
   %r = call <8 x bfloat> @llvm.log2.v8bf16(<8 x bfloat> %a)
   ret <8 x bfloat> %r
 }

diff  --git a/llvm/test/CodeGen/AArch64/ldexp.ll b/llvm/test/CodeGen/AArch64/ldexp.ll
index 308e861abb6d4..3c1b08b1fe8e6 100644
--- a/llvm/test/CodeGen/AArch64/ldexp.ll
+++ b/llvm/test/CodeGen/AArch64/ldexp.ll
@@ -4,7 +4,6 @@
 ; RUN: llc -mtriple=aarch64-windows-msvc -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVEWINDOWS %s
 ; RUN: llc -mtriple=aarch64-windows-msvc < %s -o - | FileCheck -check-prefixes=WINDOWS %s
 
-; GISEL:       warning: Instruction selection used fallback path for testExpbf16
 
 define double @testExp(double %val, i32 %a) {
 ; SVE-LABEL: testExp:
@@ -293,9 +292,12 @@ define bfloat @testExpbf16(bfloat %val, i32 %a) {
 ; GISEL-NEXT:    bl ldexpf
 ; GISEL-NEXT:    fmov w9, s0
 ; GISEL-NEXT:    mov w8, #32767 // =0x7fff
+; GISEL-NEXT:    fcmp s0, #0.0
 ; GISEL-NEXT:    ubfx w10, w9, #16, #1
 ; GISEL-NEXT:    add w8, w9, w8
-; GISEL-NEXT:    add w8, w10, w8
+; GISEL-NEXT:    orr w9, w9, #0x400000
+; GISEL-NEXT:    add w8, w8, w10
+; GISEL-NEXT:    csel w8, w9, w8, vs
 ; GISEL-NEXT:    lsr w8, w8, #16
 ; GISEL-NEXT:    fmov s0, w8
 ; GISEL-NEXT:    // kill: def $h0 killed $h0 killed $s0


        


More information about the llvm-commits mailing list