| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=riscv32 -mattr=+xandesbfhcvt -target-abi ilp32f \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,XANDESBFHCVT %s |
| ; RUN: llc -mtriple=riscv32 -mattr=+zfh,+xandesbfhcvt -target-abi ilp32f \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,ZFH %s |
| ; RUN: llc -mtriple=riscv64 -mattr=+xandesbfhcvt -target-abi lp64f \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,XANDESBFHCVT %s |
| ; RUN: llc -mtriple=riscv64 -mattr=+zfh,+xandesbfhcvt -target-abi lp64f \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,ZFH %s |
| |
| define float @fcvt_s_bf16(bfloat %a) nounwind { |
| ; CHECK-LABEL: fcvt_s_bf16: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: nds.fcvt.s.bf16 fa0, fa0 |
| ; CHECK-NEXT: ret |
| %1 = fpext bfloat %a to float |
| ret float %1 |
| } |
| |
| define bfloat @fcvt_bf16_s(float %a) nounwind { |
| ; CHECK-LABEL: fcvt_bf16_s: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: nds.fcvt.bf16.s fa0, fa0 |
| ; CHECK-NEXT: ret |
| %1 = fptrunc float %a to bfloat |
| ret bfloat %1 |
| } |
| |
| ; Check load and store to bf16. |
| define void @loadstorebf16(ptr %bf, ptr %sf) nounwind { |
| ; XANDESBFHCVT-LABEL: loadstorebf16: |
| ; XANDESBFHCVT: # %bb.0: # %entry |
| ; XANDESBFHCVT-NEXT: lhu a2, 0(a0) |
| ; XANDESBFHCVT-NEXT: lui a3, 1048560 |
| ; XANDESBFHCVT-NEXT: or a2, a2, a3 |
| ; XANDESBFHCVT-NEXT: fmv.w.x fa5, a2 |
| ; XANDESBFHCVT-NEXT: nds.fcvt.s.bf16 fa5, fa5 |
| ; XANDESBFHCVT-NEXT: fsw fa5, 0(a1) |
| ; XANDESBFHCVT-NEXT: flw fa5, 0(a1) |
| ; XANDESBFHCVT-NEXT: nds.fcvt.bf16.s fa5, fa5 |
| ; XANDESBFHCVT-NEXT: fmv.x.w a1, fa5 |
| ; XANDESBFHCVT-NEXT: sh a1, 0(a0) |
| ; XANDESBFHCVT-NEXT: ret |
| ; |
| ; ZFH-LABEL: loadstorebf16: |
| ; ZFH: # %bb.0: # %entry |
| ; ZFH-NEXT: flh fa5, 0(a0) |
| ; ZFH-NEXT: nds.fcvt.s.bf16 fa5, fa5 |
| ; ZFH-NEXT: fsw fa5, 0(a1) |
| ; ZFH-NEXT: flw fa5, 0(a1) |
| ; ZFH-NEXT: nds.fcvt.bf16.s fa5, fa5 |
| ; ZFH-NEXT: fsh fa5, 0(a0) |
| ; ZFH-NEXT: ret |
| entry: |
| %0 = load bfloat, bfloat* %bf, align 2 |
| %1 = fpext bfloat %0 to float |
| store volatile float %1, float* %sf, align 4 |
| |
| %2 = load float, float* %sf, align 4 |
| %3 = fptrunc float %2 to bfloat |
| store volatile bfloat %3, bfloat* %bf, align 2 |
| |
| ret void |
| } |