546 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA644 5define void @test_load_store(ptr %p, ptr %q) nounwind {6; LA32-LABEL: test_load_store:7; LA32: # %bb.0:8; LA32-NEXT: ld.h $a0, $a0, 09; LA32-NEXT: st.h $a0, $a1, 010; LA32-NEXT: ret11;12; LA64-LABEL: test_load_store:13; LA64: # %bb.0:14; LA64-NEXT: ld.h $a0, $a0, 015; LA64-NEXT: st.h $a0, $a1, 016; LA64-NEXT: ret17 %a = load half, ptr %p18 store half %a, ptr %q19 ret void20}21 22define float @test_fpextend_float(ptr %p) nounwind {23; LA32-LABEL: test_fpextend_float:24; LA32: # %bb.0:25; LA32-NEXT: addi.w $sp, $sp, -1626; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill27; LA32-NEXT: ld.hu $a0, $a0, 028; LA32-NEXT: movgr2fr.w $fa0, $a029; LA32-NEXT: bl __extendhfsf230; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload31; LA32-NEXT: addi.w $sp, $sp, 1632; LA32-NEXT: ret33;34; LA64-LABEL: test_fpextend_float:35; LA64: # %bb.0:36; LA64-NEXT: addi.d $sp, $sp, -1637; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill38; LA64-NEXT: ld.hu $a0, $a0, 039; LA64-NEXT: movgr2fr.w $fa0, $a040; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)41; LA64-NEXT: jirl $ra, $ra, 042; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload43; LA64-NEXT: addi.d $sp, $sp, 1644; LA64-NEXT: ret45 %a = load half, ptr %p46 %r = fpext half %a to float47 ret float %r48}49 50define double @test_fpextend_double(ptr %p) nounwind {51; LA32-LABEL: test_fpextend_double:52; LA32: # %bb.0:53; LA32-NEXT: addi.w $sp, $sp, -1654; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill55; LA32-NEXT: ld.hu $a0, $a0, 056; LA32-NEXT: movgr2fr.w $fa0, $a057; LA32-NEXT: bl __extendhfsf258; LA32-NEXT: fcvt.d.s $fa0, $fa059; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload60; LA32-NEXT: addi.w $sp, $sp, 1661; LA32-NEXT: ret62;63; LA64-LABEL: test_fpextend_double:64; LA64: # %bb.0:65; LA64-NEXT: addi.d $sp, $sp, -1666; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill67; LA64-NEXT: ld.hu $a0, $a0, 068; LA64-NEXT: movgr2fr.w $fa0, $a069; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)70; LA64-NEXT: jirl $ra, $ra, 071; LA64-NEXT: fcvt.d.s $fa0, $fa072; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload73; LA64-NEXT: addi.d $sp, $sp, 1674; LA64-NEXT: ret75 %a = load half, ptr %p76 %r = fpext half %a to double77 ret double %r78}79 80define void @test_fptrunc_float(float %f, ptr %p) nounwind {81; LA32-LABEL: test_fptrunc_float:82; LA32: # %bb.0:83; LA32-NEXT: addi.w $sp, $sp, -1684; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill85; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill86; LA32-NEXT: move $fp, $a087; LA32-NEXT: bl __truncsfhf288; LA32-NEXT: movfr2gr.s $a0, $fa089; LA32-NEXT: st.h $a0, $fp, 090; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload91; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload92; LA32-NEXT: addi.w $sp, $sp, 1693; LA32-NEXT: ret94;95; LA64-LABEL: test_fptrunc_float:96; LA64: # %bb.0:97; LA64-NEXT: addi.d $sp, $sp, -1698; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill99; LA64-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill100; LA64-NEXT: move $fp, $a0101; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)102; LA64-NEXT: jirl $ra, $ra, 0103; LA64-NEXT: movfr2gr.s $a0, $fa0104; LA64-NEXT: st.h $a0, $fp, 0105; LA64-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload106; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload107; LA64-NEXT: addi.d $sp, $sp, 16108; LA64-NEXT: ret109 %a = fptrunc float %f to half110 store half %a, ptr %p111 ret void112}113 114define void @test_fptrunc_double(double %d, ptr %p) nounwind {115; LA32-LABEL: test_fptrunc_double:116; LA32: # %bb.0:117; LA32-NEXT: addi.w $sp, $sp, -16118; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill119; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill120; LA32-NEXT: move $fp, $a0121; LA32-NEXT: bl __truncdfhf2122; LA32-NEXT: movfr2gr.s $a0, $fa0123; LA32-NEXT: st.h $a0, $fp, 0124; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload125; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload126; LA32-NEXT: addi.w $sp, $sp, 16127; LA32-NEXT: ret128;129; LA64-LABEL: test_fptrunc_double:130; LA64: # %bb.0:131; LA64-NEXT: addi.d $sp, $sp, -16132; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill133; LA64-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill134; LA64-NEXT: move $fp, $a0135; LA64-NEXT: pcaddu18i $ra, %call36(__truncdfhf2)136; LA64-NEXT: jirl $ra, $ra, 0137; LA64-NEXT: movfr2gr.s $a0, $fa0138; LA64-NEXT: st.h $a0, $fp, 0139; LA64-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload140; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload141; LA64-NEXT: addi.d $sp, $sp, 16142; LA64-NEXT: ret143 %a = fptrunc double %d to half144 store half %a, ptr %p145 ret void146}147 148define half @test_fadd_reg(half %a, half %b) nounwind {149; LA32-LABEL: test_fadd_reg:150; LA32: # %bb.0:151; LA32-NEXT: addi.w $sp, $sp, -32152; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill153; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill154; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill155; LA32-NEXT: fmov.s $fs0, $fa0156; LA32-NEXT: fmov.s $fa0, $fa1157; LA32-NEXT: bl __extendhfsf2158; LA32-NEXT: fmov.s $fs1, $fa0159; LA32-NEXT: fmov.s $fa0, $fs0160; LA32-NEXT: bl __extendhfsf2161; LA32-NEXT: fadd.s $fa0, $fa0, $fs1162; LA32-NEXT: bl __truncsfhf2163; LA32-NEXT: movfr2gr.s $a0, $fa0164; LA32-NEXT: lu12i.w $a1, -16165; LA32-NEXT: or $a0, $a0, $a1166; LA32-NEXT: movgr2fr.w $fa0, $a0167; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload168; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload169; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload170; LA32-NEXT: addi.w $sp, $sp, 32171; LA32-NEXT: ret172;173; LA64-LABEL: test_fadd_reg:174; LA64: # %bb.0:175; LA64-NEXT: addi.d $sp, $sp, -32176; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill177; LA64-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill178; LA64-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill179; LA64-NEXT: fmov.s $fs0, $fa0180; LA64-NEXT: fmov.s $fa0, $fa1181; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)182; LA64-NEXT: jirl $ra, $ra, 0183; LA64-NEXT: fmov.s $fs1, $fa0184; LA64-NEXT: fmov.s $fa0, $fs0185; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)186; LA64-NEXT: jirl $ra, $ra, 0187; LA64-NEXT: fadd.s $fa0, $fa0, $fs1188; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)189; LA64-NEXT: jirl $ra, $ra, 0190; LA64-NEXT: movfr2gr.s $a0, $fa0191; LA64-NEXT: lu12i.w $a1, -16192; LA64-NEXT: or $a0, $a0, $a1193; LA64-NEXT: movgr2fr.w $fa0, $a0194; LA64-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload195; LA64-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload196; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload197; LA64-NEXT: addi.d $sp, $sp, 32198; LA64-NEXT: ret199 %r = fadd half %a, %b200 ret half %r201}202 203define void @test_fadd_mem(ptr %p, ptr %q) nounwind {204; LA32-LABEL: test_fadd_mem:205; LA32: # %bb.0:206; LA32-NEXT: addi.w $sp, $sp, -32207; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill208; LA32-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill209; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill210; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill211; LA32-NEXT: move $fp, $a0212; LA32-NEXT: ld.hu $a0, $a0, 0213; LA32-NEXT: ld.hu $a1, $a1, 0214; LA32-NEXT: movgr2fr.w $fs0, $a0215; LA32-NEXT: movgr2fr.w $fa0, $a1216; LA32-NEXT: bl __extendhfsf2217; LA32-NEXT: fmov.s $fs1, $fa0218; LA32-NEXT: fmov.s $fa0, $fs0219; LA32-NEXT: bl __extendhfsf2220; LA32-NEXT: fadd.s $fa0, $fa0, $fs1221; LA32-NEXT: bl __truncsfhf2222; LA32-NEXT: movfr2gr.s $a0, $fa0223; LA32-NEXT: st.h $a0, $fp, 0224; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload225; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload226; LA32-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload227; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload228; LA32-NEXT: addi.w $sp, $sp, 32229; LA32-NEXT: ret230;231; LA64-LABEL: test_fadd_mem:232; LA64: # %bb.0:233; LA64-NEXT: addi.d $sp, $sp, -32234; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill235; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill236; LA64-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill237; LA64-NEXT: fst.d $fs0, $sp, 0 # 8-byte Folded Spill238; LA64-NEXT: move $fp, $a0239; LA64-NEXT: ld.hu $s0, $a0, 0240; LA64-NEXT: ld.hu $a0, $a1, 0241; LA64-NEXT: movgr2fr.w $fa0, $a0242; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)243; LA64-NEXT: jirl $ra, $ra, 0244; LA64-NEXT: fmov.s $fs0, $fa0245; LA64-NEXT: movgr2fr.w $fa0, $s0246; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)247; LA64-NEXT: jirl $ra, $ra, 0248; LA64-NEXT: fadd.s $fa0, $fa0, $fs0249; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)250; LA64-NEXT: jirl $ra, $ra, 0251; LA64-NEXT: movfr2gr.s $a0, $fa0252; LA64-NEXT: st.h $a0, $fp, 0253; LA64-NEXT: fld.d $fs0, $sp, 0 # 8-byte Folded Reload254; LA64-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload255; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload256; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload257; LA64-NEXT: addi.d $sp, $sp, 32258; LA64-NEXT: ret259 %a = load half, ptr %p260 %b = load half, ptr %q261 %r = fadd half %a, %b262 store half %r, ptr %p263 ret void264}265 266define half @test_fmul_reg(half %a, half %b) nounwind {267; LA32-LABEL: test_fmul_reg:268; LA32: # %bb.0:269; LA32-NEXT: addi.w $sp, $sp, -32270; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill271; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill272; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill273; LA32-NEXT: fmov.s $fs0, $fa0274; LA32-NEXT: fmov.s $fa0, $fa1275; LA32-NEXT: bl __extendhfsf2276; LA32-NEXT: fmov.s $fs1, $fa0277; LA32-NEXT: fmov.s $fa0, $fs0278; LA32-NEXT: bl __extendhfsf2279; LA32-NEXT: fmul.s $fa0, $fa0, $fs1280; LA32-NEXT: bl __truncsfhf2281; LA32-NEXT: movfr2gr.s $a0, $fa0282; LA32-NEXT: lu12i.w $a1, -16283; LA32-NEXT: or $a0, $a0, $a1284; LA32-NEXT: movgr2fr.w $fa0, $a0285; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload286; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload287; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload288; LA32-NEXT: addi.w $sp, $sp, 32289; LA32-NEXT: ret290;291; LA64-LABEL: test_fmul_reg:292; LA64: # %bb.0:293; LA64-NEXT: addi.d $sp, $sp, -32294; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill295; LA64-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill296; LA64-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill297; LA64-NEXT: fmov.s $fs0, $fa0298; LA64-NEXT: fmov.s $fa0, $fa1299; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)300; LA64-NEXT: jirl $ra, $ra, 0301; LA64-NEXT: fmov.s $fs1, $fa0302; LA64-NEXT: fmov.s $fa0, $fs0303; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)304; LA64-NEXT: jirl $ra, $ra, 0305; LA64-NEXT: fmul.s $fa0, $fa0, $fs1306; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)307; LA64-NEXT: jirl $ra, $ra, 0308; LA64-NEXT: movfr2gr.s $a0, $fa0309; LA64-NEXT: lu12i.w $a1, -16310; LA64-NEXT: or $a0, $a0, $a1311; LA64-NEXT: movgr2fr.w $fa0, $a0312; LA64-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload313; LA64-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload314; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload315; LA64-NEXT: addi.d $sp, $sp, 32316; LA64-NEXT: ret317 %r = fmul half %a, %b318 ret half %r319}320 321define void @test_fmul_mem(ptr %p, ptr %q) nounwind {322; LA32-LABEL: test_fmul_mem:323; LA32: # %bb.0:324; LA32-NEXT: addi.w $sp, $sp, -32325; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill326; LA32-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill327; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill328; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill329; LA32-NEXT: move $fp, $a0330; LA32-NEXT: ld.hu $a0, $a0, 0331; LA32-NEXT: ld.hu $a1, $a1, 0332; LA32-NEXT: movgr2fr.w $fs0, $a0333; LA32-NEXT: movgr2fr.w $fa0, $a1334; LA32-NEXT: bl __extendhfsf2335; LA32-NEXT: fmov.s $fs1, $fa0336; LA32-NEXT: fmov.s $fa0, $fs0337; LA32-NEXT: bl __extendhfsf2338; LA32-NEXT: fmul.s $fa0, $fa0, $fs1339; LA32-NEXT: bl __truncsfhf2340; LA32-NEXT: movfr2gr.s $a0, $fa0341; LA32-NEXT: st.h $a0, $fp, 0342; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload343; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload344; LA32-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload345; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload346; LA32-NEXT: addi.w $sp, $sp, 32347; LA32-NEXT: ret348;349; LA64-LABEL: test_fmul_mem:350; LA64: # %bb.0:351; LA64-NEXT: addi.d $sp, $sp, -32352; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill353; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill354; LA64-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill355; LA64-NEXT: fst.d $fs0, $sp, 0 # 8-byte Folded Spill356; LA64-NEXT: move $fp, $a0357; LA64-NEXT: ld.hu $s0, $a0, 0358; LA64-NEXT: ld.hu $a0, $a1, 0359; LA64-NEXT: movgr2fr.w $fa0, $a0360; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)361; LA64-NEXT: jirl $ra, $ra, 0362; LA64-NEXT: fmov.s $fs0, $fa0363; LA64-NEXT: movgr2fr.w $fa0, $s0364; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)365; LA64-NEXT: jirl $ra, $ra, 0366; LA64-NEXT: fmul.s $fa0, $fa0, $fs0367; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)368; LA64-NEXT: jirl $ra, $ra, 0369; LA64-NEXT: movfr2gr.s $a0, $fa0370; LA64-NEXT: st.h $a0, $fp, 0371; LA64-NEXT: fld.d $fs0, $sp, 0 # 8-byte Folded Reload372; LA64-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload373; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload374; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload375; LA64-NEXT: addi.d $sp, $sp, 32376; LA64-NEXT: ret377 %a = load half, ptr %p378 %b = load half, ptr %q379 %r = fmul half %a, %b380 store half %r, ptr %p381 ret void382}383 384define half @freeze_half_undef() nounwind {385; LA32-LABEL: freeze_half_undef:386; LA32: # %bb.0:387; LA32-NEXT: addi.w $sp, $sp, -16388; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill389; LA32-NEXT: movgr2fr.w $fa0, $zero390; LA32-NEXT: bl __truncsfhf2391; LA32-NEXT: bl __extendhfsf2392; LA32-NEXT: fadd.s $fa0, $fa0, $fa0393; LA32-NEXT: bl __truncsfhf2394; LA32-NEXT: movfr2gr.s $a0, $fa0395; LA32-NEXT: lu12i.w $a1, -16396; LA32-NEXT: or $a0, $a0, $a1397; LA32-NEXT: movgr2fr.w $fa0, $a0398; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload399; LA32-NEXT: addi.w $sp, $sp, 16400; LA32-NEXT: ret401;402; LA64-LABEL: freeze_half_undef:403; LA64: # %bb.0:404; LA64-NEXT: addi.d $sp, $sp, -16405; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill406; LA64-NEXT: movgr2fr.w $fa0, $zero407; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)408; LA64-NEXT: jirl $ra, $ra, 0409; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)410; LA64-NEXT: jirl $ra, $ra, 0411; LA64-NEXT: fadd.s $fa0, $fa0, $fa0412; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)413; LA64-NEXT: jirl $ra, $ra, 0414; LA64-NEXT: movfr2gr.s $a0, $fa0415; LA64-NEXT: lu12i.w $a1, -16416; LA64-NEXT: or $a0, $a0, $a1417; LA64-NEXT: movgr2fr.w $fa0, $a0418; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload419; LA64-NEXT: addi.d $sp, $sp, 16420; LA64-NEXT: ret421 %y1 = freeze half undef422 %t1 = fadd half %y1, %y1423 ret half %t1424}425 426define half @freeze_half_poison(half %maybe.poison) nounwind {427; LA32-LABEL: freeze_half_poison:428; LA32: # %bb.0:429; LA32-NEXT: addi.w $sp, $sp, -16430; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill431; LA32-NEXT: bl __extendhfsf2432; LA32-NEXT: fadd.s $fa0, $fa0, $fa0433; LA32-NEXT: bl __truncsfhf2434; LA32-NEXT: movfr2gr.s $a0, $fa0435; LA32-NEXT: lu12i.w $a1, -16436; LA32-NEXT: or $a0, $a0, $a1437; LA32-NEXT: movgr2fr.w $fa0, $a0438; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload439; LA32-NEXT: addi.w $sp, $sp, 16440; LA32-NEXT: ret441;442; LA64-LABEL: freeze_half_poison:443; LA64: # %bb.0:444; LA64-NEXT: addi.d $sp, $sp, -16445; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill446; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)447; LA64-NEXT: jirl $ra, $ra, 0448; LA64-NEXT: fadd.s $fa0, $fa0, $fa0449; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)450; LA64-NEXT: jirl $ra, $ra, 0451; LA64-NEXT: movfr2gr.s $a0, $fa0452; LA64-NEXT: lu12i.w $a1, -16453; LA64-NEXT: or $a0, $a0, $a1454; LA64-NEXT: movgr2fr.w $fa0, $a0455; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload456; LA64-NEXT: addi.d $sp, $sp, 16457; LA64-NEXT: ret458 %y1 = freeze half %maybe.poison459 %t1 = fadd half %y1, %y1460 ret half %t1461}462 463define signext i32 @test_half_to_s32(half %a) nounwind {464; LA32-LABEL: test_half_to_s32:465; LA32: # %bb.0: # %entry466; LA32-NEXT: addi.w $sp, $sp, -16467; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill468; LA32-NEXT: bl __extendhfsf2469; LA32-NEXT: ftintrz.w.s $fa0, $fa0470; LA32-NEXT: movfr2gr.s $a0, $fa0471; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload472; LA32-NEXT: addi.w $sp, $sp, 16473; LA32-NEXT: ret474;475; LA64-LABEL: test_half_to_s32:476; LA64: # %bb.0: # %entry477; LA64-NEXT: addi.d $sp, $sp, -16478; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill479; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)480; LA64-NEXT: jirl $ra, $ra, 0481; LA64-NEXT: ftintrz.l.s $fa0, $fa0482; LA64-NEXT: movfr2gr.d $a0, $fa0483; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload484; LA64-NEXT: addi.d $sp, $sp, 16485; LA64-NEXT: ret486entry:487 %conv = fptosi half %a to i32488 ret i32 %conv489}490 491define zeroext i32 @test_half_to_s32_u32(half %a) nounwind {492; LA32-LABEL: test_half_to_s32_u32:493; LA32: # %bb.0: # %entry494; LA32-NEXT: addi.w $sp, $sp, -16495; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill496; LA32-NEXT: bl __extendhfsf2497; LA32-NEXT: ftintrz.w.s $fa0, $fa0498; LA32-NEXT: movfr2gr.s $a0, $fa0499; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload500; LA32-NEXT: addi.w $sp, $sp, 16501; LA32-NEXT: ret502;503; LA64-LABEL: test_half_to_s32_u32:504; LA64: # %bb.0: # %entry505; LA64-NEXT: addi.d $sp, $sp, -16506; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill507; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)508; LA64-NEXT: jirl $ra, $ra, 0509; LA64-NEXT: ftintrz.l.s $fa0, $fa0510; LA64-NEXT: movfr2gr.d $a0, $fa0511; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0512; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload513; LA64-NEXT: addi.d $sp, $sp, 16514; LA64-NEXT: ret515entry:516 %conv = fptosi half %a to i32517 ret i32 %conv518}519 520define i64 @test_half_to_i64(half %a) nounwind {521; LA32-LABEL: test_half_to_i64:522; LA32: # %bb.0: # %entry523; LA32-NEXT: addi.w $sp, $sp, -16524; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill525; LA32-NEXT: bl __extendhfsf2526; LA32-NEXT: bl __fixsfdi527; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload528; LA32-NEXT: addi.w $sp, $sp, 16529; LA32-NEXT: ret530;531; LA64-LABEL: test_half_to_i64:532; LA64: # %bb.0: # %entry533; LA64-NEXT: addi.d $sp, $sp, -16534; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill535; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)536; LA64-NEXT: jirl $ra, $ra, 0537; LA64-NEXT: ftintrz.l.s $fa0, $fa0538; LA64-NEXT: movfr2gr.d $a0, $fa0539; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload540; LA64-NEXT: addi.d $sp, $sp, 16541; LA64-NEXT: ret542entry:543 %conv = fptosi half %a to i64544 ret i64 %conv545}546