654 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32I-ILP323; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64I-LP644; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32ID-ILP325; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64ID-LP646; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32ID-ILP32D7; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64ID-LP64D8 9define bfloat @float_to_bfloat(float %a) nounwind {10; RV32I-ILP32-LABEL: float_to_bfloat:11; RV32I-ILP32: # %bb.0:12; RV32I-ILP32-NEXT: addi sp, sp, -1613; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill14; RV32I-ILP32-NEXT: call __truncsfbf215; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload16; RV32I-ILP32-NEXT: addi sp, sp, 1617; RV32I-ILP32-NEXT: ret18;19; RV64I-LP64-LABEL: float_to_bfloat:20; RV64I-LP64: # %bb.0:21; RV64I-LP64-NEXT: addi sp, sp, -1622; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill23; RV64I-LP64-NEXT: call __truncsfbf224; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload25; RV64I-LP64-NEXT: addi sp, sp, 1626; RV64I-LP64-NEXT: ret27;28; RV32ID-ILP32-LABEL: float_to_bfloat:29; RV32ID-ILP32: # %bb.0:30; RV32ID-ILP32-NEXT: addi sp, sp, -1631; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill32; RV32ID-ILP32-NEXT: call __truncsfbf233; RV32ID-ILP32-NEXT: lui a1, 104856034; RV32ID-ILP32-NEXT: or a0, a0, a135; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload36; RV32ID-ILP32-NEXT: addi sp, sp, 1637; RV32ID-ILP32-NEXT: ret38;39; RV64ID-LP64-LABEL: float_to_bfloat:40; RV64ID-LP64: # %bb.0:41; RV64ID-LP64-NEXT: addi sp, sp, -1642; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill43; RV64ID-LP64-NEXT: call __truncsfbf244; RV64ID-LP64-NEXT: lui a1, 104856045; RV64ID-LP64-NEXT: or a0, a0, a146; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload47; RV64ID-LP64-NEXT: addi sp, sp, 1648; RV64ID-LP64-NEXT: ret49;50; RV32ID-ILP32D-LABEL: float_to_bfloat:51; RV32ID-ILP32D: # %bb.0:52; RV32ID-ILP32D-NEXT: addi sp, sp, -1653; RV32ID-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill54; RV32ID-ILP32D-NEXT: call __truncsfbf255; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa056; RV32ID-ILP32D-NEXT: lui a1, 104856057; RV32ID-ILP32D-NEXT: or a0, a0, a158; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a059; RV32ID-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload60; RV32ID-ILP32D-NEXT: addi sp, sp, 1661; RV32ID-ILP32D-NEXT: ret62;63; RV64ID-LP64D-LABEL: float_to_bfloat:64; RV64ID-LP64D: # %bb.0:65; RV64ID-LP64D-NEXT: addi sp, sp, -1666; RV64ID-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill67; RV64ID-LP64D-NEXT: call __truncsfbf268; RV64ID-LP64D-NEXT: fmv.x.w a0, fa069; RV64ID-LP64D-NEXT: lui a1, 104856070; RV64ID-LP64D-NEXT: or a0, a0, a171; RV64ID-LP64D-NEXT: fmv.w.x fa0, a072; RV64ID-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload73; RV64ID-LP64D-NEXT: addi sp, sp, 1674; RV64ID-LP64D-NEXT: ret75 %1 = fptrunc float %a to bfloat76 ret bfloat %177}78 79define bfloat @double_to_bfloat(double %a) nounwind {80; RV32I-ILP32-LABEL: double_to_bfloat:81; RV32I-ILP32: # %bb.0:82; RV32I-ILP32-NEXT: addi sp, sp, -1683; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill84; RV32I-ILP32-NEXT: call __truncdfbf285; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload86; RV32I-ILP32-NEXT: addi sp, sp, 1687; RV32I-ILP32-NEXT: ret88;89; RV64I-LP64-LABEL: double_to_bfloat:90; RV64I-LP64: # %bb.0:91; RV64I-LP64-NEXT: addi sp, sp, -1692; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill93; RV64I-LP64-NEXT: call __truncdfbf294; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload95; RV64I-LP64-NEXT: addi sp, sp, 1696; RV64I-LP64-NEXT: ret97;98; RV32ID-ILP32-LABEL: double_to_bfloat:99; RV32ID-ILP32: # %bb.0:100; RV32ID-ILP32-NEXT: addi sp, sp, -16101; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill102; RV32ID-ILP32-NEXT: call __truncdfbf2103; RV32ID-ILP32-NEXT: lui a1, 1048560104; RV32ID-ILP32-NEXT: or a0, a0, a1105; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload106; RV32ID-ILP32-NEXT: addi sp, sp, 16107; RV32ID-ILP32-NEXT: ret108;109; RV64ID-LP64-LABEL: double_to_bfloat:110; RV64ID-LP64: # %bb.0:111; RV64ID-LP64-NEXT: addi sp, sp, -16112; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill113; RV64ID-LP64-NEXT: call __truncdfbf2114; RV64ID-LP64-NEXT: lui a1, 1048560115; RV64ID-LP64-NEXT: or a0, a0, a1116; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload117; RV64ID-LP64-NEXT: addi sp, sp, 16118; RV64ID-LP64-NEXT: ret119;120; RV32ID-ILP32D-LABEL: double_to_bfloat:121; RV32ID-ILP32D: # %bb.0:122; RV32ID-ILP32D-NEXT: addi sp, sp, -16123; RV32ID-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill124; RV32ID-ILP32D-NEXT: call __truncdfbf2125; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0126; RV32ID-ILP32D-NEXT: lui a1, 1048560127; RV32ID-ILP32D-NEXT: or a0, a0, a1128; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a0129; RV32ID-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload130; RV32ID-ILP32D-NEXT: addi sp, sp, 16131; RV32ID-ILP32D-NEXT: ret132;133; RV64ID-LP64D-LABEL: double_to_bfloat:134; RV64ID-LP64D: # %bb.0:135; RV64ID-LP64D-NEXT: addi sp, sp, -16136; RV64ID-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill137; RV64ID-LP64D-NEXT: call __truncdfbf2138; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0139; RV64ID-LP64D-NEXT: lui a1, 1048560140; RV64ID-LP64D-NEXT: or a0, a0, a1141; RV64ID-LP64D-NEXT: fmv.w.x fa0, a0142; RV64ID-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload143; RV64ID-LP64D-NEXT: addi sp, sp, 16144; RV64ID-LP64D-NEXT: ret145 %1 = fptrunc double %a to bfloat146 ret bfloat %1147}148 149define float @bfloat_to_float(bfloat %a) nounwind {150; RV32I-ILP32-LABEL: bfloat_to_float:151; RV32I-ILP32: # %bb.0:152; RV32I-ILP32-NEXT: slli a0, a0, 16153; RV32I-ILP32-NEXT: ret154;155; RV64I-LP64-LABEL: bfloat_to_float:156; RV64I-LP64: # %bb.0:157; RV64I-LP64-NEXT: slliw a0, a0, 16158; RV64I-LP64-NEXT: ret159;160; RV32ID-ILP32-LABEL: bfloat_to_float:161; RV32ID-ILP32: # %bb.0:162; RV32ID-ILP32-NEXT: slli a0, a0, 16163; RV32ID-ILP32-NEXT: ret164;165; RV64ID-LP64-LABEL: bfloat_to_float:166; RV64ID-LP64: # %bb.0:167; RV64ID-LP64-NEXT: slli a0, a0, 16168; RV64ID-LP64-NEXT: ret169;170; RV32ID-ILP32D-LABEL: bfloat_to_float:171; RV32ID-ILP32D: # %bb.0:172; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0173; RV32ID-ILP32D-NEXT: slli a0, a0, 16174; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a0175; RV32ID-ILP32D-NEXT: ret176;177; RV64ID-LP64D-LABEL: bfloat_to_float:178; RV64ID-LP64D: # %bb.0:179; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0180; RV64ID-LP64D-NEXT: slli a0, a0, 16181; RV64ID-LP64D-NEXT: fmv.w.x fa0, a0182; RV64ID-LP64D-NEXT: ret183 %1 = fpext bfloat %a to float184 ret float %1185}186 187define double @bfloat_to_double(bfloat %a) nounwind {188; RV32I-ILP32-LABEL: bfloat_to_double:189; RV32I-ILP32: # %bb.0:190; RV32I-ILP32-NEXT: addi sp, sp, -16191; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill192; RV32I-ILP32-NEXT: slli a0, a0, 16193; RV32I-ILP32-NEXT: call __extendsfdf2194; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload195; RV32I-ILP32-NEXT: addi sp, sp, 16196; RV32I-ILP32-NEXT: ret197;198; RV64I-LP64-LABEL: bfloat_to_double:199; RV64I-LP64: # %bb.0:200; RV64I-LP64-NEXT: addi sp, sp, -16201; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill202; RV64I-LP64-NEXT: slliw a0, a0, 16203; RV64I-LP64-NEXT: call __extendsfdf2204; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload205; RV64I-LP64-NEXT: addi sp, sp, 16206; RV64I-LP64-NEXT: ret207;208; RV32ID-ILP32-LABEL: bfloat_to_double:209; RV32ID-ILP32: # %bb.0:210; RV32ID-ILP32-NEXT: addi sp, sp, -16211; RV32ID-ILP32-NEXT: slli a0, a0, 16212; RV32ID-ILP32-NEXT: fmv.w.x fa5, a0213; RV32ID-ILP32-NEXT: fcvt.d.s fa5, fa5214; RV32ID-ILP32-NEXT: fsd fa5, 8(sp)215; RV32ID-ILP32-NEXT: lw a0, 8(sp)216; RV32ID-ILP32-NEXT: lw a1, 12(sp)217; RV32ID-ILP32-NEXT: addi sp, sp, 16218; RV32ID-ILP32-NEXT: ret219;220; RV64ID-LP64-LABEL: bfloat_to_double:221; RV64ID-LP64: # %bb.0:222; RV64ID-LP64-NEXT: slli a0, a0, 16223; RV64ID-LP64-NEXT: fmv.w.x fa5, a0224; RV64ID-LP64-NEXT: fcvt.d.s fa5, fa5225; RV64ID-LP64-NEXT: fmv.x.d a0, fa5226; RV64ID-LP64-NEXT: ret227;228; RV32ID-ILP32D-LABEL: bfloat_to_double:229; RV32ID-ILP32D: # %bb.0:230; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0231; RV32ID-ILP32D-NEXT: slli a0, a0, 16232; RV32ID-ILP32D-NEXT: fmv.w.x fa5, a0233; RV32ID-ILP32D-NEXT: fcvt.d.s fa0, fa5234; RV32ID-ILP32D-NEXT: ret235;236; RV64ID-LP64D-LABEL: bfloat_to_double:237; RV64ID-LP64D: # %bb.0:238; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0239; RV64ID-LP64D-NEXT: slli a0, a0, 16240; RV64ID-LP64D-NEXT: fmv.w.x fa5, a0241; RV64ID-LP64D-NEXT: fcvt.d.s fa0, fa5242; RV64ID-LP64D-NEXT: ret243 %1 = fpext bfloat %a to double244 ret double %1245}246 247define bfloat @i16_to_bfloat(i16 %a) nounwind {248; RV32I-ILP32-LABEL: i16_to_bfloat:249; RV32I-ILP32: # %bb.0:250; RV32I-ILP32-NEXT: ret251;252; RV64I-LP64-LABEL: i16_to_bfloat:253; RV64I-LP64: # %bb.0:254; RV64I-LP64-NEXT: ret255;256; RV32ID-ILP32-LABEL: i16_to_bfloat:257; RV32ID-ILP32: # %bb.0:258; RV32ID-ILP32-NEXT: lui a1, 1048560259; RV32ID-ILP32-NEXT: or a0, a0, a1260; RV32ID-ILP32-NEXT: ret261;262; RV64ID-LP64-LABEL: i16_to_bfloat:263; RV64ID-LP64: # %bb.0:264; RV64ID-LP64-NEXT: lui a1, 1048560265; RV64ID-LP64-NEXT: or a0, a0, a1266; RV64ID-LP64-NEXT: ret267;268; RV32ID-ILP32D-LABEL: i16_to_bfloat:269; RV32ID-ILP32D: # %bb.0:270; RV32ID-ILP32D-NEXT: lui a1, 1048560271; RV32ID-ILP32D-NEXT: or a0, a0, a1272; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a0273; RV32ID-ILP32D-NEXT: ret274;275; RV64ID-LP64D-LABEL: i16_to_bfloat:276; RV64ID-LP64D: # %bb.0:277; RV64ID-LP64D-NEXT: lui a1, 1048560278; RV64ID-LP64D-NEXT: or a0, a0, a1279; RV64ID-LP64D-NEXT: fmv.w.x fa0, a0280; RV64ID-LP64D-NEXT: ret281 %1 = bitcast i16 %a to bfloat282 ret bfloat %1283}284 285define i16 @bfloat_to_i16(bfloat %a) nounwind {286; RV32I-ILP32-LABEL: bfloat_to_i16:287; RV32I-ILP32: # %bb.0:288; RV32I-ILP32-NEXT: ret289;290; RV64I-LP64-LABEL: bfloat_to_i16:291; RV64I-LP64: # %bb.0:292; RV64I-LP64-NEXT: ret293;294; RV32ID-ILP32-LABEL: bfloat_to_i16:295; RV32ID-ILP32: # %bb.0:296; RV32ID-ILP32-NEXT: ret297;298; RV64ID-LP64-LABEL: bfloat_to_i16:299; RV64ID-LP64: # %bb.0:300; RV64ID-LP64-NEXT: ret301;302; RV32ID-ILP32D-LABEL: bfloat_to_i16:303; RV32ID-ILP32D: # %bb.0:304; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0305; RV32ID-ILP32D-NEXT: ret306;307; RV64ID-LP64D-LABEL: bfloat_to_i16:308; RV64ID-LP64D: # %bb.0:309; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0310; RV64ID-LP64D-NEXT: ret311 %1 = bitcast bfloat %a to i16312 ret i16 %1313}314 315define bfloat @bfloat_add(bfloat %a, bfloat %b) nounwind {316; RV32I-ILP32-LABEL: bfloat_add:317; RV32I-ILP32: # %bb.0:318; RV32I-ILP32-NEXT: addi sp, sp, -16319; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill320; RV32I-ILP32-NEXT: slli a0, a0, 16321; RV32I-ILP32-NEXT: slli a1, a1, 16322; RV32I-ILP32-NEXT: call __addsf3323; RV32I-ILP32-NEXT: call __truncsfbf2324; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload325; RV32I-ILP32-NEXT: addi sp, sp, 16326; RV32I-ILP32-NEXT: ret327;328; RV64I-LP64-LABEL: bfloat_add:329; RV64I-LP64: # %bb.0:330; RV64I-LP64-NEXT: addi sp, sp, -16331; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill332; RV64I-LP64-NEXT: slliw a0, a0, 16333; RV64I-LP64-NEXT: slliw a1, a1, 16334; RV64I-LP64-NEXT: call __addsf3335; RV64I-LP64-NEXT: call __truncsfbf2336; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload337; RV64I-LP64-NEXT: addi sp, sp, 16338; RV64I-LP64-NEXT: ret339;340; RV32ID-ILP32-LABEL: bfloat_add:341; RV32ID-ILP32: # %bb.0:342; RV32ID-ILP32-NEXT: addi sp, sp, -16343; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill344; RV32ID-ILP32-NEXT: slli a1, a1, 16345; RV32ID-ILP32-NEXT: slli a0, a0, 16346; RV32ID-ILP32-NEXT: fmv.w.x fa5, a1347; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0348; RV32ID-ILP32-NEXT: fadd.s fa5, fa4, fa5349; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5350; RV32ID-ILP32-NEXT: call __truncsfbf2351; RV32ID-ILP32-NEXT: lui a1, 1048560352; RV32ID-ILP32-NEXT: or a0, a0, a1353; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload354; RV32ID-ILP32-NEXT: addi sp, sp, 16355; RV32ID-ILP32-NEXT: ret356;357; RV64ID-LP64-LABEL: bfloat_add:358; RV64ID-LP64: # %bb.0:359; RV64ID-LP64-NEXT: addi sp, sp, -16360; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill361; RV64ID-LP64-NEXT: slli a1, a1, 16362; RV64ID-LP64-NEXT: slli a0, a0, 16363; RV64ID-LP64-NEXT: fmv.w.x fa5, a1364; RV64ID-LP64-NEXT: fmv.w.x fa4, a0365; RV64ID-LP64-NEXT: fadd.s fa5, fa4, fa5366; RV64ID-LP64-NEXT: fmv.x.w a0, fa5367; RV64ID-LP64-NEXT: call __truncsfbf2368; RV64ID-LP64-NEXT: lui a1, 1048560369; RV64ID-LP64-NEXT: or a0, a0, a1370; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload371; RV64ID-LP64-NEXT: addi sp, sp, 16372; RV64ID-LP64-NEXT: ret373;374; RV32ID-ILP32D-LABEL: bfloat_add:375; RV32ID-ILP32D: # %bb.0:376; RV32ID-ILP32D-NEXT: addi sp, sp, -16377; RV32ID-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill378; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0379; RV32ID-ILP32D-NEXT: fmv.x.w a1, fa1380; RV32ID-ILP32D-NEXT: slli a1, a1, 16381; RV32ID-ILP32D-NEXT: slli a0, a0, 16382; RV32ID-ILP32D-NEXT: fmv.w.x fa5, a1383; RV32ID-ILP32D-NEXT: fmv.w.x fa4, a0384; RV32ID-ILP32D-NEXT: fadd.s fa0, fa4, fa5385; RV32ID-ILP32D-NEXT: call __truncsfbf2386; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0387; RV32ID-ILP32D-NEXT: lui a1, 1048560388; RV32ID-ILP32D-NEXT: or a0, a0, a1389; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a0390; RV32ID-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload391; RV32ID-ILP32D-NEXT: addi sp, sp, 16392; RV32ID-ILP32D-NEXT: ret393;394; RV64ID-LP64D-LABEL: bfloat_add:395; RV64ID-LP64D: # %bb.0:396; RV64ID-LP64D-NEXT: addi sp, sp, -16397; RV64ID-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill398; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0399; RV64ID-LP64D-NEXT: fmv.x.w a1, fa1400; RV64ID-LP64D-NEXT: slli a1, a1, 16401; RV64ID-LP64D-NEXT: slli a0, a0, 16402; RV64ID-LP64D-NEXT: fmv.w.x fa5, a1403; RV64ID-LP64D-NEXT: fmv.w.x fa4, a0404; RV64ID-LP64D-NEXT: fadd.s fa0, fa4, fa5405; RV64ID-LP64D-NEXT: call __truncsfbf2406; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0407; RV64ID-LP64D-NEXT: lui a1, 1048560408; RV64ID-LP64D-NEXT: or a0, a0, a1409; RV64ID-LP64D-NEXT: fmv.w.x fa0, a0410; RV64ID-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload411; RV64ID-LP64D-NEXT: addi sp, sp, 16412; RV64ID-LP64D-NEXT: ret413 %1 = fadd bfloat %a, %b414 ret bfloat %1415}416 417define bfloat @bfloat_load(ptr %a) nounwind {418; RV32I-ILP32-LABEL: bfloat_load:419; RV32I-ILP32: # %bb.0:420; RV32I-ILP32-NEXT: addi sp, sp, -16421; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill422; RV32I-ILP32-NEXT: lh a1, 0(a0)423; RV32I-ILP32-NEXT: lh a2, 6(a0)424; RV32I-ILP32-NEXT: slli a0, a1, 16425; RV32I-ILP32-NEXT: slli a1, a2, 16426; RV32I-ILP32-NEXT: call __addsf3427; RV32I-ILP32-NEXT: call __truncsfbf2428; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload429; RV32I-ILP32-NEXT: addi sp, sp, 16430; RV32I-ILP32-NEXT: ret431;432; RV64I-LP64-LABEL: bfloat_load:433; RV64I-LP64: # %bb.0:434; RV64I-LP64-NEXT: addi sp, sp, -16435; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill436; RV64I-LP64-NEXT: lh a1, 0(a0)437; RV64I-LP64-NEXT: lh a2, 6(a0)438; RV64I-LP64-NEXT: slliw a0, a1, 16439; RV64I-LP64-NEXT: slliw a1, a2, 16440; RV64I-LP64-NEXT: call __addsf3441; RV64I-LP64-NEXT: call __truncsfbf2442; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload443; RV64I-LP64-NEXT: addi sp, sp, 16444; RV64I-LP64-NEXT: ret445;446; RV32ID-ILP32-LABEL: bfloat_load:447; RV32ID-ILP32: # %bb.0:448; RV32ID-ILP32-NEXT: addi sp, sp, -16449; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill450; RV32ID-ILP32-NEXT: lhu a1, 6(a0)451; RV32ID-ILP32-NEXT: lhu a0, 0(a0)452; RV32ID-ILP32-NEXT: slli a1, a1, 16453; RV32ID-ILP32-NEXT: slli a0, a0, 16454; RV32ID-ILP32-NEXT: fmv.w.x fa5, a1455; RV32ID-ILP32-NEXT: fmv.w.x fa4, a0456; RV32ID-ILP32-NEXT: fadd.s fa5, fa4, fa5457; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5458; RV32ID-ILP32-NEXT: call __truncsfbf2459; RV32ID-ILP32-NEXT: lui a1, 1048560460; RV32ID-ILP32-NEXT: or a0, a0, a1461; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload462; RV32ID-ILP32-NEXT: addi sp, sp, 16463; RV32ID-ILP32-NEXT: ret464;465; RV64ID-LP64-LABEL: bfloat_load:466; RV64ID-LP64: # %bb.0:467; RV64ID-LP64-NEXT: addi sp, sp, -16468; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill469; RV64ID-LP64-NEXT: lhu a1, 6(a0)470; RV64ID-LP64-NEXT: lhu a0, 0(a0)471; RV64ID-LP64-NEXT: slli a1, a1, 16472; RV64ID-LP64-NEXT: slli a0, a0, 16473; RV64ID-LP64-NEXT: fmv.w.x fa5, a1474; RV64ID-LP64-NEXT: fmv.w.x fa4, a0475; RV64ID-LP64-NEXT: fadd.s fa5, fa4, fa5476; RV64ID-LP64-NEXT: fmv.x.w a0, fa5477; RV64ID-LP64-NEXT: call __truncsfbf2478; RV64ID-LP64-NEXT: lui a1, 1048560479; RV64ID-LP64-NEXT: or a0, a0, a1480; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload481; RV64ID-LP64-NEXT: addi sp, sp, 16482; RV64ID-LP64-NEXT: ret483;484; RV32ID-ILP32D-LABEL: bfloat_load:485; RV32ID-ILP32D: # %bb.0:486; RV32ID-ILP32D-NEXT: addi sp, sp, -16487; RV32ID-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill488; RV32ID-ILP32D-NEXT: lhu a1, 6(a0)489; RV32ID-ILP32D-NEXT: lhu a0, 0(a0)490; RV32ID-ILP32D-NEXT: slli a1, a1, 16491; RV32ID-ILP32D-NEXT: slli a0, a0, 16492; RV32ID-ILP32D-NEXT: fmv.w.x fa5, a1493; RV32ID-ILP32D-NEXT: fmv.w.x fa4, a0494; RV32ID-ILP32D-NEXT: fadd.s fa0, fa4, fa5495; RV32ID-ILP32D-NEXT: call __truncsfbf2496; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0497; RV32ID-ILP32D-NEXT: lui a1, 1048560498; RV32ID-ILP32D-NEXT: or a0, a0, a1499; RV32ID-ILP32D-NEXT: fmv.w.x fa0, a0500; RV32ID-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload501; RV32ID-ILP32D-NEXT: addi sp, sp, 16502; RV32ID-ILP32D-NEXT: ret503;504; RV64ID-LP64D-LABEL: bfloat_load:505; RV64ID-LP64D: # %bb.0:506; RV64ID-LP64D-NEXT: addi sp, sp, -16507; RV64ID-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill508; RV64ID-LP64D-NEXT: lhu a1, 6(a0)509; RV64ID-LP64D-NEXT: lhu a0, 0(a0)510; RV64ID-LP64D-NEXT: slli a1, a1, 16511; RV64ID-LP64D-NEXT: slli a0, a0, 16512; RV64ID-LP64D-NEXT: fmv.w.x fa5, a1513; RV64ID-LP64D-NEXT: fmv.w.x fa4, a0514; RV64ID-LP64D-NEXT: fadd.s fa0, fa4, fa5515; RV64ID-LP64D-NEXT: call __truncsfbf2516; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0517; RV64ID-LP64D-NEXT: lui a1, 1048560518; RV64ID-LP64D-NEXT: or a0, a0, a1519; RV64ID-LP64D-NEXT: fmv.w.x fa0, a0520; RV64ID-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload521; RV64ID-LP64D-NEXT: addi sp, sp, 16522; RV64ID-LP64D-NEXT: ret523 %1 = load bfloat, ptr %a524 %2 = getelementptr bfloat, ptr %a, i32 3525 %3 = load bfloat, ptr %2526 %4 = fadd bfloat %1, %3527 ret bfloat %4528}529 530define void @bfloat_store(ptr %a, bfloat %b, bfloat %c) nounwind {531; RV32I-ILP32-LABEL: bfloat_store:532; RV32I-ILP32: # %bb.0:533; RV32I-ILP32-NEXT: addi sp, sp, -16534; RV32I-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill535; RV32I-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill536; RV32I-ILP32-NEXT: mv s0, a0537; RV32I-ILP32-NEXT: slli a0, a1, 16538; RV32I-ILP32-NEXT: slli a1, a2, 16539; RV32I-ILP32-NEXT: call __addsf3540; RV32I-ILP32-NEXT: call __truncsfbf2541; RV32I-ILP32-NEXT: sh a0, 0(s0)542; RV32I-ILP32-NEXT: sh a0, 16(s0)543; RV32I-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload544; RV32I-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload545; RV32I-ILP32-NEXT: addi sp, sp, 16546; RV32I-ILP32-NEXT: ret547;548; RV64I-LP64-LABEL: bfloat_store:549; RV64I-LP64: # %bb.0:550; RV64I-LP64-NEXT: addi sp, sp, -16551; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill552; RV64I-LP64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill553; RV64I-LP64-NEXT: mv s0, a0554; RV64I-LP64-NEXT: slliw a0, a1, 16555; RV64I-LP64-NEXT: slliw a1, a2, 16556; RV64I-LP64-NEXT: call __addsf3557; RV64I-LP64-NEXT: call __truncsfbf2558; RV64I-LP64-NEXT: sh a0, 0(s0)559; RV64I-LP64-NEXT: sh a0, 16(s0)560; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload561; RV64I-LP64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload562; RV64I-LP64-NEXT: addi sp, sp, 16563; RV64I-LP64-NEXT: ret564;565; RV32ID-ILP32-LABEL: bfloat_store:566; RV32ID-ILP32: # %bb.0:567; RV32ID-ILP32-NEXT: addi sp, sp, -16568; RV32ID-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill569; RV32ID-ILP32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill570; RV32ID-ILP32-NEXT: mv s0, a0571; RV32ID-ILP32-NEXT: slli a2, a2, 16572; RV32ID-ILP32-NEXT: slli a1, a1, 16573; RV32ID-ILP32-NEXT: fmv.w.x fa5, a2574; RV32ID-ILP32-NEXT: fmv.w.x fa4, a1575; RV32ID-ILP32-NEXT: fadd.s fa5, fa4, fa5576; RV32ID-ILP32-NEXT: fmv.x.w a0, fa5577; RV32ID-ILP32-NEXT: call __truncsfbf2578; RV32ID-ILP32-NEXT: sh a0, 0(s0)579; RV32ID-ILP32-NEXT: sh a0, 16(s0)580; RV32ID-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload581; RV32ID-ILP32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload582; RV32ID-ILP32-NEXT: addi sp, sp, 16583; RV32ID-ILP32-NEXT: ret584;585; RV64ID-LP64-LABEL: bfloat_store:586; RV64ID-LP64: # %bb.0:587; RV64ID-LP64-NEXT: addi sp, sp, -16588; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill589; RV64ID-LP64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill590; RV64ID-LP64-NEXT: mv s0, a0591; RV64ID-LP64-NEXT: slli a2, a2, 16592; RV64ID-LP64-NEXT: slli a1, a1, 16593; RV64ID-LP64-NEXT: fmv.w.x fa5, a2594; RV64ID-LP64-NEXT: fmv.w.x fa4, a1595; RV64ID-LP64-NEXT: fadd.s fa5, fa4, fa5596; RV64ID-LP64-NEXT: fmv.x.w a0, fa5597; RV64ID-LP64-NEXT: call __truncsfbf2598; RV64ID-LP64-NEXT: sh a0, 0(s0)599; RV64ID-LP64-NEXT: sh a0, 16(s0)600; RV64ID-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload601; RV64ID-LP64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload602; RV64ID-LP64-NEXT: addi sp, sp, 16603; RV64ID-LP64-NEXT: ret604;605; RV32ID-ILP32D-LABEL: bfloat_store:606; RV32ID-ILP32D: # %bb.0:607; RV32ID-ILP32D-NEXT: addi sp, sp, -16608; RV32ID-ILP32D-NEXT: sw ra, 12(sp) # 4-byte Folded Spill609; RV32ID-ILP32D-NEXT: sw s0, 8(sp) # 4-byte Folded Spill610; RV32ID-ILP32D-NEXT: mv s0, a0611; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0612; RV32ID-ILP32D-NEXT: fmv.x.w a1, fa1613; RV32ID-ILP32D-NEXT: slli a1, a1, 16614; RV32ID-ILP32D-NEXT: slli a0, a0, 16615; RV32ID-ILP32D-NEXT: fmv.w.x fa5, a1616; RV32ID-ILP32D-NEXT: fmv.w.x fa4, a0617; RV32ID-ILP32D-NEXT: fadd.s fa0, fa4, fa5618; RV32ID-ILP32D-NEXT: call __truncsfbf2619; RV32ID-ILP32D-NEXT: fmv.x.w a0, fa0620; RV32ID-ILP32D-NEXT: sh a0, 0(s0)621; RV32ID-ILP32D-NEXT: sh a0, 16(s0)622; RV32ID-ILP32D-NEXT: lw ra, 12(sp) # 4-byte Folded Reload623; RV32ID-ILP32D-NEXT: lw s0, 8(sp) # 4-byte Folded Reload624; RV32ID-ILP32D-NEXT: addi sp, sp, 16625; RV32ID-ILP32D-NEXT: ret626;627; RV64ID-LP64D-LABEL: bfloat_store:628; RV64ID-LP64D: # %bb.0:629; RV64ID-LP64D-NEXT: addi sp, sp, -16630; RV64ID-LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill631; RV64ID-LP64D-NEXT: sd s0, 0(sp) # 8-byte Folded Spill632; RV64ID-LP64D-NEXT: mv s0, a0633; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0634; RV64ID-LP64D-NEXT: fmv.x.w a1, fa1635; RV64ID-LP64D-NEXT: slli a1, a1, 16636; RV64ID-LP64D-NEXT: slli a0, a0, 16637; RV64ID-LP64D-NEXT: fmv.w.x fa5, a1638; RV64ID-LP64D-NEXT: fmv.w.x fa4, a0639; RV64ID-LP64D-NEXT: fadd.s fa0, fa4, fa5640; RV64ID-LP64D-NEXT: call __truncsfbf2641; RV64ID-LP64D-NEXT: fmv.x.w a0, fa0642; RV64ID-LP64D-NEXT: sh a0, 0(s0)643; RV64ID-LP64D-NEXT: sh a0, 16(s0)644; RV64ID-LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload645; RV64ID-LP64D-NEXT: ld s0, 0(sp) # 8-byte Folded Reload646; RV64ID-LP64D-NEXT: addi sp, sp, 16647; RV64ID-LP64D-NEXT: ret648 %1 = fadd bfloat %b, %c649 store bfloat %1, ptr %a650 %2 = getelementptr bfloat, ptr %a, i32 8651 store bfloat %1, ptr %2652 ret void653}654