xref: /llvm-project/llvm/test/CodeGen/RISCV/bfloat.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1061e368fSAlex Bradbury; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2061e368fSAlex Bradbury; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32I-ILP32
3061e368fSAlex Bradbury; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64I-LP64
492912499SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32ID-ILP32
592912499SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs < %s  | FileCheck %s -check-prefix=RV64ID-LP64
692912499SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32ID-ILP32D
792912499SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64d -verify-machineinstrs < %s  | FileCheck %s -check-prefix=RV64ID-LP64D
8061e368fSAlex Bradbury
9061e368fSAlex Bradburydefine bfloat @float_to_bfloat(float %a) nounwind {
10061e368fSAlex Bradbury; RV32I-ILP32-LABEL: float_to_bfloat:
11061e368fSAlex Bradbury; RV32I-ILP32:       # %bb.0:
12061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
13061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
14eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncsfbf2
15061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
16061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
17061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    ret
18061e368fSAlex Bradbury;
19061e368fSAlex Bradbury; RV64I-LP64-LABEL: float_to_bfloat:
20061e368fSAlex Bradbury; RV64I-LP64:       # %bb.0:
21061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
22061e368fSAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
23eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncsfbf2
24061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
26061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ret
2792912499SAlex Bradbury;
2892912499SAlex Bradbury; RV32ID-ILP32-LABEL: float_to_bfloat:
2992912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
3092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
3192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
32eabaee0cSFangrui Song; RV32ID-ILP32-NEXT:    call __truncsfbf2
3392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lui a1, 1048560
3492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    or a0, a0, a1
3592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
3792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
3892912499SAlex Bradbury;
3992912499SAlex Bradbury; RV64ID-LP64-LABEL: float_to_bfloat:
4092912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
4192912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, -16
4292912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
43eabaee0cSFangrui Song; RV64ID-LP64-NEXT:    call __truncsfbf2
4492912499SAlex Bradbury; RV64ID-LP64-NEXT:    lui a1, 1048560
4592912499SAlex Bradbury; RV64ID-LP64-NEXT:    or a0, a0, a1
4692912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4792912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, 16
4892912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
4992912499SAlex Bradbury;
5092912499SAlex Bradbury; RV32ID-ILP32D-LABEL: float_to_bfloat:
5192912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
5292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, -16
5392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
54eabaee0cSFangrui Song; RV32ID-ILP32D-NEXT:    call __truncsfbf2
5592912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
5692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lui a1, 1048560
5792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    or a0, a0, a1
5892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
5992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, 16
6192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
6292912499SAlex Bradbury;
6392912499SAlex Bradbury; RV64ID-LP64D-LABEL: float_to_bfloat:
6492912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
6592912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, -16
6692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
67eabaee0cSFangrui Song; RV64ID-LP64D-NEXT:    call __truncsfbf2
6892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
6992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lui a1, 1048560
7092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    or a0, a0, a1
7192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
7292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, 16
7492912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
75061e368fSAlex Bradbury  %1 = fptrunc float %a to bfloat
76061e368fSAlex Bradbury  ret bfloat %1
77061e368fSAlex Bradbury}
78061e368fSAlex Bradbury
79061e368fSAlex Bradburydefine bfloat @double_to_bfloat(double %a) nounwind {
80061e368fSAlex Bradbury; RV32I-ILP32-LABEL: double_to_bfloat:
81061e368fSAlex Bradbury; RV32I-ILP32:       # %bb.0:
82061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
83061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
84eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncdfbf2
85061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
86061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
87061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    ret
88061e368fSAlex Bradbury;
89061e368fSAlex Bradbury; RV64I-LP64-LABEL: double_to_bfloat:
90061e368fSAlex Bradbury; RV64I-LP64:       # %bb.0:
91061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
92061e368fSAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
93eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncdfbf2
94061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
95061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
96061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ret
9792912499SAlex Bradbury;
9892912499SAlex Bradbury; RV32ID-ILP32-LABEL: double_to_bfloat:
9992912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
10092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
10192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
102eabaee0cSFangrui Song; RV32ID-ILP32-NEXT:    call __truncdfbf2
10392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lui a1, 1048560
10492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    or a0, a0, a1
10592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
10692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
10792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
10892912499SAlex Bradbury;
10992912499SAlex Bradbury; RV64ID-LP64-LABEL: double_to_bfloat:
11092912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
11192912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, -16
11292912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
113eabaee0cSFangrui Song; RV64ID-LP64-NEXT:    call __truncdfbf2
11492912499SAlex Bradbury; RV64ID-LP64-NEXT:    lui a1, 1048560
11592912499SAlex Bradbury; RV64ID-LP64-NEXT:    or a0, a0, a1
11692912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
11792912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, 16
11892912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
11992912499SAlex Bradbury;
12092912499SAlex Bradbury; RV32ID-ILP32D-LABEL: double_to_bfloat:
12192912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
12292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, -16
12392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
124eabaee0cSFangrui Song; RV32ID-ILP32D-NEXT:    call __truncdfbf2
12592912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
12692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lui a1, 1048560
12792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    or a0, a0, a1
12892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
12992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, 16
13192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
13292912499SAlex Bradbury;
13392912499SAlex Bradbury; RV64ID-LP64D-LABEL: double_to_bfloat:
13492912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
13592912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, -16
13692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
137eabaee0cSFangrui Song; RV64ID-LP64D-NEXT:    call __truncdfbf2
13892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
13992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lui a1, 1048560
14092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    or a0, a0, a1
14192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
14292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
14392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, 16
14492912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
145061e368fSAlex Bradbury  %1 = fptrunc double %a to bfloat
146061e368fSAlex Bradbury  ret bfloat %1
147061e368fSAlex Bradbury}
148061e368fSAlex Bradbury
149061e368fSAlex Bradburydefine float @bfloat_to_float(bfloat %a) nounwind {
150061e368fSAlex Bradbury; RV32I-ILP32-LABEL: bfloat_to_float:
151061e368fSAlex Bradbury; RV32I-ILP32:       # %bb.0:
152061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a0, 16
153061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    ret
154061e368fSAlex Bradbury;
155061e368fSAlex Bradbury; RV64I-LP64-LABEL: bfloat_to_float:
156061e368fSAlex Bradbury; RV64I-LP64:       # %bb.0:
157061e368fSAlex Bradbury; RV64I-LP64-NEXT:    slliw a0, a0, 16
158061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ret
15992912499SAlex Bradbury;
16092912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_to_float:
16192912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
16292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a0, a0, 16
16392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
16492912499SAlex Bradbury;
16592912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_to_float:
16692912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
16792912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a0, a0, 16
16892912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
16992912499SAlex Bradbury;
17092912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_to_float:
17192912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
17292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
17392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a0, a0, 16
17492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
17592912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
17692912499SAlex Bradbury;
17792912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_to_float:
17892912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
17992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
18092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a0, a0, 16
18192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
18292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
183061e368fSAlex Bradbury  %1 = fpext bfloat %a to float
184061e368fSAlex Bradbury  ret float %1
185061e368fSAlex Bradbury}
186061e368fSAlex Bradbury
187061e368fSAlex Bradburydefine double @bfloat_to_double(bfloat %a) nounwind {
188061e368fSAlex Bradbury; RV32I-ILP32-LABEL: bfloat_to_double:
189061e368fSAlex Bradbury; RV32I-ILP32:       # %bb.0:
190061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
191061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
192061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a0, 16
193eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __extendsfdf2
194061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
195061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
196061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    ret
197061e368fSAlex Bradbury;
198061e368fSAlex Bradbury; RV64I-LP64-LABEL: bfloat_to_double:
199061e368fSAlex Bradbury; RV64I-LP64:       # %bb.0:
200061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
201061e368fSAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
202c4efcd69SAlex Bradbury; RV64I-LP64-NEXT:    slliw a0, a0, 16
203eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __extendsfdf2
204061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
205061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
206061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ret
20792912499SAlex Bradbury;
20892912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_to_double:
20992912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
21092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
21192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a0, a0, 16
21292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a0
21392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fcvt.d.s fa5, fa5
21492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fsd fa5, 8(sp)
21592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw a0, 8(sp)
21692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw a1, 12(sp)
21792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
21892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
21992912499SAlex Bradbury;
22092912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_to_double:
22192912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
22292912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a0, a0, 16
22392912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.w.x fa5, a0
22492912499SAlex Bradbury; RV64ID-LP64-NEXT:    fcvt.d.s fa5, fa5
22592912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.x.d a0, fa5
22692912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
22792912499SAlex Bradbury;
22892912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_to_double:
22992912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
23092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
23192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a0, a0, 16
23292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa5, a0
23392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fcvt.d.s fa0, fa5
23492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
23592912499SAlex Bradbury;
23692912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_to_double:
23792912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
23892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
23992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a0, a0, 16
24092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa5, a0
24192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fcvt.d.s fa0, fa5
24292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
243061e368fSAlex Bradbury  %1 = fpext bfloat %a to double
244061e368fSAlex Bradbury  ret double %1
245061e368fSAlex Bradbury}
246061e368fSAlex Bradbury
2479bb34ca6SAlex Bradburydefine bfloat @i16_to_bfloat(i16 %a) nounwind {
2489bb34ca6SAlex Bradbury; RV32I-ILP32-LABEL: i16_to_bfloat:
2499bb34ca6SAlex Bradbury; RV32I-ILP32:       # %bb.0:
2509bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    ret
2519bb34ca6SAlex Bradbury;
2529bb34ca6SAlex Bradbury; RV64I-LP64-LABEL: i16_to_bfloat:
2539bb34ca6SAlex Bradbury; RV64I-LP64:       # %bb.0:
2549bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ret
25592912499SAlex Bradbury;
25692912499SAlex Bradbury; RV32ID-ILP32-LABEL: i16_to_bfloat:
25792912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
25892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lui a1, 1048560
25992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    or a0, a0, a1
26092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
26192912499SAlex Bradbury;
26292912499SAlex Bradbury; RV64ID-LP64-LABEL: i16_to_bfloat:
26392912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
26492912499SAlex Bradbury; RV64ID-LP64-NEXT:    lui a1, 1048560
26592912499SAlex Bradbury; RV64ID-LP64-NEXT:    or a0, a0, a1
26692912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
26792912499SAlex Bradbury;
26892912499SAlex Bradbury; RV32ID-ILP32D-LABEL: i16_to_bfloat:
26992912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
27092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lui a1, 1048560
27192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    or a0, a0, a1
27292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
27392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
27492912499SAlex Bradbury;
27592912499SAlex Bradbury; RV64ID-LP64D-LABEL: i16_to_bfloat:
27692912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
27792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lui a1, 1048560
27892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    or a0, a0, a1
27992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
28092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
2819bb34ca6SAlex Bradbury  %1 = bitcast i16 %a to bfloat
2829bb34ca6SAlex Bradbury  ret bfloat %1
2839bb34ca6SAlex Bradbury}
2849bb34ca6SAlex Bradbury
2859bb34ca6SAlex Bradburydefine i16 @bfloat_to_i16(bfloat %a) nounwind {
2869bb34ca6SAlex Bradbury; RV32I-ILP32-LABEL: bfloat_to_i16:
2879bb34ca6SAlex Bradbury; RV32I-ILP32:       # %bb.0:
2889bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    ret
2899bb34ca6SAlex Bradbury;
2909bb34ca6SAlex Bradbury; RV64I-LP64-LABEL: bfloat_to_i16:
2919bb34ca6SAlex Bradbury; RV64I-LP64:       # %bb.0:
2929bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ret
29392912499SAlex Bradbury;
29492912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_to_i16:
29592912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
29692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
29792912499SAlex Bradbury;
29892912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_to_i16:
29992912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
30092912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
30192912499SAlex Bradbury;
30292912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_to_i16:
30392912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
30492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
30592912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
30692912499SAlex Bradbury;
30792912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_to_i16:
30892912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
30992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
31092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
3119bb34ca6SAlex Bradbury  %1 = bitcast bfloat %a to i16
3129bb34ca6SAlex Bradbury  ret i16 %1
3139bb34ca6SAlex Bradbury}
3149bb34ca6SAlex Bradbury
315061e368fSAlex Bradburydefine bfloat @bfloat_add(bfloat %a, bfloat %b) nounwind {
316061e368fSAlex Bradbury; RV32I-ILP32-LABEL: bfloat_add:
317061e368fSAlex Bradbury; RV32I-ILP32:       # %bb.0:
318061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
319061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
320061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a0, 16
321061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    slli a1, a1, 16
322eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __addsf3
323eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncsfbf2
324061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
325061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
326061e368fSAlex Bradbury; RV32I-ILP32-NEXT:    ret
327061e368fSAlex Bradbury;
328061e368fSAlex Bradbury; RV64I-LP64-LABEL: bfloat_add:
329061e368fSAlex Bradbury; RV64I-LP64:       # %bb.0:
330061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
331061e368fSAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
332061e368fSAlex Bradbury; RV64I-LP64-NEXT:    slliw a0, a0, 16
333061e368fSAlex Bradbury; RV64I-LP64-NEXT:    slliw a1, a1, 16
334eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __addsf3
335eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncsfbf2
336061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
337061e368fSAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
338061e368fSAlex Bradbury; RV64I-LP64-NEXT:    ret
33992912499SAlex Bradbury;
34092912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_add:
34192912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
34292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
34392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
34492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a1, a1, 16
34592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a0, a0, 16
346*9122c523SPengcheng Wang; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a1
34792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
34892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fadd.s fa5, fa4, fa5
34992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
350eabaee0cSFangrui Song; RV32ID-ILP32-NEXT:    call __truncsfbf2
35192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lui a1, 1048560
35292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    or a0, a0, a1
35392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
35492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
35592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
35692912499SAlex Bradbury;
35792912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_add:
35892912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
35992912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, -16
36092912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
36192912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a1, a1, 16
36292912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a0, a0, 16
363*9122c523SPengcheng Wang; RV64ID-LP64-NEXT:    fmv.w.x fa5, a1
36492912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
36592912499SAlex Bradbury; RV64ID-LP64-NEXT:    fadd.s fa5, fa4, fa5
36692912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
367eabaee0cSFangrui Song; RV64ID-LP64-NEXT:    call __truncsfbf2
36892912499SAlex Bradbury; RV64ID-LP64-NEXT:    lui a1, 1048560
36992912499SAlex Bradbury; RV64ID-LP64-NEXT:    or a0, a0, a1
37092912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
37192912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, 16
37292912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
37392912499SAlex Bradbury;
37492912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_add:
37592912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
37692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, -16
37792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
37892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
37992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a1, fa1
38092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a1, a1, 16
38192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a0, a0, 16
382*9122c523SPengcheng Wang; RV32ID-ILP32D-NEXT:    fmv.w.x fa5, a1
38392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa4, a0
38492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fadd.s fa0, fa4, fa5
385eabaee0cSFangrui Song; RV32ID-ILP32D-NEXT:    call __truncsfbf2
38692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
38792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lui a1, 1048560
38892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    or a0, a0, a1
38992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
39092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
39192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, 16
39292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
39392912499SAlex Bradbury;
39492912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_add:
39592912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
39692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, -16
39792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
39892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
3999f6bf00bSShao-Ce SUN; RV64ID-LP64D-NEXT:    fmv.x.w a1, fa1
40092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a1, a1, 16
40192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a0, a0, 16
402*9122c523SPengcheng Wang; RV64ID-LP64D-NEXT:    fmv.w.x fa5, a1
40392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa4, a0
40492912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fadd.s fa0, fa4, fa5
405eabaee0cSFangrui Song; RV64ID-LP64D-NEXT:    call __truncsfbf2
40692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
40792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lui a1, 1048560
40892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    or a0, a0, a1
40992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
41092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
41192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, 16
41292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
413061e368fSAlex Bradbury  %1 = fadd bfloat %a, %b
414061e368fSAlex Bradbury  ret bfloat %1
415061e368fSAlex Bradbury}
4169bb34ca6SAlex Bradbury
4179bb34ca6SAlex Bradburydefine bfloat @bfloat_load(ptr %a) nounwind {
4189bb34ca6SAlex Bradbury; RV32I-ILP32-LABEL: bfloat_load:
4199bb34ca6SAlex Bradbury; RV32I-ILP32:       # %bb.0:
4209bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
4219bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
4229bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    lh a1, 0(a0)
4239bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    lh a2, 6(a0)
4249bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a1, 16
4259bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    slli a1, a2, 16
426eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __addsf3
427eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncsfbf2
4289bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
4299bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
4309bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    ret
4319bb34ca6SAlex Bradbury;
4329bb34ca6SAlex Bradbury; RV64I-LP64-LABEL: bfloat_load:
4339bb34ca6SAlex Bradbury; RV64I-LP64:       # %bb.0:
4349bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
4359bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
4369bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    lh a1, 0(a0)
4379bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    lh a2, 6(a0)
4389bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    slliw a0, a1, 16
4399bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    slliw a1, a2, 16
440eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __addsf3
441eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncsfbf2
4429bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4439bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
4449bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ret
44592912499SAlex Bradbury;
44692912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_load:
44792912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
44892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
44992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
45092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lhu a1, 6(a0)
45192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lhu a0, 0(a0)
45292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a1, a1, 16
45392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a0, a0, 16
454*9122c523SPengcheng Wang; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a1
45592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a0
45692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fadd.s fa5, fa4, fa5
45792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
458eabaee0cSFangrui Song; RV32ID-ILP32-NEXT:    call __truncsfbf2
45992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lui a1, 1048560
46092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    or a0, a0, a1
46192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
46292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
46392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
46492912499SAlex Bradbury;
46592912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_load:
46692912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
46792912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, -16
46892912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
46992912499SAlex Bradbury; RV64ID-LP64-NEXT:    lhu a1, 6(a0)
47092912499SAlex Bradbury; RV64ID-LP64-NEXT:    lhu a0, 0(a0)
47192912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a1, a1, 16
47292912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a0, a0, 16
473*9122c523SPengcheng Wang; RV64ID-LP64-NEXT:    fmv.w.x fa5, a1
47492912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.w.x fa4, a0
47592912499SAlex Bradbury; RV64ID-LP64-NEXT:    fadd.s fa5, fa4, fa5
47692912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
477eabaee0cSFangrui Song; RV64ID-LP64-NEXT:    call __truncsfbf2
47892912499SAlex Bradbury; RV64ID-LP64-NEXT:    lui a1, 1048560
47992912499SAlex Bradbury; RV64ID-LP64-NEXT:    or a0, a0, a1
48092912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
48192912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, 16
48292912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
48392912499SAlex Bradbury;
48492912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_load:
48592912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
48692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, -16
48792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
48892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lhu a1, 6(a0)
48992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lhu a0, 0(a0)
49092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a1, a1, 16
49192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a0, a0, 16
492*9122c523SPengcheng Wang; RV32ID-ILP32D-NEXT:    fmv.w.x fa5, a1
49392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa4, a0
49492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fadd.s fa0, fa4, fa5
495eabaee0cSFangrui Song; RV32ID-ILP32D-NEXT:    call __truncsfbf2
49692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
49792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lui a1, 1048560
49892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    or a0, a0, a1
49992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa0, a0
50092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
50192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, 16
50292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
50392912499SAlex Bradbury;
50492912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_load:
50592912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
50692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, -16
50792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
50892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lhu a1, 6(a0)
50992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lhu a0, 0(a0)
51092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a1, a1, 16
51192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a0, a0, 16
512*9122c523SPengcheng Wang; RV64ID-LP64D-NEXT:    fmv.w.x fa5, a1
51392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa4, a0
51492912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fadd.s fa0, fa4, fa5
515eabaee0cSFangrui Song; RV64ID-LP64D-NEXT:    call __truncsfbf2
51692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
51792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    lui a1, 1048560
51892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    or a0, a0, a1
51992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa0, a0
52092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
52192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, 16
52292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
5239bb34ca6SAlex Bradbury  %1 = load bfloat, ptr %a
5249bb34ca6SAlex Bradbury  %2 = getelementptr bfloat, ptr %a, i32 3
5259bb34ca6SAlex Bradbury  %3 = load bfloat, ptr %2
5269bb34ca6SAlex Bradbury  %4 = fadd bfloat %1, %3
5279bb34ca6SAlex Bradbury  ret bfloat %4
5289bb34ca6SAlex Bradbury}
5299bb34ca6SAlex Bradbury
5309bb34ca6SAlex Bradburydefine void @bfloat_store(ptr %a, bfloat %b, bfloat %c) nounwind {
5319bb34ca6SAlex Bradbury; RV32I-ILP32-LABEL: bfloat_store:
5329bb34ca6SAlex Bradbury; RV32I-ILP32:       # %bb.0:
5339bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, -16
5349bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
5359bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
5369bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    mv s0, a0
5379bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    slli a0, a1, 16
5389bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    slli a1, a2, 16
539eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __addsf3
540eabaee0cSFangrui Song; RV32I-ILP32-NEXT:    call __truncsfbf2
5419bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    sh a0, 0(s0)
5429bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    sh a0, 16(s0)
5439bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
5449bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
5459bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    addi sp, sp, 16
5469bb34ca6SAlex Bradbury; RV32I-ILP32-NEXT:    ret
5479bb34ca6SAlex Bradbury;
5489bb34ca6SAlex Bradbury; RV64I-LP64-LABEL: bfloat_store:
5499bb34ca6SAlex Bradbury; RV64I-LP64:       # %bb.0:
5509bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, -16
5519bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
5529bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
5539bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    mv s0, a0
5549bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    slliw a0, a1, 16
5559bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    slliw a1, a2, 16
556eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __addsf3
557eabaee0cSFangrui Song; RV64I-LP64-NEXT:    call __truncsfbf2
5589bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    sh a0, 0(s0)
5599bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    sh a0, 16(s0)
5609bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
5619bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
5629bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    addi sp, sp, 16
5639bb34ca6SAlex Bradbury; RV64I-LP64-NEXT:    ret
56492912499SAlex Bradbury;
56592912499SAlex Bradbury; RV32ID-ILP32-LABEL: bfloat_store:
56692912499SAlex Bradbury; RV32ID-ILP32:       # %bb.0:
56792912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, -16
56892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
56992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
57092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    mv s0, a0
57192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a2, a2, 16
57292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    slli a1, a1, 16
573*9122c523SPengcheng Wang; RV32ID-ILP32-NEXT:    fmv.w.x fa5, a2
57492912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.w.x fa4, a1
57592912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fadd.s fa5, fa4, fa5
57692912499SAlex Bradbury; RV32ID-ILP32-NEXT:    fmv.x.w a0, fa5
577eabaee0cSFangrui Song; RV32ID-ILP32-NEXT:    call __truncsfbf2
57892912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sh a0, 0(s0)
57992912499SAlex Bradbury; RV32ID-ILP32-NEXT:    sh a0, 16(s0)
58092912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
58192912499SAlex Bradbury; RV32ID-ILP32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
58292912499SAlex Bradbury; RV32ID-ILP32-NEXT:    addi sp, sp, 16
58392912499SAlex Bradbury; RV32ID-ILP32-NEXT:    ret
58492912499SAlex Bradbury;
58592912499SAlex Bradbury; RV64ID-LP64-LABEL: bfloat_store:
58692912499SAlex Bradbury; RV64ID-LP64:       # %bb.0:
58792912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, -16
58892912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
58992912499SAlex Bradbury; RV64ID-LP64-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
59092912499SAlex Bradbury; RV64ID-LP64-NEXT:    mv s0, a0
5919f6bf00bSShao-Ce SUN; RV64ID-LP64-NEXT:    slli a2, a2, 16
59292912499SAlex Bradbury; RV64ID-LP64-NEXT:    slli a1, a1, 16
593*9122c523SPengcheng Wang; RV64ID-LP64-NEXT:    fmv.w.x fa5, a2
59492912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.w.x fa4, a1
59592912499SAlex Bradbury; RV64ID-LP64-NEXT:    fadd.s fa5, fa4, fa5
59692912499SAlex Bradbury; RV64ID-LP64-NEXT:    fmv.x.w a0, fa5
597eabaee0cSFangrui Song; RV64ID-LP64-NEXT:    call __truncsfbf2
59892912499SAlex Bradbury; RV64ID-LP64-NEXT:    sh a0, 0(s0)
59992912499SAlex Bradbury; RV64ID-LP64-NEXT:    sh a0, 16(s0)
60092912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
60192912499SAlex Bradbury; RV64ID-LP64-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
60292912499SAlex Bradbury; RV64ID-LP64-NEXT:    addi sp, sp, 16
60392912499SAlex Bradbury; RV64ID-LP64-NEXT:    ret
60492912499SAlex Bradbury;
60592912499SAlex Bradbury; RV32ID-ILP32D-LABEL: bfloat_store:
60692912499SAlex Bradbury; RV32ID-ILP32D:       # %bb.0:
60792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, -16
60892912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
60992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
61092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    mv s0, a0
61192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
61292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a1, fa1
61392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a1, a1, 16
61492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    slli a0, a0, 16
615*9122c523SPengcheng Wang; RV32ID-ILP32D-NEXT:    fmv.w.x fa5, a1
61692912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.w.x fa4, a0
61792912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fadd.s fa0, fa4, fa5
618eabaee0cSFangrui Song; RV32ID-ILP32D-NEXT:    call __truncsfbf2
61992912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    fmv.x.w a0, fa0
62092912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sh a0, 0(s0)
62192912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    sh a0, 16(s0)
62292912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
62392912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
62492912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    addi sp, sp, 16
62592912499SAlex Bradbury; RV32ID-ILP32D-NEXT:    ret
62692912499SAlex Bradbury;
62792912499SAlex Bradbury; RV64ID-LP64D-LABEL: bfloat_store:
62892912499SAlex Bradbury; RV64ID-LP64D:       # %bb.0:
62992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, -16
63092912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
63192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
63292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    mv s0, a0
63392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
6349f6bf00bSShao-Ce SUN; RV64ID-LP64D-NEXT:    fmv.x.w a1, fa1
63592912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a1, a1, 16
63692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    slli a0, a0, 16
637*9122c523SPengcheng Wang; RV64ID-LP64D-NEXT:    fmv.w.x fa5, a1
63892912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.w.x fa4, a0
63992912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fadd.s fa0, fa4, fa5
640eabaee0cSFangrui Song; RV64ID-LP64D-NEXT:    call __truncsfbf2
64192912499SAlex Bradbury; RV64ID-LP64D-NEXT:    fmv.x.w a0, fa0
64292912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sh a0, 0(s0)
64392912499SAlex Bradbury; RV64ID-LP64D-NEXT:    sh a0, 16(s0)
64492912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
64592912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
64692912499SAlex Bradbury; RV64ID-LP64D-NEXT:    addi sp, sp, 16
64792912499SAlex Bradbury; RV64ID-LP64D-NEXT:    ret
6489bb34ca6SAlex Bradbury  %1 = fadd bfloat %b, %c
6499bb34ca6SAlex Bradbury  store bfloat %1, ptr %a
6509bb34ca6SAlex Bradbury  %2 = getelementptr bfloat, ptr %a, i32 8
6519bb34ca6SAlex Bradbury  store bfloat %1, ptr %2
6529bb34ca6SAlex Bradbury  ret void
6539bb34ca6SAlex Bradbury}
654