102 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc --mtriple=loongarch64 --target-abi=lp64s --mattr=-f < %s | FileCheck %s3 4;; This file contains specific tests for the lp64s ABI.5 6define i64 @callee_float_in_regs(i64 %a, float %b) nounwind {7; CHECK-LABEL: callee_float_in_regs:8; CHECK: # %bb.0:9; CHECK-NEXT: addi.d $sp, $sp, -1610; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill11; CHECK-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill12; CHECK-NEXT: move $fp, $a013; CHECK-NEXT: move $a0, $a114; CHECK-NEXT: pcaddu18i $ra, %call36(__fixsfdi)15; CHECK-NEXT: jirl $ra, $ra, 016; CHECK-NEXT: add.d $a0, $fp, $a017; CHECK-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload18; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload19; CHECK-NEXT: addi.d $sp, $sp, 1620; CHECK-NEXT: ret21 %b_fptosi = fptosi float %b to i6422 %1 = add i64 %a, %b_fptosi23 ret i64 %124}25 26define i64 @caller_float_in_regs() nounwind {27; CHECK-LABEL: caller_float_in_regs:28; CHECK: # %bb.0:29; CHECK-NEXT: addi.d $sp, $sp, -1630; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill31; CHECK-NEXT: lu12i.w $a1, 26214432; CHECK-NEXT: ori $a0, $zero, 133; CHECK-NEXT: pcaddu18i $ra, %call36(callee_float_in_regs)34; CHECK-NEXT: jirl $ra, $ra, 035; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload36; CHECK-NEXT: addi.d $sp, $sp, 1637; CHECK-NEXT: ret38 %1 = call i64 @callee_float_in_regs(i64 1, float 2.0)39 ret i64 %140}41 42define i64 @callee_float_on_stack(i128 %a, i128 %b, i128 %c, i128 %d, float %e) nounwind {43; CHECK-LABEL: callee_float_on_stack:44; CHECK: # %bb.0:45; CHECK-NEXT: ld.w $a0, $sp, 046; CHECK-NEXT: ret47 %1 = trunc i128 %d to i6448 %2 = bitcast float %e to i3249 %3 = sext i32 %2 to i6450 %4 = add i64 %1, %351 ret i64 %352}53 54define i64 @caller_float_on_stack() nounwind {55; CHECK-LABEL: caller_float_on_stack:56; CHECK: # %bb.0:57; CHECK-NEXT: addi.d $sp, $sp, -1658; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill59; CHECK-NEXT: lu12i.w $a1, 26470460; CHECK-NEXT: ori $a0, $zero, 161; CHECK-NEXT: ori $a2, $zero, 262; CHECK-NEXT: ori $a4, $zero, 363; CHECK-NEXT: ori $a6, $zero, 464; CHECK-NEXT: st.d $a1, $sp, 065; CHECK-NEXT: move $a1, $zero66; CHECK-NEXT: move $a3, $zero67; CHECK-NEXT: move $a5, $zero68; CHECK-NEXT: move $a7, $zero69; CHECK-NEXT: pcaddu18i $ra, %call36(callee_float_on_stack)70; CHECK-NEXT: jirl $ra, $ra, 071; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload72; CHECK-NEXT: addi.d $sp, $sp, 1673; CHECK-NEXT: ret74 %1 = call i64 @callee_float_on_stack(i128 1, i128 2, i128 3, i128 4, float 5.0)75 ret i64 %176}77 78define float @callee_tiny_scalar_ret() nounwind {79; CHECK-LABEL: callee_tiny_scalar_ret:80; CHECK: # %bb.0:81; CHECK-NEXT: lu12i.w $a0, 26009682; CHECK-NEXT: ret83 ret float 1.084}85 86define i64 @caller_tiny_scalar_ret() nounwind {87; CHECK-LABEL: caller_tiny_scalar_ret:88; CHECK: # %bb.0:89; CHECK-NEXT: addi.d $sp, $sp, -1690; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill91; CHECK-NEXT: pcaddu18i $ra, %call36(callee_tiny_scalar_ret)92; CHECK-NEXT: jirl $ra, $ra, 093; CHECK-NEXT: addi.w $a0, $a0, 094; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload95; CHECK-NEXT: addi.d $sp, $sp, 1696; CHECK-NEXT: ret97 %1 = call float @callee_tiny_scalar_ret()98 %2 = bitcast float %1 to i3299 %3 = sext i32 %2 to i64100 ret i64 %3101}102