Files
clang-p2996/llvm/test/CodeGen/AArch64/bf16-instructions.ll
Sander de Smalen 61510b51c3 Revert "[AArch64] Enable subreg liveness tracking by default."
This reverts commit 9c319d5bb4.

Some issues were discovered with the bootstrap builds, which
seem like they were caused by this commit. I'm reverting to investigate.
2024-12-12 17:22:15 +00:00

2348 lines
78 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple aarch64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,CHECK-CVT
; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+bf16 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16
define bfloat @test_fadd(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_fadd:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fadd s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_fadd:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fadd s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fadd bfloat %a, %b
ret bfloat %r
}
define bfloat @test_fsub(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_fsub:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fsub s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_fsub:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fsub s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fsub bfloat %a, %b
ret bfloat %r
}
define bfloat @test_fmul(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_fmul:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fmul s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_fmul:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fmul s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fmul bfloat %a, %b
ret bfloat %r
}
define bfloat @test_fmadd(bfloat %a, bfloat %b, bfloat %c) #0 {
; CHECK-CVT-LABEL: test_fmadd:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s1
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff
; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fmul s0, s1, s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-NEXT: add w8, w8, w10
; CHECK-CVT-NEXT: add w8, w9, w8
; CHECK-CVT-NEXT: fmov w9, s2
; CHECK-CVT-NEXT: lsr w8, w8, #16
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fadd s0, s0, s1
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-NEXT: add w8, w8, w10
; CHECK-CVT-NEXT: add w8, w9, 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: ret
;
; CHECK-BF16-LABEL: test_fmadd:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fmov w9, s2
; CHECK-BF16-NEXT: fmul s0, s1, s0
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fadd s0, s0, s1
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%mul = fmul fast bfloat %a, %b
%r = fadd fast bfloat %mul, %c
ret bfloat %r
}
define bfloat @test_fdiv(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_fdiv:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fdiv s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_fdiv:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fdiv s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fdiv bfloat %a, %b
ret bfloat %r
}
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 $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; 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-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 $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; 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
%r = frem bfloat %a, %b
ret bfloat %r
}
define void @test_store(bfloat %a, ptr %b) #0 {
; CHECK-LABEL: test_store:
; CHECK: // %bb.0:
; CHECK-NEXT: str h0, [x0]
; CHECK-NEXT: ret
store bfloat %a, ptr %b
ret void
}
define bfloat @test_load(ptr %a) #0 {
; CHECK-LABEL: test_load:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: ret
%r = load bfloat, ptr %a
ret bfloat %r
}
declare bfloat @test_callee(bfloat %a, bfloat %b) #0
define bfloat @test_call(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_call:
; CHECK: // %bb.0:
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-NEXT: bl test_callee
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
%r = call bfloat @test_callee(bfloat %a, bfloat %b)
ret bfloat %r
}
define bfloat @test_call_flipped(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_call_flipped:
; CHECK: // %bb.0:
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-NEXT: fmov s2, s0
; CHECK-NEXT: fmov s0, s1
; CHECK-NEXT: fmov s1, s2
; CHECK-NEXT: bl test_callee
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
%r = call bfloat @test_callee(bfloat %b, bfloat %a)
ret bfloat %r
}
define bfloat @test_tailcall_flipped(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_tailcall_flipped:
; CHECK: // %bb.0:
; CHECK-NEXT: fmov s2, s0
; CHECK-NEXT: fmov s0, s1
; CHECK-NEXT: fmov s1, s2
; CHECK-NEXT: b test_callee
%r = tail call bfloat @test_callee(bfloat %b, bfloat %a)
ret bfloat %r
}
define bfloat @test_select(bfloat %a, bfloat %b, i1 zeroext %c) #0 {
; CHECK-LABEL: test_select:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: cmp w0, #0
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: fcsel s0, s0, s1, ne
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
; CHECK-NEXT: ret
%r = select i1 %c, bfloat %a, bfloat %b
ret bfloat %r
}
define bfloat @test_select_cc(bfloat %a, bfloat %b, bfloat %c, bfloat %d) #0 {
; CHECK-LABEL: test_select_cc:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h3 killed $h3 def $s3
; CHECK-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-NEXT: fmov w8, s3
; CHECK-NEXT: fmov w9, s2
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s2, w8
; CHECK-NEXT: fmov s3, w9
; CHECK-NEXT: fcmp s3, s2
; CHECK-NEXT: fcsel s0, s0, s1, ne
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
; CHECK-NEXT: ret
%cc = fcmp une bfloat %c, %d
%r = select i1 %cc, bfloat %a, bfloat %b
ret bfloat %r
}
define float @test_select_cc_f32_f16(float %a, float %b, bfloat %c, bfloat %d) #0 {
; CHECK-LABEL: test_select_cc_f32_f16:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h3 killed $h3 def $s3
; CHECK-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-NEXT: fmov w8, s3
; CHECK-NEXT: fmov w9, s2
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s2, w8
; CHECK-NEXT: fmov s3, w9
; CHECK-NEXT: fcmp s3, s2
; CHECK-NEXT: fcsel s0, s0, s1, ne
; CHECK-NEXT: ret
%cc = fcmp une bfloat %c, %d
%r = select i1 %cc, float %a, float %b
ret float %r
}
define bfloat @test_select_cc_f16_f32(bfloat %a, bfloat %b, float %c, float %d) #0 {
; CHECK-LABEL: test_select_cc_f16_f32:
; CHECK: // %bb.0:
; CHECK-NEXT: fcmp s2, s3
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: fcsel s0, s0, s1, ne
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
; CHECK-NEXT: ret
%cc = fcmp une float %c, %d
%r = select i1 %cc, bfloat %a, bfloat %b
ret bfloat %r
}
define i1 @test_fcmp_une(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_une:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, ne
; CHECK-NEXT: ret
%r = fcmp une bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ueq(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ueq:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w8, eq
; CHECK-NEXT: csinc w0, w8, wzr, vc
; CHECK-NEXT: ret
%r = fcmp ueq bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ugt(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ugt:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, hi
; CHECK-NEXT: ret
%r = fcmp ugt bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_uge(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_uge:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, pl
; CHECK-NEXT: ret
%r = fcmp uge bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ult(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ult:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
%r = fcmp ult bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ule(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ule:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, le
; CHECK-NEXT: ret
%r = fcmp ule bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_uno(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_uno:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, vs
; CHECK-NEXT: ret
%r = fcmp uno bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_one(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_one:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w8, mi
; CHECK-NEXT: csinc w0, w8, wzr, le
; CHECK-NEXT: ret
%r = fcmp one bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_oeq(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_oeq:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, eq
; CHECK-NEXT: ret
%r = fcmp oeq bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ogt(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ogt:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%r = fcmp ogt bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_oge(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_oge:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, ge
; CHECK-NEXT: ret
%r = fcmp oge bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_olt(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_olt:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, mi
; CHECK-NEXT: ret
%r = fcmp olt bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ole(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ole:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, ls
; CHECK-NEXT: ret
%r = fcmp ole bfloat %a, %b
ret i1 %r
}
define i1 @test_fcmp_ord(bfloat %a, bfloat %b) #0 {
; CHECK-LABEL: test_fcmp_ord:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: cset w0, vc
; CHECK-NEXT: ret
%r = fcmp ord bfloat %a, %b
ret i1 %r
}
define void @test_fccmp(bfloat %in, ptr %out) {
; CHECK-LABEL: test_fccmp:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: movi v1.2s, #69, lsl #24
; CHECK-NEXT: movi v3.2s, #72, lsl #24
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s2, w8
; CHECK-NEXT: adrp x8, .LCPI29_0
; CHECK-NEXT: fcmp s2, s1
; CHECK-NEXT: ldr h1, [x8, :lo12:.LCPI29_0]
; CHECK-NEXT: fccmp s2, s3, #4, mi
; CHECK-NEXT: fcsel s0, s0, s1, gt
; CHECK-NEXT: str h0, [x0]
; CHECK-NEXT: ret
%cmp1 = fcmp ogt bfloat %in, 0xR4800
%cmp2 = fcmp olt bfloat %in, 0xR4500
%cond = and i1 %cmp1, %cmp2
%result = select i1 %cond, bfloat %in, bfloat 0xR4500
store bfloat %result, ptr %out
ret void
}
define void @test_br_cc(bfloat %a, bfloat %b, ptr %p1, ptr %p2) #0 {
; CHECK-LABEL: test_br_cc:
; CHECK: // %bb.0: // %common.ret
; CHECK-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s1
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: lsl w9, w9, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fmov s1, w9
; CHECK-NEXT: fcmp s1, s0
; CHECK-NEXT: csel x8, x0, x1, pl
; CHECK-NEXT: str wzr, [x8]
; CHECK-NEXT: ret
%c = fcmp uge bfloat %a, %b
br i1 %c, label %then, label %else
then:
store i32 0, ptr %p1
ret void
else:
store i32 0, ptr %p2
ret void
}
define bfloat @test_phi(ptr %p1) #0 {
; CHECK-LABEL: test_phi:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill
; CHECK-NEXT: ldr h9, [x0]
; CHECK-NEXT: stp x30, x19, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: mov x19, x0
; CHECK-NEXT: .LBB31_1: // %loop
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
; CHECK-NEXT: fmov s8, s9
; CHECK-NEXT: ldr h9, [x19]
; CHECK-NEXT: mov x0, x19
; CHECK-NEXT: bl test_dummy
; CHECK-NEXT: tbnz w0, #0, .LBB31_1
; CHECK-NEXT: // %bb.2: // %return
; CHECK-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: fmov s0, s8
; CHECK-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload
; CHECK-NEXT: ret
entry:
%a = load bfloat, ptr %p1
br label %loop
loop:
%r = phi bfloat [%a, %entry], [%b, %loop]
%b = load bfloat, ptr %p1
%c = call i1 @test_dummy(ptr %p1)
br i1 %c, label %loop, label %return
return:
ret bfloat %r
}
declare i1 @test_dummy(ptr %p1) #0
define i32 @test_fptosi_i32(bfloat %a) #0 {
; CHECK-LABEL: test_fptosi_i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fcvtzs w0, s0
; CHECK-NEXT: ret
%r = fptosi bfloat %a to i32
ret i32 %r
}
define i64 @test_fptosi_i64(bfloat %a) #0 {
; CHECK-LABEL: test_fptosi_i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fcvtzs x0, s0
; CHECK-NEXT: ret
%r = fptosi bfloat %a to i64
ret i64 %r
}
define i32 @test_fptoui_i32(bfloat %a) #0 {
; CHECK-LABEL: test_fptoui_i32:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fcvtzu w0, s0
; CHECK-NEXT: ret
%r = fptoui bfloat %a to i32
ret i32 %r
}
define i64 @test_fptoui_i64(bfloat %a) #0 {
; CHECK-LABEL: test_fptoui_i64:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fcvtzu x0, s0
; CHECK-NEXT: ret
%r = fptoui bfloat %a to i64
ret i64 %r
}
define bfloat @test_uitofp_i32(i32 %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i32:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ucvtf d0, w0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: fcvtxn s0, d0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_uitofp_i32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ucvtf d0, w0
; CHECK-BF16-NEXT: fcvtxn s0, d0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = uitofp i32 %a to bfloat
ret bfloat %r
}
define bfloat @test_uitofp_i64(i64 %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i64:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: lsr x9, x0, #53
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: cmp x9, #0
; CHECK-CVT-NEXT: and x9, x0, #0xfffffffffffff000
; CHECK-CVT-NEXT: csel x9, x9, x0, ne
; CHECK-CVT-NEXT: ucvtf d0, x9
; CHECK-CVT-NEXT: cset w9, ne
; CHECK-CVT-NEXT: tst x0, #0xfff
; CHECK-CVT-NEXT: csel w9, wzr, w9, eq
; CHECK-CVT-NEXT: fmov x10, d0
; CHECK-CVT-NEXT: orr x9, x10, x9
; CHECK-CVT-NEXT: fmov d0, x9
; CHECK-CVT-NEXT: fcvtxn s0, d0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_uitofp_i64:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: lsr x8, x0, #53
; CHECK-BF16-NEXT: and x9, x0, #0xfffffffffffff000
; CHECK-BF16-NEXT: cmp x8, #0
; CHECK-BF16-NEXT: csel x8, x9, x0, ne
; CHECK-BF16-NEXT: ucvtf d0, x8
; CHECK-BF16-NEXT: cset w8, ne
; CHECK-BF16-NEXT: tst x0, #0xfff
; CHECK-BF16-NEXT: csel w8, wzr, w8, eq
; CHECK-BF16-NEXT: fmov x9, d0
; CHECK-BF16-NEXT: orr x8, x9, x8
; CHECK-BF16-NEXT: fmov d0, x8
; CHECK-BF16-NEXT: fcvtxn s0, d0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = uitofp i64 %a to bfloat
ret bfloat %r
}
define bfloat @test_sitofp_i32(i32 %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i32:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: scvtf d0, w0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: fcvtxn s0, d0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_sitofp_i32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: scvtf d0, w0
; CHECK-BF16-NEXT: fcvtxn s0, d0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = sitofp i32 %a to bfloat
ret bfloat %r
}
define bfloat @test_sitofp_i64(i64 %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i64:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: cmp x0, #0
; CHECK-CVT-NEXT: and x11, x0, #0x8000000000000000
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: cneg x9, x0, mi
; CHECK-CVT-NEXT: lsr x10, x9, #53
; CHECK-CVT-NEXT: cmp x10, #0
; CHECK-CVT-NEXT: and x10, x9, #0xfffffffffffff000
; CHECK-CVT-NEXT: csel x10, x10, x9, ne
; CHECK-CVT-NEXT: scvtf d0, x10
; CHECK-CVT-NEXT: cset w10, ne
; CHECK-CVT-NEXT: tst x9, #0xfff
; CHECK-CVT-NEXT: csel w10, wzr, w10, eq
; CHECK-CVT-NEXT: fmov x9, d0
; CHECK-CVT-NEXT: orr x9, x9, x11
; CHECK-CVT-NEXT: orr x9, x9, x10
; CHECK-CVT-NEXT: fmov d0, x9
; CHECK-CVT-NEXT: fcvtxn s0, d0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_sitofp_i64:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: cmp x0, #0
; CHECK-BF16-NEXT: cneg x8, x0, mi
; CHECK-BF16-NEXT: lsr x9, x8, #53
; CHECK-BF16-NEXT: and x10, x8, #0xfffffffffffff000
; CHECK-BF16-NEXT: cmp x9, #0
; CHECK-BF16-NEXT: csel x9, x10, x8, ne
; CHECK-BF16-NEXT: and x10, x0, #0x8000000000000000
; CHECK-BF16-NEXT: cset w11, ne
; CHECK-BF16-NEXT: scvtf d0, x9
; CHECK-BF16-NEXT: tst x8, #0xfff
; CHECK-BF16-NEXT: fmov x9, d0
; CHECK-BF16-NEXT: orr x8, x9, x10
; CHECK-BF16-NEXT: csel w9, wzr, w11, eq
; CHECK-BF16-NEXT: orr x8, x8, x9
; CHECK-BF16-NEXT: fmov d0, x8
; CHECK-BF16-NEXT: fcvtxn s0, d0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = sitofp i64 %a to bfloat
ret bfloat %r
}
define bfloat @test_uitofp_i32_fadd(i32 %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_uitofp_i32_fadd:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ucvtf d1, w0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fcvtxn s1, d1
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-NEXT: add w9, w9, w8
; CHECK-CVT-NEXT: add w9, w10, w9
; CHECK-CVT-NEXT: lsr w9, w9, #16
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: fmov w10, s1
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fadd s0, s0, s1
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_uitofp_i32_fadd:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ucvtf d1, w0
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fcvtxn s1, d1
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bfcvt h1, s1
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fadd s0, s0, s1
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%c = uitofp i32 %a to bfloat
%r = fadd bfloat %b, %c
ret bfloat %r
}
define bfloat @test_sitofp_i32_fadd(i32 %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_sitofp_i32_fadd:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: scvtf d1, w0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fcvtxn s1, d1
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-NEXT: add w9, w9, w8
; CHECK-CVT-NEXT: add w9, w10, w9
; CHECK-CVT-NEXT: lsr w9, w9, #16
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: fmov w10, s1
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fadd s0, s0, s1
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_sitofp_i32_fadd:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: scvtf d1, w0
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fcvtxn s1, d1
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bfcvt h1, s1
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fadd s0, s0, s1
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%c = sitofp i32 %a to bfloat
%r = fadd bfloat %b, %c
ret bfloat %r
}
define bfloat @test_fptrunc_float(float %a) #0 {
; CHECK-CVT-LABEL: test_fptrunc_float:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: fcmp s0, s0
; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-NEXT: add w8, w9, w8
; CHECK-CVT-NEXT: orr w9, w9, #0x400000
; CHECK-CVT-NEXT: add w8, w10, w8
; CHECK-CVT-NEXT: csel w8, w9, w8, vs
; 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: ret
;
; CHECK-BF16-LABEL: test_fptrunc_float:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fptrunc float %a to bfloat
ret bfloat %r
}
define bfloat @test_fptrunc_double(double %a) #0 {
; CHECK-CVT-LABEL: test_fptrunc_double:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: fcvtxn s0, d0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_fptrunc_double:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: fcvtxn s0, d0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = fptrunc double %a to bfloat
ret bfloat %r
}
define float @test_fpext_float(bfloat %a) #0 {
; CHECK-LABEL: test_fpext_float:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: ret
%r = fpext bfloat %a to float
ret float %r
}
define double @test_fpext_double(bfloat %a) #0 {
; CHECK-LABEL: test_fpext_double:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: lsl w8, w8, #16
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: ret
%r = fpext bfloat %a to double
ret double %r
}
define i16 @test_bitcast_bfloattoi16(bfloat %a) #0 {
; CHECK-LABEL: test_bitcast_bfloattoi16:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w0, s0
; CHECK-NEXT: ret
%r = bitcast bfloat %a to i16
ret i16 %r
}
define bfloat @test_bitcast_i16tobfloat(i16 %a) #0 {
; CHECK-LABEL: test_bitcast_i16tobfloat:
; CHECK: // %bb.0:
; CHECK-NEXT: fmov s0, w0
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
; CHECK-NEXT: ret
%r = bitcast i16 %a to bfloat
ret bfloat %r
}
declare bfloat @llvm.sqrt.f16(bfloat %a) #0
declare bfloat @llvm.powi.f16.i32(bfloat %a, i32 %b) #0
declare bfloat @llvm.sin.f16(bfloat %a) #0
declare bfloat @llvm.cos.f16(bfloat %a) #0
declare bfloat @llvm.tan.f16(bfloat %a) #0
declare bfloat @llvm.asin.f16(bfloat %a) #0
declare bfloat @llvm.acos.f16(bfloat %a) #0
declare bfloat @llvm.atan.f16(bfloat %a) #0
declare bfloat @llvm.atan2.f16(bfloat %a, bfloat %b) #0
declare bfloat @llvm.sinh.f16(bfloat %a) #0
declare bfloat @llvm.cosh.f16(bfloat %a) #0
declare bfloat @llvm.tanh.f16(bfloat %a) #0
declare bfloat @llvm.pow.f16(bfloat %a, bfloat %b) #0
declare bfloat @llvm.exp.f16(bfloat %a) #0
declare bfloat @llvm.exp2.f16(bfloat %a) #0
declare bfloat @llvm.log.f16(bfloat %a) #0
declare bfloat @llvm.log10.f16(bfloat %a) #0
declare bfloat @llvm.log2.f16(bfloat %a) #0
declare bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c) #0
declare bfloat @llvm.fabs.f16(bfloat %a) #0
declare bfloat @llvm.minnum.f16(bfloat %a, bfloat %b) #0
declare bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b) #0
declare bfloat @llvm.copysign.f16(bfloat %a, bfloat %b) #0
declare bfloat @llvm.floor.f16(bfloat %a) #0
declare bfloat @llvm.ceil.f16(bfloat %a) #0
declare bfloat @llvm.trunc.f16(bfloat %a) #0
declare bfloat @llvm.rint.f16(bfloat %a) #0
declare bfloat @llvm.nearbyint.f16(bfloat %a) #0
declare bfloat @llvm.round.f16(bfloat %a) #0
declare bfloat @llvm.roundeven.f16(bfloat %a) #0
declare bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c) #0
define bfloat @test_sqrt(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_sqrt:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fsqrt s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_sqrt:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fsqrt s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.sqrt.f16(bfloat %a)
ret bfloat %r
}
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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_powi:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl __powisf2
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.powi.f16.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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_sin:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl sinf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.sin.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_cos:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl cosf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.cos.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_tan:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl tanf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.tan.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_acos:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl acosf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.acos.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_asin:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl asinf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.asin.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_atan:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl atanf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.atan.f16(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 $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; 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-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 $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; 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
%r = call bfloat @llvm.atan2.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_cosh:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl coshf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.cosh.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_sinh:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl sinhf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.sinh.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_tanh:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl tanhf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.tanh.f16(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 $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; 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-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 $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; 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
%r = call bfloat @llvm.pow.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_exp:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl expf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.exp.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_exp2:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl exp2f
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.exp2.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_log:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl logf
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.log.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_log10:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl log10f
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.log10.f16(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 $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; 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-BF16-LABEL: test_log2:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bl log2f
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.log2.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_fma(bfloat %a, bfloat %b, bfloat %c) #0 {
; CHECK-CVT-LABEL: test_fma:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s2
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fmov s2, w10
; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff
; CHECK-CVT-NEXT: fmadd s0, s2, s1, s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-NEXT: add w8, w8, w10
; CHECK-CVT-NEXT: add w8, w9, 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: ret
;
; CHECK-BF16-LABEL: test_fma:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s2
; CHECK-BF16-NEXT: fmov w9, s1
; CHECK-BF16-NEXT: fmov w10, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: lsl w10, w10, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fmov s2, w10
; CHECK-BF16-NEXT: fmadd s0, s2, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c)
ret bfloat %r
}
define bfloat @test_fabs(bfloat %a) #0 {
; CHECK-LABEL: test_fabs:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w8, s0
; CHECK-NEXT: and w8, w8, #0x7fff
; CHECK-NEXT: fmov s0, w8
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
; CHECK-NEXT: ret
%r = call bfloat @llvm.fabs.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_minnum(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_minnum:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fminnm s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_minnum:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fminnm s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.minnum.f16(bfloat %a, bfloat %b)
ret bfloat %r
}
define bfloat @test_maxnum(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_maxnum:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s1
; CHECK-CVT-NEXT: fmov w10, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: lsl w10, w10, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: fmov s1, w10
; CHECK-CVT-NEXT: fmaxnm s0, s1, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_maxnum:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fmaxnm s0, s1, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b)
ret bfloat %r
}
define bfloat @test_copysign(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_copysign:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s1
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: bit v0.16b, v1.16b, v2.16b
; CHECK-CVT-NEXT: fmov w8, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_copysign:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: bit v0.16b, v1.16b, v2.16b
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)
ret bfloat %r
}
define bfloat @test_copysign_f32(bfloat %a, float %b) #0 {
; CHECK-CVT-LABEL: test_copysign_f32:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-CVT-NEXT: // kill: def $s1 killed $s1 def $q1
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-CVT-NEXT: fmov w8, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_copysign_f32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-BF16-NEXT: // kill: def $s1 killed $s1 def $q1
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%tb = fptrunc float %b to bfloat
%r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)
ret bfloat %r
}
define bfloat @test_copysign_f64(bfloat %a, double %b) #0 {
; CHECK-CVT-LABEL: test_copysign_f64:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: fcvt s1, d1
; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-CVT-NEXT: fmov w8, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_copysign_f64:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: fcvt s1, d1
; CHECK-BF16-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%tb = fptrunc double %b to bfloat
%r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)
ret bfloat %r
}
; away the (fpext (fp_round <result>)) here.
define float @test_copysign_extended(bfloat %a, bfloat %b) #0 {
; CHECK-CVT-LABEL: test_copysign_extended:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s1
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: bit v0.16b, v1.16b, v2.16b
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: lsr w8, w8, #16
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_copysign_extended:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: mvni v2.4s, #128, lsl #24
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: bit v0.16b, v1.16b, v2.16b
; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)
%xr = fpext bfloat %r to float
ret float %xr
}
define bfloat @test_floor(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_floor:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frintm s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_floor:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frintm s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.floor.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_ceil(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_ceil:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frintp s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_ceil:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frintp s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.ceil.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_trunc(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_trunc:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frintz s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_trunc:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frintz s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.trunc.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_rint(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_rint:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frintx s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_rint:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frintx s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.rint.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_nearbyint(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_nearbyint:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frinti s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_nearbyint:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frinti s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.nearbyint.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_round(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_round:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frinta s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_round:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frinta s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.round.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_roundeven(bfloat %a) #0 {
; CHECK-CVT-LABEL: test_roundeven:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w9
; CHECK-CVT-NEXT: frintn s0, s0
; CHECK-CVT-NEXT: fmov w9, s0
; 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: ret
;
; CHECK-BF16-LABEL: test_roundeven:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: frintn s0, s0
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.roundeven.f16(bfloat %a)
ret bfloat %r
}
define bfloat @test_fmuladd(bfloat %a, bfloat %b, bfloat %c) #0 {
; CHECK-CVT-LABEL: test_fmuladd:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-CVT-NEXT: fmov w8, s1
; CHECK-CVT-NEXT: fmov w9, s0
; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff
; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fmul s0, s1, s0
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-NEXT: add w8, w8, w10
; CHECK-CVT-NEXT: add w8, w9, w8
; CHECK-CVT-NEXT: fmov w9, s2
; CHECK-CVT-NEXT: lsr w8, w8, #16
; CHECK-CVT-NEXT: lsl w8, w8, #16
; CHECK-CVT-NEXT: lsl w9, w9, #16
; CHECK-CVT-NEXT: fmov s0, w8
; CHECK-CVT-NEXT: fmov s1, w9
; CHECK-CVT-NEXT: fadd s0, s0, s1
; CHECK-CVT-NEXT: fmov w8, s0
; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-NEXT: add w8, w8, w10
; CHECK-CVT-NEXT: add w8, w9, 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: ret
;
; CHECK-BF16-LABEL: test_fmuladd:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $s1
; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-BF16-NEXT: fmov w8, s1
; CHECK-BF16-NEXT: fmov w9, s0
; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $s2
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: fmov w9, s2
; CHECK-BF16-NEXT: fmul s0, s1, s0
; CHECK-BF16-NEXT: lsl w9, w9, #16
; CHECK-BF16-NEXT: fmov s1, w9
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: fmov w8, s0
; CHECK-BF16-NEXT: lsl w8, w8, #16
; CHECK-BF16-NEXT: fmov s0, w8
; CHECK-BF16-NEXT: fadd s0, s0, s1
; CHECK-BF16-NEXT: bfcvt h0, s0
; CHECK-BF16-NEXT: ret
%r = call bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c)
ret bfloat %r
}
attributes #0 = { nounwind }