1; RUN: llc --mtriple=loongarch32 < %s | FileCheck --check-prefix=LA32 %s 2; RUN: llc --mtriple=loongarch64 < %s | FileCheck --check-prefix=LA64 %s 3 4declare i32 @external_function(i32) 5 6define i32 @test_call_external(i32 %a) nounwind { 7; LA32-LABEL: test_call_external: 8; LA32: # %bb.0: 9; LA32-NEXT: addi.w $sp, $sp, -16 10; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 11; LA32-NEXT: bl external_function 12; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 13; LA32-NEXT: addi.w $sp, $sp, 16 14; LA32-NEXT: jirl $zero, $ra, 0 15; 16; LA64-LABEL: test_call_external: 17; LA64: # %bb.0: 18; LA64-NEXT: addi.d $sp, $sp, -16 19; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 20; LA64-NEXT: bl external_function 21; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 22; LA64-NEXT: addi.d $sp, $sp, 16 23; LA64-NEXT: jirl $zero, $ra, 0 24 %1 = call i32 @external_function(i32 %a) 25 ret i32 %1 26} 27 28define i32 @defined_function(i32 %a) nounwind { 29; LA32-LABEL: defined_function: 30; LA32: # %bb.0: 31; LA32-NEXT: addi.w $a0, $a0, 1 32; LA32-NEXT: jirl $zero, $ra, 0 33; 34; LA64-LABEL: defined_function: 35; LA64: # %bb.0: 36; LA64-NEXT: addi.d $a0, $a0, 1 37; LA64-NEXT: jirl $zero, $ra, 0 38 %1 = add i32 %a, 1 39 ret i32 %1 40} 41 42define i32 @test_call_defined(i32 %a) nounwind { 43; LA32-LABEL: test_call_defined: 44; LA32: # %bb.0: 45; LA32-NEXT: addi.w $sp, $sp, -16 46; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 47; LA32-NEXT: bl defined_function 48; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 49; LA32-NEXT: addi.w $sp, $sp, 16 50; LA32-NEXT: jirl $zero, $ra, 0 51; 52; LA64-LABEL: test_call_defined: 53; LA64: # %bb.0: 54; LA64-NEXT: addi.d $sp, $sp, -16 55; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 56; LA64-NEXT: bl defined_function 57; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 58; LA64-NEXT: addi.d $sp, $sp, 16 59; LA64-NEXT: jirl $zero, $ra, 0 60 %1 = call i32 @defined_function(i32 %a) nounwind 61 ret i32 %1 62} 63 64define i32 @test_call_indirect(ptr %a, i32 %b) nounwind { 65; LA32-LABEL: test_call_indirect: 66; LA32: # %bb.0: 67; LA32-NEXT: addi.w $sp, $sp, -16 68; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 69; LA32-NEXT: move $a2, $a0 70; LA32-NEXT: move $a0, $a1 71; LA32-NEXT: jirl $ra, $a2, 0 72; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 73; LA32-NEXT: addi.w $sp, $sp, 16 74; LA32-NEXT: jirl $zero, $ra, 0 75; 76; LA64-LABEL: test_call_indirect: 77; LA64: # %bb.0: 78; LA64-NEXT: addi.d $sp, $sp, -16 79; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 80; LA64-NEXT: move $a2, $a0 81; LA64-NEXT: move $a0, $a1 82; LA64-NEXT: jirl $ra, $a2, 0 83; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 84; LA64-NEXT: addi.d $sp, $sp, 16 85; LA64-NEXT: jirl $zero, $ra, 0 86 %1 = call i32 %a(i32 %b) 87 ret i32 %1 88} 89