362 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 -check-prefix=LA32 %s3; RUN: llc -mtriple=loongarch64 -mattr=+d < %s | FileCheck -check-prefix=LA64 %s4 5define half @exp10_f16(half %x) #0 {6; LA32-LABEL: exp10_f16:7; LA32: # %bb.0:8; LA32-NEXT: addi.w $sp, $sp, -169; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill10; LA32-NEXT: bl __extendhfsf211; LA32-NEXT: bl exp10f12; LA32-NEXT: bl __truncsfhf213; LA32-NEXT: movfr2gr.s $a0, $fa014; LA32-NEXT: lu12i.w $a1, -1615; LA32-NEXT: or $a0, $a0, $a116; LA32-NEXT: movgr2fr.w $fa0, $a017; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload18; LA32-NEXT: addi.w $sp, $sp, 1619; LA32-NEXT: ret20;21; LA64-LABEL: exp10_f16:22; LA64: # %bb.0:23; LA64-NEXT: addi.d $sp, $sp, -1624; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill25; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)26; LA64-NEXT: jirl $ra, $ra, 027; LA64-NEXT: pcaddu18i $ra, %call36(exp10f)28; LA64-NEXT: jirl $ra, $ra, 029; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)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 %r = call half @llvm.exp10.f16(half %x)39 ret half %r40}41 42define <2 x half> @exp10_v2f16(<2 x half> %x) #0 {43; LA32-LABEL: exp10_v2f16:44; LA32: # %bb.0:45; LA32-NEXT: addi.w $sp, $sp, -1646; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill47; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill48; LA32-NEXT: fst.d $fs0, $sp, 0 # 8-byte Folded Spill49; LA32-NEXT: movgr2fr.w $fs0, $a150; LA32-NEXT: movgr2fr.w $fa0, $a051; LA32-NEXT: bl __extendhfsf252; LA32-NEXT: bl exp10f53; LA32-NEXT: bl __truncsfhf254; LA32-NEXT: movfr2gr.s $fp, $fa055; LA32-NEXT: fmov.s $fa0, $fs056; LA32-NEXT: bl __extendhfsf257; LA32-NEXT: bl exp10f58; LA32-NEXT: bl __truncsfhf259; LA32-NEXT: movfr2gr.s $a1, $fa060; LA32-NEXT: move $a0, $fp61; LA32-NEXT: fld.d $fs0, $sp, 0 # 8-byte Folded Reload62; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload63; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload64; LA32-NEXT: addi.w $sp, $sp, 1665; LA32-NEXT: ret66;67; LA64-LABEL: exp10_v2f16:68; LA64: # %bb.0:69; LA64-NEXT: addi.d $sp, $sp, -3270; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill71; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill72; LA64-NEXT: move $fp, $a073; LA64-NEXT: movgr2fr.w $fa0, $a174; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)75; LA64-NEXT: jirl $ra, $ra, 076; LA64-NEXT: pcaddu18i $ra, %call36(exp10f)77; LA64-NEXT: jirl $ra, $ra, 078; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)79; LA64-NEXT: jirl $ra, $ra, 080; LA64-NEXT: movfr2gr.s $a0, $fa081; LA64-NEXT: st.h $a0, $sp, 282; LA64-NEXT: movgr2fr.w $fa0, $fp83; LA64-NEXT: pcaddu18i $ra, %call36(__extendhfsf2)84; LA64-NEXT: jirl $ra, $ra, 085; LA64-NEXT: pcaddu18i $ra, %call36(exp10f)86; LA64-NEXT: jirl $ra, $ra, 087; LA64-NEXT: pcaddu18i $ra, %call36(__truncsfhf2)88; LA64-NEXT: jirl $ra, $ra, 089; LA64-NEXT: movfr2gr.s $a0, $fa090; LA64-NEXT: st.h $a0, $sp, 091; LA64-NEXT: vld $vr0, $sp, 092; LA64-NEXT: vpickve2gr.h $a0, $vr0, 093; LA64-NEXT: vpickve2gr.h $a1, $vr0, 194; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload95; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload96; LA64-NEXT: addi.d $sp, $sp, 3297; LA64-NEXT: ret98 %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x)99 ret <2 x half> %r100}101 102define float @exp10_f32(float %x) #0 {103; LA32-LABEL: exp10_f32:104; LA32: # %bb.0:105; LA32-NEXT: b exp10f106;107; LA64-LABEL: exp10_f32:108; LA64: # %bb.0:109; LA64-NEXT: pcaddu18i $t8, %call36(exp10f)110; LA64-NEXT: jr $t8111 %r = call float @llvm.exp10.f32(float %x)112 ret float %r113}114 115define <2 x float> @exp10_v2f32(<2 x float> %x) #0 {116; LA32-LABEL: exp10_v2f32:117; LA32: # %bb.0:118; LA32-NEXT: addi.w $sp, $sp, -32119; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill120; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill121; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill122; LA32-NEXT: fmov.s $fs0, $fa1123; LA32-NEXT: bl exp10f124; LA32-NEXT: fmov.s $fs1, $fa0125; LA32-NEXT: fmov.s $fa0, $fs0126; LA32-NEXT: bl exp10f127; LA32-NEXT: fmov.s $fa1, $fa0128; LA32-NEXT: fmov.s $fa0, $fs1129; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload130; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload131; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload132; LA32-NEXT: addi.w $sp, $sp, 32133; LA32-NEXT: ret134;135; LA64-LABEL: exp10_v2f32:136; LA64: # %bb.0:137; LA64-NEXT: addi.d $sp, $sp, -48138; LA64-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill139; LA64-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill140; LA64-NEXT: vreplvei.w $vr0, $vr0, 1141; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr0142; LA64-NEXT: pcaddu18i $ra, %call36(exp10f)143; LA64-NEXT: jirl $ra, $ra, 0144; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0145; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill146; LA64-NEXT: vld $vr0, $sp, 0 # 16-byte Folded Reload147; LA64-NEXT: vreplvei.w $vr0, $vr0, 0148; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr0149; LA64-NEXT: pcaddu18i $ra, %call36(exp10f)150; LA64-NEXT: jirl $ra, $ra, 0151; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0152; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload153; LA64-NEXT: vextrins.w $vr0, $vr1, 16154; LA64-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload155; LA64-NEXT: addi.d $sp, $sp, 48156; LA64-NEXT: ret157 %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x)158 ret <2 x float> %r159}160 161define double @exp10_f64(double %x) #0 {162; LA32-LABEL: exp10_f64:163; LA32: # %bb.0:164; LA32-NEXT: b exp10165;166; LA64-LABEL: exp10_f64:167; LA64: # %bb.0:168; LA64-NEXT: pcaddu18i $t8, %call36(exp10)169; LA64-NEXT: jr $t8170 %r = call double @llvm.exp10.f64(double %x)171 ret double %r172}173 174define <2 x double> @exp10_v2f64(<2 x double> %x) #0 {175; LA32-LABEL: exp10_v2f64:176; LA32: # %bb.0:177; LA32-NEXT: addi.w $sp, $sp, -32178; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill179; LA32-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill180; LA32-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill181; LA32-NEXT: fmov.d $fs0, $fa1182; LA32-NEXT: bl exp10183; LA32-NEXT: fmov.d $fs1, $fa0184; LA32-NEXT: fmov.d $fa0, $fs0185; LA32-NEXT: bl exp10186; LA32-NEXT: fmov.d $fa1, $fa0187; LA32-NEXT: fmov.d $fa0, $fs1188; LA32-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload189; LA32-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload190; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload191; LA32-NEXT: addi.w $sp, $sp, 32192; LA32-NEXT: ret193;194; LA64-LABEL: exp10_v2f64:195; LA64: # %bb.0:196; LA64-NEXT: addi.d $sp, $sp, -48197; LA64-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill198; LA64-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill199; LA64-NEXT: vreplvei.d $vr0, $vr0, 1200; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0201; LA64-NEXT: pcaddu18i $ra, %call36(exp10)202; LA64-NEXT: jirl $ra, $ra, 0203; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0204; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill205; LA64-NEXT: vld $vr0, $sp, 0 # 16-byte Folded Reload206; LA64-NEXT: vreplvei.d $vr0, $vr0, 0207; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0208; LA64-NEXT: pcaddu18i $ra, %call36(exp10)209; LA64-NEXT: jirl $ra, $ra, 0210; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0211; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload212; LA64-NEXT: vextrins.d $vr0, $vr1, 16213; LA64-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload214; LA64-NEXT: addi.d $sp, $sp, 48215; LA64-NEXT: ret216 %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x)217 ret <2 x double> %r218}219 220define fp128 @exp10_f128(fp128 %x) #0 {221; LA32-LABEL: exp10_f128:222; LA32: # %bb.0:223; LA32-NEXT: addi.w $sp, $sp, -48224; LA32-NEXT: st.w $ra, $sp, 44 # 4-byte Folded Spill225; LA32-NEXT: st.w $fp, $sp, 40 # 4-byte Folded Spill226; LA32-NEXT: ld.w $a2, $a1, 0227; LA32-NEXT: ld.w $a3, $a1, 4228; LA32-NEXT: ld.w $a4, $a1, 8229; LA32-NEXT: ld.w $a1, $a1, 12230; LA32-NEXT: move $fp, $a0231; LA32-NEXT: st.w $a1, $sp, 20232; LA32-NEXT: st.w $a4, $sp, 16233; LA32-NEXT: st.w $a3, $sp, 12234; LA32-NEXT: addi.w $a0, $sp, 24235; LA32-NEXT: addi.w $a1, $sp, 8236; LA32-NEXT: st.w $a2, $sp, 8237; LA32-NEXT: bl exp10l238; LA32-NEXT: ld.w $a0, $sp, 36239; LA32-NEXT: ld.w $a1, $sp, 32240; LA32-NEXT: ld.w $a2, $sp, 28241; LA32-NEXT: ld.w $a3, $sp, 24242; LA32-NEXT: st.w $a0, $fp, 12243; LA32-NEXT: st.w $a1, $fp, 8244; LA32-NEXT: st.w $a2, $fp, 4245; LA32-NEXT: st.w $a3, $fp, 0246; LA32-NEXT: ld.w $fp, $sp, 40 # 4-byte Folded Reload247; LA32-NEXT: ld.w $ra, $sp, 44 # 4-byte Folded Reload248; LA32-NEXT: addi.w $sp, $sp, 48249; LA32-NEXT: ret250;251; LA64-LABEL: exp10_f128:252; LA64: # %bb.0:253; LA64-NEXT: addi.d $sp, $sp, -16254; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill255; LA64-NEXT: pcaddu18i $ra, %call36(exp10l)256; LA64-NEXT: jirl $ra, $ra, 0257; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload258; LA64-NEXT: addi.d $sp, $sp, 16259; LA64-NEXT: ret260 %r = call fp128 @llvm.exp10.f128(fp128 %x)261 ret fp128 %r262}263 264define <2 x fp128> @exp10_v2f128(<2 x fp128> %x) #0 {265; LA32-LABEL: exp10_v2f128:266; LA32: # %bb.0:267; LA32-NEXT: addi.w $sp, $sp, -96268; LA32-NEXT: st.w $ra, $sp, 92 # 4-byte Folded Spill269; LA32-NEXT: st.w $fp, $sp, 88 # 4-byte Folded Spill270; LA32-NEXT: st.w $s0, $sp, 84 # 4-byte Folded Spill271; LA32-NEXT: st.w $s1, $sp, 80 # 4-byte Folded Spill272; LA32-NEXT: st.w $s2, $sp, 76 # 4-byte Folded Spill273; LA32-NEXT: st.w $s3, $sp, 72 # 4-byte Folded Spill274; LA32-NEXT: ld.w $s0, $a1, 16275; LA32-NEXT: ld.w $s1, $a1, 20276; LA32-NEXT: ld.w $s2, $a1, 24277; LA32-NEXT: ld.w $s3, $a1, 28278; LA32-NEXT: ld.w $a2, $a1, 0279; LA32-NEXT: ld.w $a3, $a1, 4280; LA32-NEXT: ld.w $a4, $a1, 8281; LA32-NEXT: ld.w $a1, $a1, 12282; LA32-NEXT: move $fp, $a0283; LA32-NEXT: st.w $a1, $sp, 20284; LA32-NEXT: st.w $a4, $sp, 16285; LA32-NEXT: st.w $a3, $sp, 12286; LA32-NEXT: addi.w $a0, $sp, 24287; LA32-NEXT: addi.w $a1, $sp, 8288; LA32-NEXT: st.w $a2, $sp, 8289; LA32-NEXT: bl exp10l290; LA32-NEXT: st.w $s3, $sp, 52291; LA32-NEXT: st.w $s2, $sp, 48292; LA32-NEXT: st.w $s1, $sp, 44293; LA32-NEXT: addi.w $a0, $sp, 56294; LA32-NEXT: addi.w $a1, $sp, 40295; LA32-NEXT: st.w $s0, $sp, 40296; LA32-NEXT: bl exp10l297; LA32-NEXT: ld.w $a0, $sp, 24298; LA32-NEXT: ld.w $a1, $sp, 28299; LA32-NEXT: ld.w $a2, $sp, 32300; LA32-NEXT: ld.w $a3, $sp, 36301; LA32-NEXT: ld.w $a4, $sp, 68302; LA32-NEXT: ld.w $a5, $sp, 64303; LA32-NEXT: ld.w $a6, $sp, 60304; LA32-NEXT: ld.w $a7, $sp, 56305; LA32-NEXT: st.w $a4, $fp, 28306; LA32-NEXT: st.w $a5, $fp, 24307; LA32-NEXT: st.w $a6, $fp, 20308; LA32-NEXT: st.w $a7, $fp, 16309; LA32-NEXT: st.w $a3, $fp, 12310; LA32-NEXT: st.w $a2, $fp, 8311; LA32-NEXT: st.w $a1, $fp, 4312; LA32-NEXT: st.w $a0, $fp, 0313; LA32-NEXT: ld.w $s3, $sp, 72 # 4-byte Folded Reload314; LA32-NEXT: ld.w $s2, $sp, 76 # 4-byte Folded Reload315; LA32-NEXT: ld.w $s1, $sp, 80 # 4-byte Folded Reload316; LA32-NEXT: ld.w $s0, $sp, 84 # 4-byte Folded Reload317; LA32-NEXT: ld.w $fp, $sp, 88 # 4-byte Folded Reload318; LA32-NEXT: ld.w $ra, $sp, 92 # 4-byte Folded Reload319; LA32-NEXT: addi.w $sp, $sp, 96320; LA32-NEXT: ret321;322; LA64-LABEL: exp10_v2f128:323; LA64: # %bb.0:324; LA64-NEXT: addi.d $sp, $sp, -48325; LA64-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill326; LA64-NEXT: st.d $fp, $sp, 32 # 8-byte Folded Spill327; LA64-NEXT: st.d $s0, $sp, 24 # 8-byte Folded Spill328; LA64-NEXT: st.d $s1, $sp, 16 # 8-byte Folded Spill329; LA64-NEXT: st.d $s2, $sp, 8 # 8-byte Folded Spill330; LA64-NEXT: st.d $s3, $sp, 0 # 8-byte Folded Spill331; LA64-NEXT: ld.d $fp, $a1, 16332; LA64-NEXT: ld.d $s0, $a1, 24333; LA64-NEXT: ld.d $a2, $a1, 0334; LA64-NEXT: ld.d $a1, $a1, 8335; LA64-NEXT: move $s1, $a0336; LA64-NEXT: move $a0, $a2337; LA64-NEXT: pcaddu18i $ra, %call36(exp10l)338; LA64-NEXT: jirl $ra, $ra, 0339; LA64-NEXT: move $s2, $a0340; LA64-NEXT: move $s3, $a1341; LA64-NEXT: move $a0, $fp342; LA64-NEXT: move $a1, $s0343; LA64-NEXT: pcaddu18i $ra, %call36(exp10l)344; LA64-NEXT: jirl $ra, $ra, 0345; LA64-NEXT: st.d $a1, $s1, 24346; LA64-NEXT: st.d $a0, $s1, 16347; LA64-NEXT: st.d $s3, $s1, 8348; LA64-NEXT: st.d $s2, $s1, 0349; LA64-NEXT: ld.d $s3, $sp, 0 # 8-byte Folded Reload350; LA64-NEXT: ld.d $s2, $sp, 8 # 8-byte Folded Reload351; LA64-NEXT: ld.d $s1, $sp, 16 # 8-byte Folded Reload352; LA64-NEXT: ld.d $s0, $sp, 24 # 8-byte Folded Reload353; LA64-NEXT: ld.d $fp, $sp, 32 # 8-byte Folded Reload354; LA64-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload355; LA64-NEXT: addi.d $sp, $sp, 48356; LA64-NEXT: ret357 %r = call <2 x fp128> @llvm.exp10.v2f128(<2 x fp128> %x)358 ret <2 x fp128> %r359}360 361attributes #0 = { nounwind }362