197 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+d --target-abi=ilp32d < %s \3; RUN: | FileCheck %s4 5;; This file contains specific tests for the ilp32d ABI.6 7;; Check pass floating-point arguments whith FPRs.8 9define i32 @callee_float_in_fpr(i32 %a, float %b, double %c) nounwind {10; CHECK-LABEL: callee_float_in_fpr:11; CHECK: # %bb.0:12; CHECK-NEXT: ftintrz.w.s $fa0, $fa013; CHECK-NEXT: movfr2gr.s $a1, $fa014; CHECK-NEXT: ftintrz.w.d $fa0, $fa115; CHECK-NEXT: movfr2gr.s $a2, $fa016; CHECK-NEXT: add.w $a0, $a0, $a117; CHECK-NEXT: add.w $a0, $a0, $a218; CHECK-NEXT: ret19 %b_fptosi = fptosi float %b to i3220 %c_fptosi = fptosi double %c to i3221 %1 = add i32 %a, %b_fptosi22 %2 = add i32 %1, %c_fptosi23 ret i32 %224}25 26define i32 @caller_float_in_fpr() nounwind {27; CHECK-LABEL: caller_float_in_fpr:28; CHECK: # %bb.0:29; CHECK-NEXT: addi.w $sp, $sp, -1630; CHECK-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill31; CHECK-NEXT: movgr2fr.w $fa1, $zero32; CHECK-NEXT: movgr2frh.w $fa1, $zero33; CHECK-NEXT: movgr2fr.w $fa0, $zero34; CHECK-NEXT: ori $a0, $zero, 135; CHECK-NEXT: bl callee_float_in_fpr36; CHECK-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload37; CHECK-NEXT: addi.w $sp, $sp, 1638; CHECK-NEXT: ret39 %1 = call i32 @callee_float_in_fpr(i32 1, float 0.0, double 0.0)40 ret i32 %141}42 43;; Check that the GPR is used once the FPRs are exhausted.44 45;; Must keep define on a single line due to an update_llc_test_checks.py limitation.46define i32 @callee_double_in_gpr_exhausted_fprs(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i) nounwind {47; CHECK-LABEL: callee_double_in_gpr_exhausted_fprs:48; CHECK: # %bb.0:49; CHECK-NEXT: movgr2fr.w $fa0, $a050; CHECK-NEXT: movgr2frh.w $fa0, $a151; CHECK-NEXT: ftintrz.w.d $fa1, $fa752; CHECK-NEXT: movfr2gr.s $a0, $fa153; CHECK-NEXT: ftintrz.w.d $fa0, $fa054; CHECK-NEXT: movfr2gr.s $a1, $fa055; CHECK-NEXT: add.w $a0, $a0, $a156; CHECK-NEXT: ret57 %h_fptosi = fptosi double %h to i3258 %i_fptosi = fptosi double %i to i3259 %1 = add i32 %h_fptosi, %i_fptosi60 ret i32 %161}62 63define i32 @caller_double_in_gpr_exhausted_fprs() nounwind {64; CHECK-LABEL: caller_double_in_gpr_exhausted_fprs:65; CHECK: # %bb.0:66; CHECK-NEXT: addi.w $sp, $sp, -1667; CHECK-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill68; CHECK-NEXT: movgr2fr.w $fa7, $zero69; CHECK-NEXT: lu12i.w $a0, 26188870; CHECK-NEXT: fmov.d $fa0, $fa771; CHECK-NEXT: movgr2frh.w $fa0, $a072; CHECK-NEXT: lu12i.w $a0, 26214473; CHECK-NEXT: fmov.d $fa1, $fa774; CHECK-NEXT: movgr2frh.w $fa1, $a075; CHECK-NEXT: lu12i.w $a0, 26240076; CHECK-NEXT: fmov.d $fa3, $fa777; CHECK-NEXT: movgr2frh.w $fa3, $a078; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0)79; CHECK-NEXT: fld.d $fa2, $a0, %pc_lo12(.LCPI3_0)80; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_1)81; CHECK-NEXT: fld.d $fa4, $a0, %pc_lo12(.LCPI3_1)82; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_2)83; CHECK-NEXT: fld.d $fa5, $a0, %pc_lo12(.LCPI3_2)84; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_3)85; CHECK-NEXT: fld.d $fa6, $a0, %pc_lo12(.LCPI3_3)86; CHECK-NEXT: lu12i.w $a0, 26265687; CHECK-NEXT: movgr2frh.w $fa7, $a088; CHECK-NEXT: lu12i.w $a1, 26268889; CHECK-NEXT: move $a0, $zero90; CHECK-NEXT: bl callee_double_in_gpr_exhausted_fprs91; CHECK-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload92; CHECK-NEXT: addi.w $sp, $sp, 1693; CHECK-NEXT: ret94 %1 = call i32 @callee_double_in_gpr_exhausted_fprs(95 double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0,96 double 7.0, double 8.0, double 9.0)97 ret i32 %198}99 100;; Check that the stack is used once the FPRs and GPRs are both exhausted.101 102;; Must keep define on a single line due to an update_llc_test_checks.py limitation.103define i32 @callee_double_on_stack_exhausted_fprs_gprs(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j, double %k, double %l, double %m, double %n) nounwind {104; CHECK-LABEL: callee_double_on_stack_exhausted_fprs_gprs:105; CHECK: # %bb.0:106; CHECK-NEXT: fld.d $fa0, $sp, 0107; CHECK-NEXT: fld.d $fa1, $sp, 8108; CHECK-NEXT: ftintrz.w.d $fa0, $fa0109; CHECK-NEXT: movfr2gr.s $a0, $fa0110; CHECK-NEXT: ftintrz.w.d $fa0, $fa1111; CHECK-NEXT: movfr2gr.s $a1, $fa0112; CHECK-NEXT: add.w $a0, $a0, $a1113; CHECK-NEXT: ret114 %m_fptosi = fptosi double %m to i32115 %n_fptosi = fptosi double %n to i32116 %1 = add i32 %m_fptosi, %n_fptosi117 ret i32 %1118}119 120define i32 @caller_double_on_stack_exhausted_fprs_gprs() nounwind {121; CHECK-LABEL: caller_double_on_stack_exhausted_fprs_gprs:122; CHECK: # %bb.0:123; CHECK-NEXT: addi.w $sp, $sp, -32124; CHECK-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill125; CHECK-NEXT: lu12i.w $a0, 262816126; CHECK-NEXT: st.w $a0, $sp, 4127; CHECK-NEXT: st.w $zero, $sp, 0128; CHECK-NEXT: lu12i.w $a0, 262848129; CHECK-NEXT: st.w $a0, $sp, 12130; CHECK-NEXT: movgr2fr.w $fa7, $zero131; CHECK-NEXT: lu12i.w $a0, 261888132; CHECK-NEXT: fmov.d $fa0, $fa7133; CHECK-NEXT: movgr2frh.w $fa0, $a0134; CHECK-NEXT: lu12i.w $a0, 262144135; CHECK-NEXT: fmov.d $fa1, $fa7136; CHECK-NEXT: movgr2frh.w $fa1, $a0137; CHECK-NEXT: lu12i.w $a0, 262400138; CHECK-NEXT: fmov.d $fa3, $fa7139; CHECK-NEXT: movgr2frh.w $fa3, $a0140; CHECK-NEXT: lu12i.w $a0, 262656141; CHECK-NEXT: movgr2frh.w $fa7, $a0142; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0)143; CHECK-NEXT: fld.d $fa2, $a0, %pc_lo12(.LCPI5_0)144; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_1)145; CHECK-NEXT: fld.d $fa4, $a0, %pc_lo12(.LCPI5_1)146; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_2)147; CHECK-NEXT: fld.d $fa5, $a0, %pc_lo12(.LCPI5_2)148; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_3)149; CHECK-NEXT: fld.d $fa6, $a0, %pc_lo12(.LCPI5_3)150; CHECK-NEXT: lu12i.w $a1, 262688151; CHECK-NEXT: lu12i.w $a3, 262720152; CHECK-NEXT: lu12i.w $a5, 262752153; CHECK-NEXT: lu12i.w $a7, 262784154; CHECK-NEXT: st.w $zero, $sp, 8155; CHECK-NEXT: move $a0, $zero156; CHECK-NEXT: move $a2, $zero157; CHECK-NEXT: move $a4, $zero158; CHECK-NEXT: move $a6, $zero159; CHECK-NEXT: bl callee_double_on_stack_exhausted_fprs_gprs160; CHECK-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload161; CHECK-NEXT: addi.w $sp, $sp, 32162; CHECK-NEXT: ret163 %1 = call i32 @callee_double_on_stack_exhausted_fprs_gprs(164 double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0,165 double 7.0, double 8.0, double 9.0, double 10.0, double 11.0, double 12.0,166 double 13.0, double 14.0)167 ret i32 %1168}169 170;; Check returning doubles.171 172define double @callee_double_ret() nounwind {173; CHECK-LABEL: callee_double_ret:174; CHECK: # %bb.0:175; CHECK-NEXT: movgr2fr.w $fa0, $zero176; CHECK-NEXT: lu12i.w $a0, 261888177; CHECK-NEXT: movgr2frh.w $fa0, $a0178; CHECK-NEXT: ret179 ret double 1.0180}181 182define i64 @caller_double_ret() nounwind {183; CHECK-LABEL: caller_double_ret:184; CHECK: # %bb.0:185; CHECK-NEXT: addi.w $sp, $sp, -16186; CHECK-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill187; CHECK-NEXT: bl callee_double_ret188; CHECK-NEXT: movfr2gr.s $a0, $fa0189; CHECK-NEXT: movfrh2gr.s $a1, $fa0190; CHECK-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload191; CHECK-NEXT: addi.w $sp, $sp, 16192; CHECK-NEXT: ret193 %1 = call double @callee_double_ret()194 %2 = bitcast double %1 to i64195 ret i64 %2196}197