1049 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2;; For `double` parameters and return values, compiling on loongarch32 with `-mattr=+d` and3;; `-target-abi=ilp32s` is incompatible, resulting in the error 'Passing f64 with GPR on LA32 is undefined'.4;; Therefore, such case is currently skipped in testing.5; RUN: llc -mtriple=loongarch32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA326; RUN: llc -mtriple=loongarch64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA647; RUN: llc -mtriple=loongarch32 -mattr=+f -target-abi=ilp32s -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA32F-ILP32S8; RUN: llc -mtriple=loongarch32 -mattr=+f -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA32F-ILP32D9; RUN: llc -mtriple=loongarch32 -mattr=+d -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA32D-ILP32D10; RUN: llc -mtriple=loongarch64 -mattr=+f -target-abi=lp64s -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA64F-LP64S11; RUN: llc -mtriple=loongarch64 -mattr=+f -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA64F-LP64D12; RUN: llc -mtriple=loongarch64 -mattr=+d -target-abi=lp64s -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA64D-LP64S13; RUN: llc -mtriple=loongarch64 -mattr=+d -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s -check-prefix=LA64D-LP64D14 15define bfloat @float_to_bfloat(float %a) nounwind {16; LA32-LABEL: float_to_bfloat:17; LA32: # %bb.0:18; LA32-NEXT: addi.w $sp, $sp, -1619; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill20; LA32-NEXT: bl __truncsfbf221; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload22; LA32-NEXT: addi.w $sp, $sp, 1623; LA32-NEXT: ret24;25; LA64-LABEL: float_to_bfloat:26; LA64: # %bb.0:27; LA64-NEXT: addi.d $sp, $sp, -1628; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill29; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)30; LA64-NEXT: jirl $ra, $ra, 031; LA64-NEXT: movfr2gr.s $a0, $fa032; LA64-NEXT: lu12i.w $a1, -1633; LA64-NEXT: or $a0, $a0, $a134; LA64-NEXT: movgr2fr.w $fa0, $a035; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload36; LA64-NEXT: addi.d $sp, $sp, 1637; LA64-NEXT: ret38;39; LA32F-ILP32S-LABEL: float_to_bfloat:40; LA32F-ILP32S: # %bb.0:41; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -1642; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill43; LA32F-ILP32S-NEXT: bl __truncsfbf244; LA32F-ILP32S-NEXT: lu12i.w $a1, -1645; LA32F-ILP32S-NEXT: or $a0, $a0, $a146; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload47; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 1648; LA32F-ILP32S-NEXT: ret49;50; LA32F-ILP32D-LABEL: float_to_bfloat:51; LA32F-ILP32D: # %bb.0:52; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -1653; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill54; LA32F-ILP32D-NEXT: bl __truncsfbf255; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa056; LA32F-ILP32D-NEXT: lu12i.w $a1, -1657; LA32F-ILP32D-NEXT: or $a0, $a0, $a158; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a059; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload60; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 1661; LA32F-ILP32D-NEXT: ret62;63; LA32D-ILP32D-LABEL: float_to_bfloat:64; LA32D-ILP32D: # %bb.0:65; LA32D-ILP32D-NEXT: addi.w $sp, $sp, -1666; LA32D-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill67; LA32D-ILP32D-NEXT: bl __truncsfbf268; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa069; LA32D-ILP32D-NEXT: lu12i.w $a1, -1670; LA32D-ILP32D-NEXT: or $a0, $a0, $a171; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a072; LA32D-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload73; LA32D-ILP32D-NEXT: addi.w $sp, $sp, 1674; LA32D-ILP32D-NEXT: ret75;76; LA64F-LP64S-LABEL: float_to_bfloat:77; LA64F-LP64S: # %bb.0:78; LA64F-LP64S-NEXT: addi.d $sp, $sp, -1679; LA64F-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill80; LA64F-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)81; LA64F-LP64S-NEXT: jirl $ra, $ra, 082; LA64F-LP64S-NEXT: lu12i.w $a1, -1683; LA64F-LP64S-NEXT: or $a0, $a0, $a184; LA64F-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload85; LA64F-LP64S-NEXT: addi.d $sp, $sp, 1686; LA64F-LP64S-NEXT: ret87;88; LA64F-LP64D-LABEL: float_to_bfloat:89; LA64F-LP64D: # %bb.0:90; LA64F-LP64D-NEXT: addi.d $sp, $sp, -1691; LA64F-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill92; LA64F-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)93; LA64F-LP64D-NEXT: jirl $ra, $ra, 094; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa095; LA64F-LP64D-NEXT: lu12i.w $a1, -1696; LA64F-LP64D-NEXT: or $a0, $a0, $a197; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a098; LA64F-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload99; LA64F-LP64D-NEXT: addi.d $sp, $sp, 16100; LA64F-LP64D-NEXT: ret101;102; LA64D-LP64S-LABEL: float_to_bfloat:103; LA64D-LP64S: # %bb.0:104; LA64D-LP64S-NEXT: addi.d $sp, $sp, -16105; LA64D-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill106; LA64D-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)107; LA64D-LP64S-NEXT: jirl $ra, $ra, 0108; LA64D-LP64S-NEXT: lu12i.w $a1, -16109; LA64D-LP64S-NEXT: or $a0, $a0, $a1110; LA64D-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload111; LA64D-LP64S-NEXT: addi.d $sp, $sp, 16112; LA64D-LP64S-NEXT: ret113;114; LA64D-LP64D-LABEL: float_to_bfloat:115; LA64D-LP64D: # %bb.0:116; LA64D-LP64D-NEXT: addi.d $sp, $sp, -16117; LA64D-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill118; LA64D-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)119; LA64D-LP64D-NEXT: jirl $ra, $ra, 0120; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0121; LA64D-LP64D-NEXT: lu12i.w $a1, -16122; LA64D-LP64D-NEXT: or $a0, $a0, $a1123; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0124; LA64D-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload125; LA64D-LP64D-NEXT: addi.d $sp, $sp, 16126; LA64D-LP64D-NEXT: ret127 %1 = fptrunc float %a to bfloat128 ret bfloat %1129}130 131define bfloat @double_to_bfloat(double %a) nounwind {132; LA32-LABEL: double_to_bfloat:133; LA32: # %bb.0:134; LA32-NEXT: addi.w $sp, $sp, -16135; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill136; LA32-NEXT: bl __truncdfbf2137; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload138; LA32-NEXT: addi.w $sp, $sp, 16139; LA32-NEXT: ret140;141; LA64-LABEL: double_to_bfloat:142; LA64: # %bb.0:143; LA64-NEXT: addi.d $sp, $sp, -16144; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill145; LA64-NEXT: pcaddu18i $ra, %call36(__truncdfbf2)146; LA64-NEXT: jirl $ra, $ra, 0147; LA64-NEXT: movfr2gr.s $a0, $fa0148; LA64-NEXT: lu12i.w $a1, -16149; LA64-NEXT: or $a0, $a0, $a1150; LA64-NEXT: movgr2fr.w $fa0, $a0151; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload152; LA64-NEXT: addi.d $sp, $sp, 16153; LA64-NEXT: ret154;155; LA32F-ILP32S-LABEL: double_to_bfloat:156; LA32F-ILP32S: # %bb.0:157; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -16158; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill159; LA32F-ILP32S-NEXT: bl __truncdfbf2160; LA32F-ILP32S-NEXT: lu12i.w $a1, -16161; LA32F-ILP32S-NEXT: or $a0, $a0, $a1162; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload163; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 16164; LA32F-ILP32S-NEXT: ret165;166; LA32F-ILP32D-LABEL: double_to_bfloat:167; LA32F-ILP32D: # %bb.0:168; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -16169; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill170; LA32F-ILP32D-NEXT: bl __truncdfbf2171; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0172; LA32F-ILP32D-NEXT: lu12i.w $a1, -16173; LA32F-ILP32D-NEXT: or $a0, $a0, $a1174; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0175; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload176; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 16177; LA32F-ILP32D-NEXT: ret178;179; LA32D-ILP32D-LABEL: double_to_bfloat:180; LA32D-ILP32D: # %bb.0:181; LA32D-ILP32D-NEXT: addi.w $sp, $sp, -16182; LA32D-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill183; LA32D-ILP32D-NEXT: bl __truncdfbf2184; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0185; LA32D-ILP32D-NEXT: lu12i.w $a1, -16186; LA32D-ILP32D-NEXT: or $a0, $a0, $a1187; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0188; LA32D-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload189; LA32D-ILP32D-NEXT: addi.w $sp, $sp, 16190; LA32D-ILP32D-NEXT: ret191;192; LA64F-LP64S-LABEL: double_to_bfloat:193; LA64F-LP64S: # %bb.0:194; LA64F-LP64S-NEXT: addi.d $sp, $sp, -16195; LA64F-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill196; LA64F-LP64S-NEXT: pcaddu18i $ra, %call36(__truncdfbf2)197; LA64F-LP64S-NEXT: jirl $ra, $ra, 0198; LA64F-LP64S-NEXT: lu12i.w $a1, -16199; LA64F-LP64S-NEXT: or $a0, $a0, $a1200; LA64F-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload201; LA64F-LP64S-NEXT: addi.d $sp, $sp, 16202; LA64F-LP64S-NEXT: ret203;204; LA64F-LP64D-LABEL: double_to_bfloat:205; LA64F-LP64D: # %bb.0:206; LA64F-LP64D-NEXT: addi.d $sp, $sp, -16207; LA64F-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill208; LA64F-LP64D-NEXT: pcaddu18i $ra, %call36(__truncdfbf2)209; LA64F-LP64D-NEXT: jirl $ra, $ra, 0210; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0211; LA64F-LP64D-NEXT: lu12i.w $a1, -16212; LA64F-LP64D-NEXT: or $a0, $a0, $a1213; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0214; LA64F-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload215; LA64F-LP64D-NEXT: addi.d $sp, $sp, 16216; LA64F-LP64D-NEXT: ret217;218; LA64D-LP64S-LABEL: double_to_bfloat:219; LA64D-LP64S: # %bb.0:220; LA64D-LP64S-NEXT: addi.d $sp, $sp, -16221; LA64D-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill222; LA64D-LP64S-NEXT: pcaddu18i $ra, %call36(__truncdfbf2)223; LA64D-LP64S-NEXT: jirl $ra, $ra, 0224; LA64D-LP64S-NEXT: lu12i.w $a1, -16225; LA64D-LP64S-NEXT: or $a0, $a0, $a1226; LA64D-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload227; LA64D-LP64S-NEXT: addi.d $sp, $sp, 16228; LA64D-LP64S-NEXT: ret229;230; LA64D-LP64D-LABEL: double_to_bfloat:231; LA64D-LP64D: # %bb.0:232; LA64D-LP64D-NEXT: addi.d $sp, $sp, -16233; LA64D-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill234; LA64D-LP64D-NEXT: pcaddu18i $ra, %call36(__truncdfbf2)235; LA64D-LP64D-NEXT: jirl $ra, $ra, 0236; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0237; LA64D-LP64D-NEXT: lu12i.w $a1, -16238; LA64D-LP64D-NEXT: or $a0, $a0, $a1239; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0240; LA64D-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload241; LA64D-LP64D-NEXT: addi.d $sp, $sp, 16242; LA64D-LP64D-NEXT: ret243 %1 = fptrunc double %a to bfloat244 ret bfloat %1245}246 247define float @bfloat_to_float(bfloat %a) nounwind {248; LA32-LABEL: bfloat_to_float:249; LA32: # %bb.0:250; LA32-NEXT: slli.w $a0, $a0, 16251; LA32-NEXT: ret252;253; LA64-LABEL: bfloat_to_float:254; LA64: # %bb.0:255; LA64-NEXT: movfr2gr.s $a0, $fa0256; LA64-NEXT: slli.d $a0, $a0, 16257; LA64-NEXT: movgr2fr.w $fa0, $a0258; LA64-NEXT: ret259;260; LA32F-ILP32S-LABEL: bfloat_to_float:261; LA32F-ILP32S: # %bb.0:262; LA32F-ILP32S-NEXT: slli.w $a0, $a0, 16263; LA32F-ILP32S-NEXT: ret264;265; LA32F-ILP32D-LABEL: bfloat_to_float:266; LA32F-ILP32D: # %bb.0:267; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0268; LA32F-ILP32D-NEXT: slli.w $a0, $a0, 16269; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0270; LA32F-ILP32D-NEXT: ret271;272; LA32D-ILP32D-LABEL: bfloat_to_float:273; LA32D-ILP32D: # %bb.0:274; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0275; LA32D-ILP32D-NEXT: slli.w $a0, $a0, 16276; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0277; LA32D-ILP32D-NEXT: ret278;279; LA64F-LP64S-LABEL: bfloat_to_float:280; LA64F-LP64S: # %bb.0:281; LA64F-LP64S-NEXT: slli.d $a0, $a0, 16282; LA64F-LP64S-NEXT: ret283;284; LA64F-LP64D-LABEL: bfloat_to_float:285; LA64F-LP64D: # %bb.0:286; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0287; LA64F-LP64D-NEXT: slli.d $a0, $a0, 16288; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0289; LA64F-LP64D-NEXT: ret290;291; LA64D-LP64S-LABEL: bfloat_to_float:292; LA64D-LP64S: # %bb.0:293; LA64D-LP64S-NEXT: slli.d $a0, $a0, 16294; LA64D-LP64S-NEXT: ret295;296; LA64D-LP64D-LABEL: bfloat_to_float:297; LA64D-LP64D: # %bb.0:298; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0299; LA64D-LP64D-NEXT: slli.d $a0, $a0, 16300; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0301; LA64D-LP64D-NEXT: ret302 %1 = fpext bfloat %a to float303 ret float %1304}305 306define double @bfloat_to_double(bfloat %a) nounwind {307; LA32-LABEL: bfloat_to_double:308; LA32: # %bb.0:309; LA32-NEXT: addi.w $sp, $sp, -16310; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill311; LA32-NEXT: slli.w $a0, $a0, 16312; LA32-NEXT: bl __extendsfdf2313; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload314; LA32-NEXT: addi.w $sp, $sp, 16315; LA32-NEXT: ret316;317; LA64-LABEL: bfloat_to_double:318; LA64: # %bb.0:319; LA64-NEXT: movfr2gr.s $a0, $fa0320; LA64-NEXT: slli.d $a0, $a0, 16321; LA64-NEXT: movgr2fr.w $fa0, $a0322; LA64-NEXT: fcvt.d.s $fa0, $fa0323; LA64-NEXT: ret324;325; LA32F-ILP32S-LABEL: bfloat_to_double:326; LA32F-ILP32S: # %bb.0:327; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -16328; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill329; LA32F-ILP32S-NEXT: slli.w $a0, $a0, 16330; LA32F-ILP32S-NEXT: bl __extendsfdf2331; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload332; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 16333; LA32F-ILP32S-NEXT: ret334;335; LA32F-ILP32D-LABEL: bfloat_to_double:336; LA32F-ILP32D: # %bb.0:337; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -16338; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill339; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0340; LA32F-ILP32D-NEXT: slli.w $a0, $a0, 16341; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0342; LA32F-ILP32D-NEXT: bl __extendsfdf2343; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload344; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 16345; LA32F-ILP32D-NEXT: ret346;347; LA32D-ILP32D-LABEL: bfloat_to_double:348; LA32D-ILP32D: # %bb.0:349; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0350; LA32D-ILP32D-NEXT: slli.w $a0, $a0, 16351; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0352; LA32D-ILP32D-NEXT: fcvt.d.s $fa0, $fa0353; LA32D-ILP32D-NEXT: ret354;355; LA64F-LP64S-LABEL: bfloat_to_double:356; LA64F-LP64S: # %bb.0:357; LA64F-LP64S-NEXT: slli.d $a0, $a0, 16358; LA64F-LP64S-NEXT: movgr2fr.w $fa0, $a0359; LA64F-LP64S-NEXT: fcvt.d.s $fa0, $fa0360; LA64F-LP64S-NEXT: movfr2gr.d $a0, $fa0361; LA64F-LP64S-NEXT: ret362;363; LA64F-LP64D-LABEL: bfloat_to_double:364; LA64F-LP64D: # %bb.0:365; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0366; LA64F-LP64D-NEXT: slli.d $a0, $a0, 16367; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0368; LA64F-LP64D-NEXT: fcvt.d.s $fa0, $fa0369; LA64F-LP64D-NEXT: ret370;371; LA64D-LP64S-LABEL: bfloat_to_double:372; LA64D-LP64S: # %bb.0:373; LA64D-LP64S-NEXT: slli.d $a0, $a0, 16374; LA64D-LP64S-NEXT: movgr2fr.w $fa0, $a0375; LA64D-LP64S-NEXT: fcvt.d.s $fa0, $fa0376; LA64D-LP64S-NEXT: movfr2gr.d $a0, $fa0377; LA64D-LP64S-NEXT: ret378;379; LA64D-LP64D-LABEL: bfloat_to_double:380; LA64D-LP64D: # %bb.0:381; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0382; LA64D-LP64D-NEXT: slli.d $a0, $a0, 16383; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0384; LA64D-LP64D-NEXT: fcvt.d.s $fa0, $fa0385; LA64D-LP64D-NEXT: ret386 %1 = fpext bfloat %a to double387 ret double %1388}389 390define bfloat @i16_to_bfloat(i16 %a) nounwind {391; LA32-LABEL: i16_to_bfloat:392; LA32: # %bb.0:393; LA32-NEXT: ret394;395; LA64-LABEL: i16_to_bfloat:396; LA64: # %bb.0:397; LA64-NEXT: lu12i.w $a1, -16398; LA64-NEXT: or $a0, $a0, $a1399; LA64-NEXT: movgr2fr.w $fa0, $a0400; LA64-NEXT: ret401;402; LA32F-ILP32S-LABEL: i16_to_bfloat:403; LA32F-ILP32S: # %bb.0:404; LA32F-ILP32S-NEXT: lu12i.w $a1, -16405; LA32F-ILP32S-NEXT: or $a0, $a0, $a1406; LA32F-ILP32S-NEXT: ret407;408; LA32F-ILP32D-LABEL: i16_to_bfloat:409; LA32F-ILP32D: # %bb.0:410; LA32F-ILP32D-NEXT: lu12i.w $a1, -16411; LA32F-ILP32D-NEXT: or $a0, $a0, $a1412; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0413; LA32F-ILP32D-NEXT: ret414;415; LA32D-ILP32D-LABEL: i16_to_bfloat:416; LA32D-ILP32D: # %bb.0:417; LA32D-ILP32D-NEXT: lu12i.w $a1, -16418; LA32D-ILP32D-NEXT: or $a0, $a0, $a1419; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0420; LA32D-ILP32D-NEXT: ret421;422; LA64F-LP64S-LABEL: i16_to_bfloat:423; LA64F-LP64S: # %bb.0:424; LA64F-LP64S-NEXT: lu12i.w $a1, -16425; LA64F-LP64S-NEXT: or $a0, $a0, $a1426; LA64F-LP64S-NEXT: ret427;428; LA64F-LP64D-LABEL: i16_to_bfloat:429; LA64F-LP64D: # %bb.0:430; LA64F-LP64D-NEXT: lu12i.w $a1, -16431; LA64F-LP64D-NEXT: or $a0, $a0, $a1432; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0433; LA64F-LP64D-NEXT: ret434;435; LA64D-LP64S-LABEL: i16_to_bfloat:436; LA64D-LP64S: # %bb.0:437; LA64D-LP64S-NEXT: lu12i.w $a1, -16438; LA64D-LP64S-NEXT: or $a0, $a0, $a1439; LA64D-LP64S-NEXT: ret440;441; LA64D-LP64D-LABEL: i16_to_bfloat:442; LA64D-LP64D: # %bb.0:443; LA64D-LP64D-NEXT: lu12i.w $a1, -16444; LA64D-LP64D-NEXT: or $a0, $a0, $a1445; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0446; LA64D-LP64D-NEXT: ret447 %1 = bitcast i16 %a to bfloat448 ret bfloat %1449}450 451define i16 @bfloat_to_i16(bfloat %a) nounwind {452; LA32-LABEL: bfloat_to_i16:453; LA32: # %bb.0:454; LA32-NEXT: ret455;456; LA64-LABEL: bfloat_to_i16:457; LA64: # %bb.0:458; LA64-NEXT: movfr2gr.s $a0, $fa0459; LA64-NEXT: ret460;461; LA32F-ILP32S-LABEL: bfloat_to_i16:462; LA32F-ILP32S: # %bb.0:463; LA32F-ILP32S-NEXT: ret464;465; LA32F-ILP32D-LABEL: bfloat_to_i16:466; LA32F-ILP32D: # %bb.0:467; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0468; LA32F-ILP32D-NEXT: ret469;470; LA32D-ILP32D-LABEL: bfloat_to_i16:471; LA32D-ILP32D: # %bb.0:472; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0473; LA32D-ILP32D-NEXT: ret474;475; LA64F-LP64S-LABEL: bfloat_to_i16:476; LA64F-LP64S: # %bb.0:477; LA64F-LP64S-NEXT: ret478;479; LA64F-LP64D-LABEL: bfloat_to_i16:480; LA64F-LP64D: # %bb.0:481; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0482; LA64F-LP64D-NEXT: ret483;484; LA64D-LP64S-LABEL: bfloat_to_i16:485; LA64D-LP64S: # %bb.0:486; LA64D-LP64S-NEXT: ret487;488; LA64D-LP64D-LABEL: bfloat_to_i16:489; LA64D-LP64D: # %bb.0:490; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0491; LA64D-LP64D-NEXT: ret492 %1 = bitcast bfloat %a to i16493 ret i16 %1494}495 496define bfloat @bfloat_add(bfloat %a, bfloat %b) nounwind {497; LA32-LABEL: bfloat_add:498; LA32: # %bb.0:499; LA32-NEXT: addi.w $sp, $sp, -16500; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill501; LA32-NEXT: slli.w $a0, $a0, 16502; LA32-NEXT: slli.w $a1, $a1, 16503; LA32-NEXT: bl __addsf3504; LA32-NEXT: bl __truncsfbf2505; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload506; LA32-NEXT: addi.w $sp, $sp, 16507; LA32-NEXT: ret508;509; LA64-LABEL: bfloat_add:510; LA64: # %bb.0:511; LA64-NEXT: addi.d $sp, $sp, -16512; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill513; LA64-NEXT: movfr2gr.s $a0, $fa0514; LA64-NEXT: movfr2gr.s $a1, $fa1515; LA64-NEXT: slli.d $a1, $a1, 16516; LA64-NEXT: movgr2fr.w $fa0, $a1517; LA64-NEXT: slli.d $a0, $a0, 16518; LA64-NEXT: movgr2fr.w $fa1, $a0519; LA64-NEXT: fadd.s $fa0, $fa1, $fa0520; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)521; LA64-NEXT: jirl $ra, $ra, 0522; LA64-NEXT: movfr2gr.s $a0, $fa0523; LA64-NEXT: lu12i.w $a1, -16524; LA64-NEXT: or $a0, $a0, $a1525; LA64-NEXT: movgr2fr.w $fa0, $a0526; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload527; LA64-NEXT: addi.d $sp, $sp, 16528; LA64-NEXT: ret529;530; LA32F-ILP32S-LABEL: bfloat_add:531; LA32F-ILP32S: # %bb.0:532; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -16533; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill534; LA32F-ILP32S-NEXT: slli.w $a1, $a1, 16535; LA32F-ILP32S-NEXT: movgr2fr.w $fa0, $a1536; LA32F-ILP32S-NEXT: slli.w $a0, $a0, 16537; LA32F-ILP32S-NEXT: movgr2fr.w $fa1, $a0538; LA32F-ILP32S-NEXT: fadd.s $fa0, $fa1, $fa0539; LA32F-ILP32S-NEXT: movfr2gr.s $a0, $fa0540; LA32F-ILP32S-NEXT: bl __truncsfbf2541; LA32F-ILP32S-NEXT: lu12i.w $a1, -16542; LA32F-ILP32S-NEXT: or $a0, $a0, $a1543; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload544; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 16545; LA32F-ILP32S-NEXT: ret546;547; LA32F-ILP32D-LABEL: bfloat_add:548; LA32F-ILP32D: # %bb.0:549; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -16550; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill551; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0552; LA32F-ILP32D-NEXT: movfr2gr.s $a1, $fa1553; LA32F-ILP32D-NEXT: slli.w $a1, $a1, 16554; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a1555; LA32F-ILP32D-NEXT: slli.w $a0, $a0, 16556; LA32F-ILP32D-NEXT: movgr2fr.w $fa1, $a0557; LA32F-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0558; LA32F-ILP32D-NEXT: bl __truncsfbf2559; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0560; LA32F-ILP32D-NEXT: lu12i.w $a1, -16561; LA32F-ILP32D-NEXT: or $a0, $a0, $a1562; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0563; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload564; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 16565; LA32F-ILP32D-NEXT: ret566;567; LA32D-ILP32D-LABEL: bfloat_add:568; LA32D-ILP32D: # %bb.0:569; LA32D-ILP32D-NEXT: addi.w $sp, $sp, -16570; LA32D-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill571; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0572; LA32D-ILP32D-NEXT: movfr2gr.s $a1, $fa1573; LA32D-ILP32D-NEXT: slli.w $a1, $a1, 16574; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a1575; LA32D-ILP32D-NEXT: slli.w $a0, $a0, 16576; LA32D-ILP32D-NEXT: movgr2fr.w $fa1, $a0577; LA32D-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0578; LA32D-ILP32D-NEXT: bl __truncsfbf2579; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0580; LA32D-ILP32D-NEXT: lu12i.w $a1, -16581; LA32D-ILP32D-NEXT: or $a0, $a0, $a1582; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0583; LA32D-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload584; LA32D-ILP32D-NEXT: addi.w $sp, $sp, 16585; LA32D-ILP32D-NEXT: ret586;587; LA64F-LP64S-LABEL: bfloat_add:588; LA64F-LP64S: # %bb.0:589; LA64F-LP64S-NEXT: addi.d $sp, $sp, -16590; LA64F-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill591; LA64F-LP64S-NEXT: slli.d $a1, $a1, 16592; LA64F-LP64S-NEXT: movgr2fr.w $fa0, $a1593; LA64F-LP64S-NEXT: slli.d $a0, $a0, 16594; LA64F-LP64S-NEXT: movgr2fr.w $fa1, $a0595; LA64F-LP64S-NEXT: fadd.s $fa0, $fa1, $fa0596; LA64F-LP64S-NEXT: movfr2gr.s $a0, $fa0597; LA64F-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)598; LA64F-LP64S-NEXT: jirl $ra, $ra, 0599; LA64F-LP64S-NEXT: lu12i.w $a1, -16600; LA64F-LP64S-NEXT: or $a0, $a0, $a1601; LA64F-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload602; LA64F-LP64S-NEXT: addi.d $sp, $sp, 16603; LA64F-LP64S-NEXT: ret604;605; LA64F-LP64D-LABEL: bfloat_add:606; LA64F-LP64D: # %bb.0:607; LA64F-LP64D-NEXT: addi.d $sp, $sp, -16608; LA64F-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill609; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0610; LA64F-LP64D-NEXT: movfr2gr.s $a1, $fa1611; LA64F-LP64D-NEXT: slli.d $a1, $a1, 16612; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a1613; LA64F-LP64D-NEXT: slli.d $a0, $a0, 16614; LA64F-LP64D-NEXT: movgr2fr.w $fa1, $a0615; LA64F-LP64D-NEXT: fadd.s $fa0, $fa1, $fa0616; LA64F-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)617; LA64F-LP64D-NEXT: jirl $ra, $ra, 0618; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0619; LA64F-LP64D-NEXT: lu12i.w $a1, -16620; LA64F-LP64D-NEXT: or $a0, $a0, $a1621; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0622; LA64F-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload623; LA64F-LP64D-NEXT: addi.d $sp, $sp, 16624; LA64F-LP64D-NEXT: ret625;626; LA64D-LP64S-LABEL: bfloat_add:627; LA64D-LP64S: # %bb.0:628; LA64D-LP64S-NEXT: addi.d $sp, $sp, -16629; LA64D-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill630; LA64D-LP64S-NEXT: slli.d $a1, $a1, 16631; LA64D-LP64S-NEXT: movgr2fr.w $fa0, $a1632; LA64D-LP64S-NEXT: slli.d $a0, $a0, 16633; LA64D-LP64S-NEXT: movgr2fr.w $fa1, $a0634; LA64D-LP64S-NEXT: fadd.s $fa0, $fa1, $fa0635; LA64D-LP64S-NEXT: movfr2gr.s $a0, $fa0636; LA64D-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)637; LA64D-LP64S-NEXT: jirl $ra, $ra, 0638; LA64D-LP64S-NEXT: lu12i.w $a1, -16639; LA64D-LP64S-NEXT: or $a0, $a0, $a1640; LA64D-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload641; LA64D-LP64S-NEXT: addi.d $sp, $sp, 16642; LA64D-LP64S-NEXT: ret643;644; LA64D-LP64D-LABEL: bfloat_add:645; LA64D-LP64D: # %bb.0:646; LA64D-LP64D-NEXT: addi.d $sp, $sp, -16647; LA64D-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill648; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0649; LA64D-LP64D-NEXT: movfr2gr.s $a1, $fa1650; LA64D-LP64D-NEXT: slli.d $a1, $a1, 16651; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a1652; LA64D-LP64D-NEXT: slli.d $a0, $a0, 16653; LA64D-LP64D-NEXT: movgr2fr.w $fa1, $a0654; LA64D-LP64D-NEXT: fadd.s $fa0, $fa1, $fa0655; LA64D-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)656; LA64D-LP64D-NEXT: jirl $ra, $ra, 0657; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0658; LA64D-LP64D-NEXT: lu12i.w $a1, -16659; LA64D-LP64D-NEXT: or $a0, $a0, $a1660; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0661; LA64D-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload662; LA64D-LP64D-NEXT: addi.d $sp, $sp, 16663; LA64D-LP64D-NEXT: ret664 %1 = fadd bfloat %a, %b665 ret bfloat %1666}667 668define bfloat @bfloat_load(ptr %a) nounwind {669; LA32-LABEL: bfloat_load:670; LA32: # %bb.0:671; LA32-NEXT: addi.w $sp, $sp, -16672; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill673; LA32-NEXT: ld.h $a1, $a0, 0674; LA32-NEXT: ld.h $a2, $a0, 6675; LA32-NEXT: slli.w $a0, $a1, 16676; LA32-NEXT: slli.w $a1, $a2, 16677; LA32-NEXT: bl __addsf3678; LA32-NEXT: bl __truncsfbf2679; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload680; LA32-NEXT: addi.w $sp, $sp, 16681; LA32-NEXT: ret682;683; LA64-LABEL: bfloat_load:684; LA64: # %bb.0:685; LA64-NEXT: addi.d $sp, $sp, -16686; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill687; LA64-NEXT: ld.hu $a1, $a0, 6688; LA64-NEXT: ld.hu $a0, $a0, 0689; LA64-NEXT: slli.d $a1, $a1, 16690; LA64-NEXT: movgr2fr.w $fa0, $a1691; LA64-NEXT: slli.d $a0, $a0, 16692; LA64-NEXT: movgr2fr.w $fa1, $a0693; LA64-NEXT: fadd.s $fa0, $fa1, $fa0694; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)695; LA64-NEXT: jirl $ra, $ra, 0696; LA64-NEXT: movfr2gr.s $a0, $fa0697; LA64-NEXT: lu12i.w $a1, -16698; LA64-NEXT: or $a0, $a0, $a1699; LA64-NEXT: movgr2fr.w $fa0, $a0700; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload701; LA64-NEXT: addi.d $sp, $sp, 16702; LA64-NEXT: ret703;704; LA32F-ILP32S-LABEL: bfloat_load:705; LA32F-ILP32S: # %bb.0:706; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -16707; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill708; LA32F-ILP32S-NEXT: ld.hu $a1, $a0, 6709; LA32F-ILP32S-NEXT: ld.hu $a0, $a0, 0710; LA32F-ILP32S-NEXT: slli.w $a1, $a1, 16711; LA32F-ILP32S-NEXT: movgr2fr.w $fa0, $a1712; LA32F-ILP32S-NEXT: slli.w $a0, $a0, 16713; LA32F-ILP32S-NEXT: movgr2fr.w $fa1, $a0714; LA32F-ILP32S-NEXT: fadd.s $fa0, $fa1, $fa0715; LA32F-ILP32S-NEXT: movfr2gr.s $a0, $fa0716; LA32F-ILP32S-NEXT: bl __truncsfbf2717; LA32F-ILP32S-NEXT: lu12i.w $a1, -16718; LA32F-ILP32S-NEXT: or $a0, $a0, $a1719; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload720; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 16721; LA32F-ILP32S-NEXT: ret722;723; LA32F-ILP32D-LABEL: bfloat_load:724; LA32F-ILP32D: # %bb.0:725; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -16726; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill727; LA32F-ILP32D-NEXT: ld.hu $a1, $a0, 6728; LA32F-ILP32D-NEXT: ld.hu $a0, $a0, 0729; LA32F-ILP32D-NEXT: slli.w $a1, $a1, 16730; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a1731; LA32F-ILP32D-NEXT: slli.w $a0, $a0, 16732; LA32F-ILP32D-NEXT: movgr2fr.w $fa1, $a0733; LA32F-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0734; LA32F-ILP32D-NEXT: bl __truncsfbf2735; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0736; LA32F-ILP32D-NEXT: lu12i.w $a1, -16737; LA32F-ILP32D-NEXT: or $a0, $a0, $a1738; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a0739; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload740; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 16741; LA32F-ILP32D-NEXT: ret742;743; LA32D-ILP32D-LABEL: bfloat_load:744; LA32D-ILP32D: # %bb.0:745; LA32D-ILP32D-NEXT: addi.w $sp, $sp, -16746; LA32D-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill747; LA32D-ILP32D-NEXT: ld.hu $a1, $a0, 6748; LA32D-ILP32D-NEXT: ld.hu $a0, $a0, 0749; LA32D-ILP32D-NEXT: slli.w $a1, $a1, 16750; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a1751; LA32D-ILP32D-NEXT: slli.w $a0, $a0, 16752; LA32D-ILP32D-NEXT: movgr2fr.w $fa1, $a0753; LA32D-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0754; LA32D-ILP32D-NEXT: bl __truncsfbf2755; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0756; LA32D-ILP32D-NEXT: lu12i.w $a1, -16757; LA32D-ILP32D-NEXT: or $a0, $a0, $a1758; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a0759; LA32D-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload760; LA32D-ILP32D-NEXT: addi.w $sp, $sp, 16761; LA32D-ILP32D-NEXT: ret762;763; LA64F-LP64S-LABEL: bfloat_load:764; LA64F-LP64S: # %bb.0:765; LA64F-LP64S-NEXT: addi.d $sp, $sp, -16766; LA64F-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill767; LA64F-LP64S-NEXT: ld.hu $a1, $a0, 6768; LA64F-LP64S-NEXT: ld.hu $a0, $a0, 0769; LA64F-LP64S-NEXT: slli.d $a1, $a1, 16770; LA64F-LP64S-NEXT: movgr2fr.w $fa0, $a1771; LA64F-LP64S-NEXT: slli.d $a0, $a0, 16772; LA64F-LP64S-NEXT: movgr2fr.w $fa1, $a0773; LA64F-LP64S-NEXT: fadd.s $fa0, $fa1, $fa0774; LA64F-LP64S-NEXT: movfr2gr.s $a0, $fa0775; LA64F-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)776; LA64F-LP64S-NEXT: jirl $ra, $ra, 0777; LA64F-LP64S-NEXT: lu12i.w $a1, -16778; LA64F-LP64S-NEXT: or $a0, $a0, $a1779; LA64F-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload780; LA64F-LP64S-NEXT: addi.d $sp, $sp, 16781; LA64F-LP64S-NEXT: ret782;783; LA64F-LP64D-LABEL: bfloat_load:784; LA64F-LP64D: # %bb.0:785; LA64F-LP64D-NEXT: addi.d $sp, $sp, -16786; LA64F-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill787; LA64F-LP64D-NEXT: ld.hu $a1, $a0, 6788; LA64F-LP64D-NEXT: ld.hu $a0, $a0, 0789; LA64F-LP64D-NEXT: slli.d $a1, $a1, 16790; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a1791; LA64F-LP64D-NEXT: slli.d $a0, $a0, 16792; LA64F-LP64D-NEXT: movgr2fr.w $fa1, $a0793; LA64F-LP64D-NEXT: fadd.s $fa0, $fa1, $fa0794; LA64F-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)795; LA64F-LP64D-NEXT: jirl $ra, $ra, 0796; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0797; LA64F-LP64D-NEXT: lu12i.w $a1, -16798; LA64F-LP64D-NEXT: or $a0, $a0, $a1799; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a0800; LA64F-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload801; LA64F-LP64D-NEXT: addi.d $sp, $sp, 16802; LA64F-LP64D-NEXT: ret803;804; LA64D-LP64S-LABEL: bfloat_load:805; LA64D-LP64S: # %bb.0:806; LA64D-LP64S-NEXT: addi.d $sp, $sp, -16807; LA64D-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill808; LA64D-LP64S-NEXT: ld.hu $a1, $a0, 6809; LA64D-LP64S-NEXT: ld.hu $a0, $a0, 0810; LA64D-LP64S-NEXT: slli.d $a1, $a1, 16811; LA64D-LP64S-NEXT: movgr2fr.w $fa0, $a1812; LA64D-LP64S-NEXT: slli.d $a0, $a0, 16813; LA64D-LP64S-NEXT: movgr2fr.w $fa1, $a0814; LA64D-LP64S-NEXT: fadd.s $fa0, $fa1, $fa0815; LA64D-LP64S-NEXT: movfr2gr.s $a0, $fa0816; LA64D-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)817; LA64D-LP64S-NEXT: jirl $ra, $ra, 0818; LA64D-LP64S-NEXT: lu12i.w $a1, -16819; LA64D-LP64S-NEXT: or $a0, $a0, $a1820; LA64D-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload821; LA64D-LP64S-NEXT: addi.d $sp, $sp, 16822; LA64D-LP64S-NEXT: ret823;824; LA64D-LP64D-LABEL: bfloat_load:825; LA64D-LP64D: # %bb.0:826; LA64D-LP64D-NEXT: addi.d $sp, $sp, -16827; LA64D-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill828; LA64D-LP64D-NEXT: ld.hu $a1, $a0, 6829; LA64D-LP64D-NEXT: ld.hu $a0, $a0, 0830; LA64D-LP64D-NEXT: slli.d $a1, $a1, 16831; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a1832; LA64D-LP64D-NEXT: slli.d $a0, $a0, 16833; LA64D-LP64D-NEXT: movgr2fr.w $fa1, $a0834; LA64D-LP64D-NEXT: fadd.s $fa0, $fa1, $fa0835; LA64D-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)836; LA64D-LP64D-NEXT: jirl $ra, $ra, 0837; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa0838; LA64D-LP64D-NEXT: lu12i.w $a1, -16839; LA64D-LP64D-NEXT: or $a0, $a0, $a1840; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a0841; LA64D-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload842; LA64D-LP64D-NEXT: addi.d $sp, $sp, 16843; LA64D-LP64D-NEXT: ret844 %1 = load bfloat, ptr %a845 %2 = getelementptr bfloat, ptr %a, i32 3846 %3 = load bfloat, ptr %2847 %4 = fadd bfloat %1, %3848 ret bfloat %4849}850 851define void @bfloat_store(ptr %a, bfloat %b, bfloat %c) nounwind {852; LA32-LABEL: bfloat_store:853; LA32: # %bb.0:854; LA32-NEXT: addi.w $sp, $sp, -16855; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill856; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill857; LA32-NEXT: move $fp, $a0858; LA32-NEXT: slli.w $a0, $a1, 16859; LA32-NEXT: slli.w $a1, $a2, 16860; LA32-NEXT: bl __addsf3861; LA32-NEXT: bl __truncsfbf2862; LA32-NEXT: st.h $a0, $fp, 0863; LA32-NEXT: st.h $a0, $fp, 16864; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload865; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload866; LA32-NEXT: addi.w $sp, $sp, 16867; LA32-NEXT: ret868;869; LA64-LABEL: bfloat_store:870; LA64: # %bb.0:871; LA64-NEXT: addi.d $sp, $sp, -16872; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill873; LA64-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill874; LA64-NEXT: move $fp, $a0875; LA64-NEXT: movfr2gr.s $a0, $fa0876; LA64-NEXT: movfr2gr.s $a1, $fa1877; LA64-NEXT: slli.d $a1, $a1, 16878; LA64-NEXT: movgr2fr.w $fa0, $a1879; LA64-NEXT: slli.d $a0, $a0, 16880; LA64-NEXT: movgr2fr.w $fa1, $a0881; LA64-NEXT: fadd.s $fa0, $fa1, $fa0882; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)883; LA64-NEXT: jirl $ra, $ra, 0884; LA64-NEXT: movfr2gr.s $a0, $fa0885; LA64-NEXT: st.h $a0, $fp, 0886; LA64-NEXT: st.h $a0, $fp, 16887; LA64-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload888; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload889; LA64-NEXT: addi.d $sp, $sp, 16890; LA64-NEXT: ret891;892; LA32F-ILP32S-LABEL: bfloat_store:893; LA32F-ILP32S: # %bb.0:894; LA32F-ILP32S-NEXT: addi.w $sp, $sp, -16895; LA32F-ILP32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill896; LA32F-ILP32S-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill897; LA32F-ILP32S-NEXT: move $fp, $a0898; LA32F-ILP32S-NEXT: slli.w $a0, $a2, 16899; LA32F-ILP32S-NEXT: movgr2fr.w $fa0, $a0900; LA32F-ILP32S-NEXT: slli.w $a0, $a1, 16901; LA32F-ILP32S-NEXT: movgr2fr.w $fa1, $a0902; LA32F-ILP32S-NEXT: fadd.s $fa0, $fa1, $fa0903; LA32F-ILP32S-NEXT: movfr2gr.s $a0, $fa0904; LA32F-ILP32S-NEXT: bl __truncsfbf2905; LA32F-ILP32S-NEXT: st.h $a0, $fp, 0906; LA32F-ILP32S-NEXT: st.h $a0, $fp, 16907; LA32F-ILP32S-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload908; LA32F-ILP32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload909; LA32F-ILP32S-NEXT: addi.w $sp, $sp, 16910; LA32F-ILP32S-NEXT: ret911;912; LA32F-ILP32D-LABEL: bfloat_store:913; LA32F-ILP32D: # %bb.0:914; LA32F-ILP32D-NEXT: addi.w $sp, $sp, -16915; LA32F-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill916; LA32F-ILP32D-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill917; LA32F-ILP32D-NEXT: move $fp, $a0918; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0919; LA32F-ILP32D-NEXT: movfr2gr.s $a1, $fa1920; LA32F-ILP32D-NEXT: slli.w $a1, $a1, 16921; LA32F-ILP32D-NEXT: movgr2fr.w $fa0, $a1922; LA32F-ILP32D-NEXT: slli.w $a0, $a0, 16923; LA32F-ILP32D-NEXT: movgr2fr.w $fa1, $a0924; LA32F-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0925; LA32F-ILP32D-NEXT: bl __truncsfbf2926; LA32F-ILP32D-NEXT: movfr2gr.s $a0, $fa0927; LA32F-ILP32D-NEXT: st.h $a0, $fp, 0928; LA32F-ILP32D-NEXT: st.h $a0, $fp, 16929; LA32F-ILP32D-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload930; LA32F-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload931; LA32F-ILP32D-NEXT: addi.w $sp, $sp, 16932; LA32F-ILP32D-NEXT: ret933;934; LA32D-ILP32D-LABEL: bfloat_store:935; LA32D-ILP32D: # %bb.0:936; LA32D-ILP32D-NEXT: addi.w $sp, $sp, -16937; LA32D-ILP32D-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill938; LA32D-ILP32D-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill939; LA32D-ILP32D-NEXT: move $fp, $a0940; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0941; LA32D-ILP32D-NEXT: movfr2gr.s $a1, $fa1942; LA32D-ILP32D-NEXT: slli.w $a1, $a1, 16943; LA32D-ILP32D-NEXT: movgr2fr.w $fa0, $a1944; LA32D-ILP32D-NEXT: slli.w $a0, $a0, 16945; LA32D-ILP32D-NEXT: movgr2fr.w $fa1, $a0946; LA32D-ILP32D-NEXT: fadd.s $fa0, $fa1, $fa0947; LA32D-ILP32D-NEXT: bl __truncsfbf2948; LA32D-ILP32D-NEXT: movfr2gr.s $a0, $fa0949; LA32D-ILP32D-NEXT: st.h $a0, $fp, 0950; LA32D-ILP32D-NEXT: st.h $a0, $fp, 16951; LA32D-ILP32D-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload952; LA32D-ILP32D-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload953; LA32D-ILP32D-NEXT: addi.w $sp, $sp, 16954; LA32D-ILP32D-NEXT: ret955;956; LA64F-LP64S-LABEL: bfloat_store:957; LA64F-LP64S: # %bb.0:958; LA64F-LP64S-NEXT: addi.d $sp, $sp, -16959; LA64F-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill960; LA64F-LP64S-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill961; LA64F-LP64S-NEXT: move $fp, $a0962; LA64F-LP64S-NEXT: slli.d $a0, $a2, 16963; LA64F-LP64S-NEXT: movgr2fr.w $fa0, $a0964; LA64F-LP64S-NEXT: slli.d $a0, $a1, 16965; LA64F-LP64S-NEXT: movgr2fr.w $fa1, $a0966; LA64F-LP64S-NEXT: fadd.s $fa0, $fa1, $fa0967; LA64F-LP64S-NEXT: movfr2gr.s $a0, $fa0968; LA64F-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)969; LA64F-LP64S-NEXT: jirl $ra, $ra, 0970; LA64F-LP64S-NEXT: st.h $a0, $fp, 0971; LA64F-LP64S-NEXT: st.h $a0, $fp, 16972; LA64F-LP64S-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload973; LA64F-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload974; LA64F-LP64S-NEXT: addi.d $sp, $sp, 16975; LA64F-LP64S-NEXT: ret976;977; LA64F-LP64D-LABEL: bfloat_store:978; LA64F-LP64D: # %bb.0:979; LA64F-LP64D-NEXT: addi.d $sp, $sp, -16980; LA64F-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill981; LA64F-LP64D-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill982; LA64F-LP64D-NEXT: move $fp, $a0983; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0984; LA64F-LP64D-NEXT: movfr2gr.s $a1, $fa1985; LA64F-LP64D-NEXT: slli.d $a1, $a1, 16986; LA64F-LP64D-NEXT: movgr2fr.w $fa0, $a1987; LA64F-LP64D-NEXT: slli.d $a0, $a0, 16988; LA64F-LP64D-NEXT: movgr2fr.w $fa1, $a0989; LA64F-LP64D-NEXT: fadd.s $fa0, $fa1, $fa0990; LA64F-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)991; LA64F-LP64D-NEXT: jirl $ra, $ra, 0992; LA64F-LP64D-NEXT: movfr2gr.s $a0, $fa0993; LA64F-LP64D-NEXT: st.h $a0, $fp, 0994; LA64F-LP64D-NEXT: st.h $a0, $fp, 16995; LA64F-LP64D-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload996; LA64F-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload997; LA64F-LP64D-NEXT: addi.d $sp, $sp, 16998; LA64F-LP64D-NEXT: ret999;1000; LA64D-LP64S-LABEL: bfloat_store:1001; LA64D-LP64S: # %bb.0:1002; LA64D-LP64S-NEXT: addi.d $sp, $sp, -161003; LA64D-LP64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill1004; LA64D-LP64S-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill1005; LA64D-LP64S-NEXT: move $fp, $a01006; LA64D-LP64S-NEXT: slli.d $a0, $a2, 161007; LA64D-LP64S-NEXT: movgr2fr.w $fa0, $a01008; LA64D-LP64S-NEXT: slli.d $a0, $a1, 161009; LA64D-LP64S-NEXT: movgr2fr.w $fa1, $a01010; LA64D-LP64S-NEXT: fadd.s $fa0, $fa1, $fa01011; LA64D-LP64S-NEXT: movfr2gr.s $a0, $fa01012; LA64D-LP64S-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)1013; LA64D-LP64S-NEXT: jirl $ra, $ra, 01014; LA64D-LP64S-NEXT: st.h $a0, $fp, 01015; LA64D-LP64S-NEXT: st.h $a0, $fp, 161016; LA64D-LP64S-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload1017; LA64D-LP64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload1018; LA64D-LP64S-NEXT: addi.d $sp, $sp, 161019; LA64D-LP64S-NEXT: ret1020;1021; LA64D-LP64D-LABEL: bfloat_store:1022; LA64D-LP64D: # %bb.0:1023; LA64D-LP64D-NEXT: addi.d $sp, $sp, -161024; LA64D-LP64D-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill1025; LA64D-LP64D-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill1026; LA64D-LP64D-NEXT: move $fp, $a01027; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa01028; LA64D-LP64D-NEXT: movfr2gr.s $a1, $fa11029; LA64D-LP64D-NEXT: slli.d $a1, $a1, 161030; LA64D-LP64D-NEXT: movgr2fr.w $fa0, $a11031; LA64D-LP64D-NEXT: slli.d $a0, $a0, 161032; LA64D-LP64D-NEXT: movgr2fr.w $fa1, $a01033; LA64D-LP64D-NEXT: fadd.s $fa0, $fa1, $fa01034; LA64D-LP64D-NEXT: pcaddu18i $ra, %call36(__truncsfbf2)1035; LA64D-LP64D-NEXT: jirl $ra, $ra, 01036; LA64D-LP64D-NEXT: movfr2gr.s $a0, $fa01037; LA64D-LP64D-NEXT: st.h $a0, $fp, 01038; LA64D-LP64D-NEXT: st.h $a0, $fp, 161039; LA64D-LP64D-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload1040; LA64D-LP64D-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload1041; LA64D-LP64D-NEXT: addi.d $sp, $sp, 161042; LA64D-LP64D-NEXT: ret1043 %1 = fadd bfloat %b, %c1044 store bfloat %1, ptr %a1045 %2 = getelementptr bfloat, ptr %a, i32 81046 store bfloat %1, ptr %21047 ret void1048}1049